Persistent headless `--remote-control` sessions on a server never appear in the mobile app — no safe way to reach long-running, in-progress work
Summary
I run a fleet of ~40 persistent, long-lived Claude Code sessions on a headless Linux server, each launched in tmux via claude --dangerously-skip-permissions --remote-control <name> --continue (supervised so they auto-resume). These are not throwaway sessions — they run multi-day work (build bake-offs, portfolio pipelines, orchestration) and hold important in-progress context.
None of these sessions appear in the iOS app's "Code" tab, and I have no reliable way to reach them from mobile. Because I can't see or drive them from my phone, I effectively lose access to in-progress work — and I'm afraid to restart anything to "fix" visibility because a restart interrupts whatever is mid-flight.
This is the same registration gap as #30691 (closed not planned), but the severity is higher for persistent server fleets: it's not a convenience issue, it's "I can't safely reach important running work from the device the feature is meant for."
Environment
- Claude Code: 2.1.206 (also observed across 2.1.202–2.1.206)
- OS: Ubuntu (headless server, accessed via SSH)
- Sessions:
claude --remote-control <name>inside tmux, supervised with--continueauto-resume - Client: Claude iOS app, logged into the same Max account
hasUsedRemoteControl: true
Steps to reproduce
- On a headless server over SSH, start a persistent session:
tmux new -d -s work 'claude --remote-control my-session' - The TUI shows Remote Control active with a
https://claude.ai/code/session_…URL. - Open the iOS app → Code tab. The session is not listed (force-quit, pull-to-refresh, and sign-out/in do not help).
mcp__ccd_session_mgmt__list_sessions(the fleet API) also does not return these sessions — its list is stale/empty of them.- Only after manually opening the session's URL does that one session appear — per session, no bulk registration.
Expected
Sessions started with --remote-control (especially named, persistent ones) should auto-register and appear in the mobile "Code" tab / FleetView without manually opening each session URL — so a server fleet is reachable from mobile.
Actual
Headless --remote-control sessions never auto-appear on mobile. With ~40 sessions there is no practical way to open 40 URLs, and the URL is only visible in each session's live TUI. Result: important, in-progress work is unreachable from the phone, and the only "fixes" (restarting sessions) risk interrupting that work.
Impact / why this matters
- Persistent server-based fleets are a real, growing use case (VPS + tmux + remote control is widely documented).
- The failure mode pushes users toward restarting sessions to force re-registration — which is exactly the action that endangers in-progress work.
- There is no in-app affordance to "add an existing server session by name," and no bulk-register.
Related
- #30691 (closed not planned) — same core symptom on the same setup
- #28402 — RC session not visible in list, can't reconnect after leaving
- #60780 — desktop RC works, mobile receives nothing
- #60437 — Agent View doesn't enumerate FleetView/daemon-fleet sessions
Possible resolutions
- Auto-register
--remote-control(and "enable for all sessions") sessions into the mobile fleet without requiring a manual URL open. - Provide a bulk/by-name "add existing session" path in the mobile Code tab.
- Expose the session URL non-interactively (e.g.
claude remote-control --print-url, or write it to a file) so fleet managers can surface all URLs at once. - At minimum, document the manual-URL workaround for headless fleets and reopen #30691.
5 Comments
Additional symptom: misleading connection-state reporting
Following up with a diagnostic detail from the iOS app. The per-session connection indicator does not reflect actual reachability, and it behaves inconsistently between the two session types:
claude --remote-control <name>sessions (spawned on a server via tmux) falsely display "connected" while being completely unresponsive — input is silently dropped, no error is surfaced.So a dead/unreachable
--remote-controlfleet session is misreported as "connected", giving the user no signal that it's broken, whereas the ccd session at least surfaces an honest "offline" error. The liveness indicator for--remote-controlsessions appears to reflect the last-known bridge socket state rather than live reachability.Environment unchanged from the original report (Claude Code 2.1.206, headless Ubuntu over SSH, iOS app, same Max account). Server-side these sessions still hold established TLS connections to the bridge, yet neither appear/refresh in the fleet nor accept input.
Sharpened root cause after live-registry testing
Update after testing against the live registry (
GET https://api.anthropic.com/v1/sessions, authed with the account OAuth token +x-organization-uuid+anthropic-version+anthropic-beta: ccr-byoc-2025-07-29):connection_status: connectedright now. Not an account-wide outage.--remote-control(raw tmux) sessions fail to register — they neverPOST /v1/sessions, never appear in the fleet, never take input. The last such session that registered was created ~2026-07-07 19:01Z; every one spawned after is absent. Mac/SDK sessions kept registering afterward.tengu_sessions_elevated_auth_enforcement = true(in cachedGrowthBookFeatures), alongsidetengu_ccr_bridge,tengu_bridge_attestation_enforce. Looks like a session-scoped elevated-auth / device-attestation enforcement that started rejecting the headless raw---remote-controllaunch path./v1/sessions(not the blocker); and replicating the working desktop auth env on a server session (CLAUDE_CODE_ENTRYPOINT=claude-desktop+CLAUDE_CODE_OAUTH_TOKENin-env + refresh flags) still does not register — nobridge_session_create, absent from/v1/sessions.The core question: what env / attestation must a headless, server-launched
claude --remote-control <name>session provide to passbridge_session_createand register, now that elevated-auth enforcement is on? First-party (Mac) sessions on the same account register normally; the CLI/tmux server path silently does not. A documented way for headless/CI hosts to register would fix this class of setup (VPS + tmux + remote control).Environment: Claude Code 2.1.206, headless Ubuntu over SSH, iOS app, Max account.
This is a regression — and the affected sessions come from a public, reproducible skill
Reproducible artifact: all the affected sessions are created by this open skill (tmux + systemd +
claude --remote-control <name>, with--continueauto-resume): https://github.com/chimera-defi/claude-remote-session-skill — anyone debugging can reproduce the exact launch path from it.It is a regression, not a never-worked setup. I could previously launch these sessions with this skill and fully monitor + drive them from the iOS app. That stopped working around 2026-07-07, which lines up with
tengu_sessions_elevated_auth_enforcementflipping on. Same skill, same account, same launch method:claude --remote-controlsessions from this skill registered and were reachable/controllable from mobile.POST /v1/sessions), never appears in the mobile fleet, and takes no input — while my Mac-local sessions on the same account keep registering and showingconnected.So whatever attestation / elevated session-auth the new enforcement requires, the headless
claude --remote-control(CLI/tmux) launch path used to satisfy (or not need) it before ~07-07 and no longer can. The ask remains: what must a headless, server-launched--remote-controlsession now provide to passbridge_session_createand register? — ideally a documented path so CI/VPS/tmux setups keep working.Precise diagnosis: the regression is tag-scoped, gated by elevated-auth enforcement
Reproduced from the account's live registry (
GET /v1/sessions). Sessions carry atagsfield marking launch path:remote-control-repl(raw-tmuxclaude --remote-control, the skill's launcher) — LAST REGISTERED 2026-07-07T19:01:06Z; nothing after.remote-control-auto(Mac desktop app) — still registering through 2026-07-11. Works.remote-control-sdk(SDK path) — registered after the cutoff (2026-07-10), even headless. Works.So the break is specific to the
remote-control-repl(headless CLI/tmux) tag path, on ~2026-07-07.Confirmed the live gate:
tengu_sessions_elevated_auth_enforcement = true— not attestation (tengu_bridge_attestation_enforce = false) and not version (running 2.1.206 > min 2.1.139). So the CLI/tmux--remote-controlpath no longer satisfies the elevated session-auth thatbridge_session_create → POST /v1/sessionsnow requires, while the SDK and desktop paths do. (There's atrustedDeviceTokenin~/.claude/.credentials.jsonthe raw-CLI path never presents.)Ask: what elevated/session-scoped auth must a headless
remote-control-replsession present to register now that enforcement is on — or can the mechanism the-sdkpath uses be documented for CLI/tmux use? The-sdktag proves a headless session can register post-enforcement; the raw CLI path just isn't sending whatever it sends.Root cause found + fix (confirmed end-to-end)
Following up with the actual root cause — this is not an account/registry-side freeze; it's a client-side gate change.
A CLI update (~2026-07-07) added a first-party-base-URL requirement to the remote-control bridge-enable gate:
If
ANTHROPIC_BASE_URLis set to anything whose host isn'tapi.anthropic.com(in our case a local proxy athttp://127.0.0.1:8787, set in~/.claude/settings.jsonenv), the bridge is silently not enabled → the session never callsbridge_session_create→ never registers viaPOST /v1/sessions→ never appears in the mobile app. Sessions with no base-URL override (e.g. the Mac desktop path) kept registering, which made the breakage look account-scoped.This is a regression: these
--remote-controlsessions previously registered and were reachable/controllable from the phone; the 07-07 CLI rollout broke every session that runs behind a proxy base URL, all at once.Repro
ANTHROPIC_BASE_URLto any non-api.anthropic.comhost (e.g. a local proxy) in~/.claude/settings.jsonenv.claude --remote-control <name>.GET /v1/sessionsshows no registration.Workaround (validated)
Force a first-party base URL for RC launches via a dedicated
--settingslayer:--settingsmerges over the user settings.json (keeps hooks/MCP/plugins) but wins theenvbase-URL key. Note a start-scriptexport ANTHROPIC_BASE_URL=...does not work — user-settingsenvclobbers per-process env. After this, a fresh session registers withconnection_status: connectedand is reachable + accepts input from the phone.Requests
--remote-controldeployment.ANTHROPIC_UNIX_SOCKET, which appears to satisfy a related gate), so proxy users keep both remote control and their proxy.All of the affected sessions were launched with this skill: https://github.com/chimera-defi/claude-remote-session-skill