Skip to content

fix(mobile): configure another Claude account from Providers - #28928

Merged
shivamhwp merged 2 commits into
pingdotgg:mainfrom
shivamhwp:issue-watch/28872
Nov 5, 2026
Merged

shivamhwp merged 2 commits into
pingdotgg:mainfrom
shivamhwp:issue-watch/28872

Conversation

@shivamhwp

@shivamhwp shivamhwp commented Nov 1, 2026 •

Copy link
Copy Markdown
Collaborator

Refs #28872

Mobile Settings → Providers omitted Claude, so users could not register another already signed-in Claude config folder from their phone. It now lists Claude instances and lets users add, edit, or remove them through the existing environment-scoped server command and permissions. Sign in with the Claude CLI on the server first. The existing model picker can then select that instance; this does not add a login flow or change handoffs.

The rebase preserves both reviewed patches unchanged. Current JavaScript and isolated Linux server use head 351b8d3, based on 8b44f42. Compatibility with current main a07be97 was rechecked on the combined merge tree below. The published PR head and its account runtime files are unchanged.

Verification at this head:

  • check:changed passed format, lint, knip, 40 package typechecks, 15 tests in five files, and five React compiler files. CI output.
  • Android Pixel 9 emulator, API 35, native fingerprint aba84043a4edb30381916d38ad6a4e7aad2cc74f: add, edit, confirm removal, select Claude B · Opus 5.5, save and reopen.
  • iPhone 17 Pro simulator, iOS 27, native fingerprint 994fd7249d9b61e4302f1767d4e23664fbde5277: add with an ID collision, edit, confirm removal, select Claude B · Opus 5.5, save and reopen.
  • Web: the existing Add provider wizard derives a free ID and saves the instance through the extracted shared helper. Both mobile clients receive it.

Native clients came from the validated fingerprint-matched cache on shiv, run r_i4r2wdypjpyx9q00. Their original cached build commits are unknown. Before images show the original Providers screen from the earlier verification; after images and recordings below use the head above. Recordings play at 2x speed.

Android before: no Claude setup controls.
Android before

Android after: the mobile-added instance and its config folder appear.
Android after

Android: add, edit, and confirm removal. The final removal was also checked in persisted settings and the live screen.
Android settings

Android: select Claude B · Opus, save, and reopen to confirm selection.
Android picker

Android selection after reopening

iOS before: no Claude setup controls.
iOS before

iOS after: add another entry despite an ID collision, then edit its name.
iOS after

ios-settings-351b8d3.mp4

The removed entry disappears after the server refreshes its provider catalog.
iOS after removal

iOS: select Claude B · Opus, save, and reopen to confirm selection.
iOS picker

iOS selection after reopening

The config folders contain test data. A local, no-network Claude protocol fixture reports an authenticated test identity for A. The web wizard registered B with the same fixture for picker verification. Mobile-created entries exercise the real save, edit, and removal paths; no credentials or paid turns were used.

Not shown: real Claude authentication or continuation after a weekly limit. This PR addresses registering an existing login folder from mobile. Windows registration and saved mobile selection were subsequently verified below.

Implemented with Claude Opus 5.5 / Claude Code; tested and reviewed with GPT-6.1 Sol / Codex.

Additional evidence for head 351b8d3:

Main 9e85538, Android Pixel 9 / API 35 against an isolated Linux server at that revision: open Settings → Providers and look for a way to register another Claude folder. Claude and its registration controls are absent.

main-providers-complete.mp4

PR head, same device and Linux environment: open Providers, add Claude B with its config folder, and see the saved row. The recording plays at 2x speed without cuts.

head-providers-full-2x.mp4

Windows pass: native ARM64 Windows 11 VM t3-windows, OS 10.0.26200, Node v26.12.1. Server bundle built from head 351b8d3 with vp run build:bundle; runtime dependencies staged with the repository's CLI archive helpers and installed with vp install --prod. dist/bin.mjs SHA-256 is d8e5977ddea874bc11f3ff325266644d6d6a4606790f1417db3d7e95fb2d72a7. Android connects through an SSH forward to that server's loopback listener and uses the same native fingerprint recorded above.

Register C:/tmp/t3code-28872/account-b from Android on the Windows environment. The server re-probes it and the row reports Signed in.

windows-registration.mp4

Choose Claude B Windows · Opus 5.5, save, and reopen the picker. This recording plays at 2x speed without cuts.

windows-selection.mp4

After relaunching the native app, reopen the same thread's picker: Claude B Windows · Opus 5.5 remains selected. Save retains the mobile composer draft; it applies to the server thread when a turn starts. No turn was sent.

windows-reopen-confirmation.mp4

Windows account selection after app relaunch

The Windows settings audit passed:

head: 351b8d356635eb6c48f0ba4a4fda17790d42579d
server: t3-windows / win32 / arm64 / Node v26.12.1
instance: claudeAgent_claude_b_windows
name: Claude B Windows
driver: claudeAgent
enabled: true
config.homePath: C:/tmp/t3code-28872/account-b
assertion: mobile registration persisted in native Windows server settings

Both Windows accounts use a local no-network protocol fixture. It reports synthetic authentication, answers initialization and usage probes, and sends no API requests. Real Claude authentication, quota recovery, and context handoff remain unverified.

Base compatibility recheck:

  • PR head 351b8d356635eb6c48f0ba4a4fda17790d42579d, current main a07be97ab0753b2b5b0caecebba69d7f872594fa. Their merge is conflict-free.
  • The overlapping base edit changes client-runtime's typecheck command to effect-tsgo tsrs --noEmit. It does not change the account UI, planner, shared ID helper, or provider settings protocol. Later base changes share crypto and DPoP code.
  • Tested the exact combined tree f418cea554231d93ce78dad2149c613caf1ed207, using a temporary local merge commit and its pinned dependencies. Client-runtime, mobile, and web typechecks all pass with @effect/tsgo 0.67.1. Existing Effect suggestions remain non-fatal. The focused account, ID, and web-dialog tests pass. No combined-tree runtime pass was run; the attached device recordings still document the unchanged published head.
$ vp run --filter @t3tools/client-runtime --filter ./apps/mobile --filter ./apps/web typecheck
vp run: 0/1 cache hit (0%), 3/3 successful.
exit 0

$ vp test run apps/mobile/src/features/settings/claude-accounts.test.ts packages/client-runtime/src/providerInstanceIds.test.ts apps/web/src/components/settings/AddProviderInstanceDialog.test.ts
Test Files  3 passed (3)
     Tests  8 passed (8)
exit 0

@github-actions github-actions Bot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Nov 1, 2026
@macroscopeapp

macroscopeapp Bot commented Nov 1, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at e3d7463

Macroscope's review found this PR approvable — Mobile users can configure additional Claude accounts using server folders that are already signed in. The controls reuse existing provider settings operations, leave credentials intact on removal, and do not change product defaults.

You can add or adjust custom eligibility rules. Learn more.

@coderabbitai

coderabbitai Bot commented Nov 1, 2026 •

Copy link
Copy Markdown
Contributor

Explain Change →

No actionable comments were generated in the recent review.

Walkthrough

Mobile Settings now supports adding and editing Claude provider accounts and removing eligible non-default accounts. Shared provider-instance ID derivation is exported from client-runtime and used by the web provider dialog. The Claude provider guide documents the mobile setup path.

Changes: Claude account management

Layer / File(s) Summary
Shared provider-instance ID derivation
packages/client-runtime/src/providerInstanceIds.ts, packages/client-runtime/src/providerInstanceIds.test.ts, packages/client-runtime/package.json, apps/web/src/components/settings/AddProviderInstanceDialog*
Client-runtime now provides and exports provider-instance ID derivation helpers. The web provider dialog imports these helpers instead of using local implementations.
Claude account save planning
apps/mobile/src/features/settings/claude-accounts.ts, apps/mobile/src/features/settings/claude-accounts.test.ts
The save planner validates new account fields, checks managed policy, and creates or updates provider instances. Tests cover creation, edits, validation, and policy checks.
Mobile account management and provider routing
apps/mobile/src/features/settings/ClaudeAccounts.tsx, apps/mobile/src/features/settings/SettingsProviderAccountsRouteScreen.tsx, docs/user/providers-claude.md
Mobile Settings displays and manages Claude accounts, with mutation status and confirmation for removal. Provider routing renders Claude accounts when permitted. The guide describes adding an account from mobile Settings.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Change: Bug fix

Sequence Diagram(s)

sequenceDiagram
  participant User
  participant SettingsProviderAccountsRouteScreen
  participant ClaudeAccount
  participant planClaudeAccountSave
  participant ProviderInstanceMutationHook
  participant Environment
  User->>SettingsProviderAccountsRouteScreen: Open provider settings
  SettingsProviderAccountsRouteScreen->>ClaudeAccount: Render Claude account controls
  User->>ClaudeAccount: Submit account draft
  ClaudeAccount->>planClaudeAccountSave: Plan save with draft and policy
  planClaudeAccountSave-->>ClaudeAccount: Return mutation or validation error
  ClaudeAccount->>ProviderInstanceMutationHook: Submit planned mutation
  ProviderInstanceMutationHook->>Environment: Send provider-instance mutation
  Environment-->>ProviderInstanceMutationHook: Return mutation result
  ProviderInstanceMutationHook-->>ClaudeAccount: Return success or failure
Loading

Possibly related issues

  • pingdotgg/t3code#28872 — The issue requests a mobile way to configure or select another Claude login. This change adds mobile account configuration using an existing signed-in Claude config folder.
  • pingdotgg/t3code#29414 — The issue reports a provider removal action without a label or confirmation. This change adds a labeled removal action with confirmation for eligible Claude accounts.

Suggested reviewers: juliusmarminge, maria-rcks

Merge Risk: Minimal · up to 351b8

Separate Claude configuration folders can be managed from mobile settings. No merge-blocking risk was identified.

Pre-merge checks: Passed 4
Check name Status Explanation
Title check Passed The title "fix(mobile): configure another Claude account from Providers" matches the main change. The PR lets mobile Settings > Providers list, add, edit, and remove Claude instances (Claude config fo…
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
Description check Passed The description covers every required template section. Problem: mobile Settings → Providers omits Claude, so users cannot register another signed-in Claude config folder from the phone. Change: lists…
Full details: Title check

Explanation

The title "fix(mobile): configure another Claude account from Providers" matches the main change. The PR lets mobile Settings > Providers list, add, edit, and remove Claude instances (Claude config folders), which the title describes. It uses a conventional commit prefix, is one sentence, and avoids vague terms. The title does not mention the shared ID helper extraction or the web wizard change, but those are secondary details.

Full details: Description check

Explanation

The description covers every required template section. Problem: mobile Settings → Providers omits Claude, so users cannot register another signed-in Claude config folder from the phone. Change: lists Claude instances and lets users add, edit, and remove them through the existing environment-scoped server command and permissions, with the shared ID helper extracted for web. Scope and approval: it references issue #28872, but the template asks for a triaged issue or discussion with explicit maintainer approval of direction and scope, including the approval comment. The description links the issue without stating that a maintainer approved it. Verification: it lists focused tests (three test files, eight tests passing), a combined-tree typecheck, Android and iOS device runs, and a Windows pass, with screenshots and recordings. It also states what was not verified (real Claude authentication, quota recovery, context handoff). The PR body also says that the failing items were checked in the base-compatibility recheck. The description does not include a conventional commit title, and the PR title is outside the description body. The 'Implemented with' line identifies the model and harness, as the template requests. Overall the description is thorough and mostly complete; the main gap is the approval evidence.

Finishing Touches
Generate unit tests (beta)
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts
Recent review info
Run configuration
Commits

Reviewing files that changed from the base of the PR and between e3d7463 and 351b8d3.

Files selected for processing: 1
  • apps/mobile/src/features/settings/SettingsProviderAccountsRouteScreen.tsx

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 4 remain after this review.

@juliusmarminge juliusmarminge added bugfix Fix PR opened by an issue lead; enters the PR loop pr:needs-julius Needs Julius: route gate, unverifiable surface, or blocked labels Nov 1, 2026
PR Batch Tester and others added 2 commits November 4, 2026 09:48
Mobile Settings > Providers only listed providers with in-app sign-in, so a
user whose Claude account hit its limit could not add a second, already
signed-in Claude config folder without the desktop app.

Providers now lists each Claude instance with its sign-in status and config
folder, and lets a user add one (name + CLAUDE_CONFIG_DIR folder), edit its
name and folder, or remove a non-default one. Saves go through the existing
mutateProviderInstance command, keep every other instance field, honor
providers:manage and managed policy, and reuse the web wizard's instance-id
derivation, now shared from client-runtime.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@shivamhwp
shivamhwp merged commit e4e3657 into pingdotgg:main Nov 5, 2026
34 checks passed
github-actions Bot added a commit to omarcresp/t3code-flake that referenced this pull request Nov 5, 2026
**v0.1.8-nightly.20261105.4205** · 28 changes from 3 contributors

- **Claude MCP Apps.** Use interactive MCP Apps in Claude Code threads.
- **Organized repository clones.** Clone repositories into host, owner, and repository folders, including repositories with the same name.
- **Agent browser tabs.** Open new agent browser tabs when idle tabs have filled the shared limit.
- **Pending questions.** Answer or dismiss older questions and approval prompts even after their messages leave the loaded conversation.

### Plus 22 more bug fixes.

<details>
<summary>Full changelog</summary>

## What's Changed
* docs: scope managed-policy LAN note to old background services by @b2bvic in pingdotgg/t3code#30900
* feat(server): render MCP Apps from Claude tool calls by @juliusmarminge in pingdotgg/t3code#29803
* build: run Effect rules on mobile and lock in clean suggestion rules by @juliusmarminge in pingdotgg/t3code#31111
* fix(mobile): keep iOS composer empty after sending an autocorrected word by @shivamhwp in pingdotgg/t3code#30308
* fix(server): idle agent tabs free a slot when the server's 32-tab browser limit is full by @shivamhwp in pingdotgg/t3code#24186
* fix(web): keep message navigation visible on touch when there is room by @shivamhwp in pingdotgg/t3code#26806
* fix(mobile): pinch wide images from anywhere in the Android viewer by @shivamhwp in pingdotgg/t3code#30929
* fix(mobile): preserve autocorrect in custom question answers by @shivamhwp in pingdotgg/t3code#30744
* fix(web): show Setting up during worktree setup by @shivamhwp in pingdotgg/t3code#28832
* fix(mobile): keep iOS thread menus short enough for drag selection by @shivamhwp in pingdotgg/t3code#30944
* fix(web): show the comparison base beside Changes totals by @shivamhwp in pingdotgg/t3code#30085
* fix(mobile): use H.264 for iOS previews and keep Close reachable by @shivamhwp in pingdotgg/t3code#28622
* fix(mobile): iOS image previews open without waiting for the gallery by @shivamhwp in pingdotgg/t3code#29044
* feat: optionally clone repos into ghq-style <host>/<owner>/<repo> folders by @shivamhwp in pingdotgg/t3code#24904
* fix(devices): explain Windows SSH host failures by @shivamhwp in pingdotgg/t3code#30941
* fix(web): make styled composer Markdown markers editable by @shivamhwp in pingdotgg/t3code#30421
* fix(mobile): configure another Claude account from Providers by @shivamhwp in pingdotgg/t3code#28928
* fix(web,mobile): save pull request description checkbox changes by @shivamhwp in pingdotgg/t3code#30704
* fix(client): a big server config on a slow link no longer drops the connection in a loop by @shivamhwp in pingdotgg/t3code#23758
* fix(server): restart T3 Connect's tunnel client when Cloudflare drops it by @shivamhwp in pingdotgg/t3code#24946
* fix(mobile): compact stale Claude threads before sending by @shivamhwp in pingdotgg/t3code#27935
* fix(web): show saved service access with Local environment off by @shivamhwp in pingdotgg/t3code#26464
* fix: keep older pending questions answerable by @shivamhwp in pingdotgg/t3code#26435
* fix(web): deleted forks no longer remain in Lineage by @shivamhwp in pingdotgg/t3code#29000
* fix(server): preserve sibling wakeups when interrupting a completion wake by @shivamhwp in pingdotgg/t3code#28204
* fix(server): attribute usage-limit auto-resume to T3 Code by @shivamhwp in pingdotgg/t3code#29838
* fix(acp): time out silent Antigravity prompts by @shivamhwp in pingdotgg/t3code#30377
* fix(codex): sharing usage limits offer the existing recovery options by @shivamhwp in pingdotgg/t3code#25341

## New Contributors
* @b2bvic made their first contribution in pingdotgg/t3code#30900

**Full Changelog**: pingdotgg/t3code@v0.1.8-nightly.20261104.4192...v0.1.8-nightly.20261105.4205

</details>


Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.1.8-nightly.20261105.4205
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugfix Fix PR opened by an issue lead; enters the PR loop pr:needs-julius Needs Julius: route gate, unverifiable surface, or blocked size:L 100-499 changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants