Server mode
Best when you want a reusable server with URL and QR code.
claude remote-control Both paths share the same local-first shape: a signed-in remote device talks through a relay, while the real session keeps running on a connected host. What changes is the host process, the identity system, and whether model routing is added.
Only sends control events and receives session updates.
Only forwards prompts, approvals, and status. Files and workspace stay on the host.
Runs the real Claude/Codex session. Files, tools, credentials, and approvals stay on the host.
Use the built-in Claude Code command. Remote Control needs a claude.ai subscription login; API-key or Console auth cannot create the remote session.
Use the Codex app-server host process. ChatGPT identity handles the remote relay; CLIProxyAPI/CCS only changes where model calls are routed.
Check these before debugging QR codes or missing sessions.
Pick one entry point. They are alternatives, not steps to run together.
Best when you want a reusable server with URL and QR code.
claude remote-control Open a new Claude Code session with remote enabled immediately.
claude --remote-control "My Project" Type this inside the running Claude Code screen.
/remote-control
# or:
/rc Open Claude Code config, then enable remote control for future sessions.
/config
# Set: remoteControl: true Codex app-server is the local interface rich clients attach to for auth, conversation state, approvals, and streamed agent events. Remote Control starts that host process, then the remote device controls it through ChatGPT identity.
The standalone binary launches the daemon. Local files, shell, tools, plugins, and credentials come from this host.
ChatGPT/OpenAI OAuth authorizes the remote device and workspace. It is separate from provider routing.
-c model_provider changes where model calls go after the app-server is running. CLIProxyAPI/CCS lives here.
Install the standalone Codex binary once, then pick a start path: default OAuth, or route through CLIProxyAPI/CCS when you need shared routing and account-pool controls.
Run the ChatGPT installer once. Both cases below reuse the binary at ~/.codex/packages/standalone/current/codex.
curl -fsSL https://chatgpt.com/codex/install.sh | sh Remote Control needs a ChatGPT/OpenAI OAuth session first. CLIProxyAPI only changes model routing; it does not replace the ChatGPT identity used to authorize the phone and host.
~/.codex/packages/standalone/current/codex login Use the same ChatGPT account and workspace, then open the Codex tab. If the Codex tab is missing, update the ChatGPT app first.
When ChatGPT asks whether this phone can access Codex on your computer, tap the authorize button. That is the device handoff shown in the mobile prompt.
After approval, ChatGPT may show a secure setup spinner. Wait until the Codex host/session appears before sending prompts remotely.
Keep the host awake and online. Files, tools, credentials, sandboxing, and approvals still come from the connected host; the phone only sends prompts and receives session updates.
Run only one of the cases below.
Pick this when you already signed in via ChatGPT/OpenAI OAuth and do not need CCS model routing.
~/.codex/packages/standalone/current/codex remote-control start --json Pick this when CCS/CLIProxyAPI is healthy and you want account rotation, quota visibility, or failover behind the remote session.
~/.codex/packages/standalone/current/codex remote-control start \
-c 'model_provider="cliproxy"' \
-c 'model="gpt-5.5"' \
--json Common errors when running remote-control start , plus a quick check that your binary exposes the right surface.
Before using either case, confirm your installed standalone binary exposes remote-control start / remote-control stop , --json output, and -c config overrides.
remote-control start manages the app-server daemon. -c overrides are parsed as TOML, so model_provider and model can be passed per start. If remote-control start returns Remote control is enabled on <device> but the connection is errored , the cloud still tracks this device as enrolled but the previous app-server WebSocket ended in an error state (network blip, killed daemon, stale socket). Stop the local daemon first to clear state, then start again. If it persists, toggle the device off in ChatGPT → Remote Control settings before retrying.
~/.codex/packages/standalone/current/codex remote-control stop
~/.codex/packages/standalone/current/codex remote-control start --json If start fails with app server did not become ready on app-server-control.sock , the managed daemon did not create its control socket in time, or the old daemon state is stale. Check the daemon version/status, stop it, then rerun the same start command you chose above.
~/.codex/packages/standalone/current/codex app-server daemon version
~/.codex/packages/standalone/current/codex app-server daemon stop
# Then rerun the same remote-control start command you picked above. Last resort — use only when standalone Codex reports token_revoked or refresh_token_reused . Reset OAuth, then rerun remote-control start .
~/.codex/packages/standalone/current/codex logout
~/.codex/packages/standalone/current/codex login The Claude and Codex sections above cover the main things to watch for. Use the official docs below when you want more detail.