Repository navigation
Forge fork: strip telemetry, keyboard fixes, Changes view, workspace links, new-chat repo - #3
Merged
Merged
Conversation
- Sentry: drop SDK, gradle plugin, expo plugin, metro wrapper; sentry.ts now local-only log helpers (same API) - PostHog: drop SDK; analytics.ts track() is a no-op - Chatwoot support upload, telemetry consent modal + settings toggle, privacy section removed - "OpenCode Connect" waitlist card removed - Update banner checks kjeldahl/opencode-mobile releases - build.yml: no Sentry/PostHog/Chatwoot secrets, no F-Droid job; release = signed APK only Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CMhKDuSQR5gY2R74cqrY1W
Same approach as the chat composer (dzianisv#201): pad by IME height from keyboardDidShow/Hide. Covers add (quick + advanced) and edit screens. Alternative to upstream dzianisv#193 (adjustPan) / dzianisv#216 (KAV padding, stale-padding risk). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CMhKDuSQR5gY2R74cqrY1W
…ired) from rejected credentials The health probe only sends Authorization when a password is filled in. A 401/403 in that state says nothing about the saved password — the user may simply not have typed it yet — but classify() reported it as "the server rejected your credentials", sending people re-typing a perfectly good password (seen live against a self-hosted server that protects /global/health). - ProbeAttempt gains authProvided, set by probeConnection from the auth it sent - classify(): 401/403 + !authProvided -> new auth-required classification with an "enter the password" message instead of "rejected your credentials" - sentry-noise: auth-required joins the auth-failed drop family (user config) - tests for all four combinations
- sdk: vcs.get, vcs.diff(mode), typed FileDiff - stores/changes: per-dir branch+git diffs, per-session turn diff, 60s cache - app/changes/[id]: 3 tabs, file list w/ +/- counts, pull-to-refresh, refresh on turn end - app/changes/file: fullscreen wrapped diff (DiffRow from DiffView) - chat header chip + SessionInfo + session list counts from vcs data, not session.summary - patch parsing after chliny's patch-compute (upstream dzianisv#192, MIT) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CMhKDuSQR5gY2R74cqrY1W
- app/connect.tsx: route target of opencode://connect?url=&name=&user=&dir=[&session=] (expo-router maps the link to /connect on cold and warm start) - known server URL: activate it, set dir as its default directory, open sessions/chat - new server: ask password once (SecureStore via addConnection), test, save, activate - lib/connect-link: parse/normalise; also accepts the intent:// form; ignores any password param - addConnection now resolves to the new id Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CMhKDuSQR5gY2R74cqrY1W
- fix: server projects carry `worktree`, not `path.absolute`; picking a server project created the chat in the default dir (Project type + lib/projects.projectDir) - new-chat sheet lists server projects first, git repos before the rest; non-git ones marked "no change tracking"; global "/" project hidden - FAB "New chat": connection default dir, else last-used project Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CMhKDuSQR5gY2R74cqrY1W
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CMhKDuSQR5gY2R74cqrY1W
…t branch - vcs.get / vcs.diff / session.diff put directory in the query; store never fetches without one (server would answer for ~/work) - Changes screen + header use session.directory of this chat, not a stale one - /vcs per directory decides: Branch tab and branch counts only when branch != default_branch (same as web app); else Uncommitted Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CMhKDuSQR5gY2R74cqrY1W
Flows still launched cc.agentlabs.opencode (renamed in #2) and tapped the telemetry consent dialog this PR removes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CMhKDuSQR5gY2R74cqrY1W
Steps through the file list in the Changes tab's order; shows n/total. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CMhKDuSQR5gY2R74cqrY1W
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Phases 0–4 of the forge plan. A first build has been tried on a phone (chat, Changes view).
Phase 0: no upstream services
sentry.tskeeps its old API but only writes to the on-device log buffer.track()is a no-op.kjeldahl/opencode-mobilereleases (tagvX.Y.Z=app.jsonversion).build.yml: no Sentry/PostHog/Chatwoot secrets, no F-Droid job; a tag release carries only the signed APK.it.kjeldahl.opencode, no consent step.Phase 1: keyboard + small upstream PRs
Cherry-picked from
dzianisv/opencode-mobile(MIT); original authorship is kept on the commits:#201by duoyi88: composer above the keyboard, reset after hide#208by omgoshjosh (Joshua Castaneda): usable composer and question cards with the keyboard open. Merged on top of fix(android): keep composer synchronized with IME dzianisv/opencode-mobile#201: fix(android): keep composer synchronized with IME dzianisv/opencode-mobile#201's Android padding kept, fix(android): keep IME prompts usable dzianisv/opencode-mobile#208's composer max height and scrollable questions added.#191by chliny: draft per chat#211by Dre4my_Legion: "wrong password" vs "no password"#215by omgoshjosh (Joshua Castaneda), message prev/next: taken, then reverted after phone testing. Its button column took too much width.Connection add/edit forms: same IME-height padding as the chat (
useKeyboardHeight) instead of#193(adjustPan, fights dzianisv#201) or#216(KAV padding, stale-padding risk).Phase 2: Changes view
app/changes/[id]: Branch / Uncommitted / This turn tabs, file list with +/- counts, pull-to-refresh, refresh when the agent finishes a turn.app/changes/file: fullscreen diff with wrapped lines, and prev/next file arrows with an n/total count in the header.session.directory(query + header); nothing is fetched without one./vcsdecides: Branch tab, and branch counts, only whenbranch != default_branch; otherwise Uncommitted.session.summary.#192(MIT).Phase 3: workspace links
opencode://connect?url=&name=&user=&dir=[&session=]handled by the/connectroute (cold and warm start). Theintent://form works too.dirits default directory, open Sessions (or the chat).docs/forge.md.Phase 4: new chats in the right repo
project.worktree, but the app readproject.path.absolute, so picking a server project created the chat in the default folder.Testing
npm run typecheckpasses;npm testpasses 290/290, with new tests for the changes, connect-link and projects helpers.npx expo export --platform androidbundles.🤖 Generated with Claude Code
https://claude.ai/code/session_01CMhKDuSQR5gY2R74cqrY1W