Dispatch Claude Code From My Phone, On Linux, With 32 Parallel Sessions

May 3, 2026

Anthropic shipped Dispatch in the Claude Desktop app — tap a button on your phone, a new Claude Code session boots on your laptop, you talk to it from the iOS Claude app. Beautiful. Except Claude Desktop is macOS and Windows only, and I’m running Omarchy (Arch + Hyprland).

So I went looking for the Linux equivalent of “spawn new terminal session from phone.” Turns out it’s already shipped, just not packaged with the same marketing. It’s a Claude Code subcommand called claude remote-control, and once it’s running as a systemd user service it does everything Dispatch does — phone tap, fresh session, full local context, push notifications when it’s done.

This is the writeup I wish I’d had two hours ago.

The mechanism

claude remote-control opens an outbound TLS relay to Anthropic’s infrastructure. The iOS Claude app’s “Code” tab sees it under whatever name you give it. When you tap ”+ New session,” a new Claude Code process spawns on your machine, in a working directory you choose, with all your local MCPs intact. There’s no port forwarding, no Tailscale exposure, no reverse SSH tunnel. Just outbound HTTPS like any other app.

It needs:

  • Claude Code 2.1.51 minimum, 2.1.110+ for push notifications
  • claude.ai OAuth login (not API key — important, see below)
  • Trust dialog pre-accepted for whatever directory you point it at

That’s it. No third-party project, no MCP server, no ngrok. Built-in.

The auth gotcha that ate twenty minutes

Remote Control rejects ANTHROPIC_API_KEY. If you have it exported in your shell, the relay fails to authenticate — silently, in my case. I had it on line 39 of ~/.bashrc from some old SDK experiment. Removed it, restarted, working.

Worth noting: if your key was in a file Claude Code logged or transcribed, rotate it. Mine was. I did.

You log in instead with:

claude
# then inside the prompt:
/login

That kicks you to claude.ai OAuth in the browser, and the token gets stored in ~/.claude/.

Pre-accept the trust dialog

The first time claude opens a directory, it asks you to confirm trust. That works fine for interactive sessions. It does not work over Remote Control — the prompt has nowhere to render, the spawn just hangs.

Fix: edit ~/.claude.json and flip hasTrustDialogAccepted to true for every project path you care about. I had three that were still false, including /home/brettr itself. Back the file up first:

cp ~/.claude.json ~/.claude.json.bak.before-trust-flip

Then either edit by hand or use a small Python one-liner to flip the flags. Reload, done.

Settings: bypass permissions and turn on push

In ~/.claude/settings.json, under permissions:

{
  "permissions": {
    "defaultMode": "bypassPermissions"
  },
  "agentPushNotifEnabled": true
}

Combined with skipDangerousModePermissionPrompt and skipAutoPermissionPrompt (which I already had), this means a phone-initiated session doesn’t stall on a permission prompt I’ll never see. agentPushNotifEnabled is what makes the iOS app buzz when a long-running task finishes.

Yes, this is loose. Yes, that’s the point — these are my sessions in my home directory, not someone else’s code. If you don’t trust your future self, leave it default and approve from the phone.

The systemd user unit

This is the meat. File at ~/.config/systemd/user/claude-remote-control.service:

[Unit]
Description=Claude Code Remote Control (PA always-on)
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
WorkingDirectory=%h
ExecStart=/usr/bin/claude remote-control --name "Omarchy" --spawn same-dir --capacity 32
Restart=always
RestartSec=10
Environment=ANTHROPIC_API_KEY=
StandardOutput=append:%h/.local/share/claude-remote-control.log
StandardError=append:%h/.local/share/claude-remote-control.log

[Install]
WantedBy=default.target

Flags worth understanding:

  • --name "Omarchy" — the label that shows up in the iOS app. Make it something you’ll recognize on the bus.
  • --spawn same-dir — phone-initiated sessions inherit the server’s cwd. Combined with WorkingDirectory=%h, every new session boots in $HOME and can reach anything under it: my Obsidian vault, the Freebo monorepo, the austintubing site, all of it.
  • --capacity 32 — this is the “32 parallel Claude Code sessions” number. One server process can host up to 32 concurrent sessions spawned from the phone. I’ll never hit that ceiling but it’s nice to know.
  • Environment=ANTHROPIC_API_KEY= — explicitly nukes the variable inside the service even if it’s set elsewhere. Belt and suspenders after the auth fight earlier.
  • Restart=always with RestartSec=10 — if my home internet blips for more than ~10 minutes the relay dies, and this brings it back.

Enable and start:

systemctl --user daemon-reload
systemctl --user enable --now claude-remote-control.service

Tail the log:

tail -f ~/.local/share/claude-remote-control.log

You’ll see a URL like https://claude.ai/code?environment=env_013ECZa7u6geQL9FJWkpa4Vr. You don’t actually need to click it — open the iOS Claude app, go to the Code tab, and you’ll see “Omarchy” with a green dot. Tap it, tap ”+ New session,” and a Claude Code instance is now running in $HOME on my Linux box, ready to talk.

Limits I hit

A few rough edges worth knowing before you build a workflow on top of this.

  • Network outages > 10 min kill the relay. Systemd recovers it but in-flight sessions are gone.
  • Interactive pickers don’t work over Remote Control. /mcp, /plugin, /resume — anything that wants to render a fzf-style chooser fails. Run those from a real terminal.
  • /ultraplan disconnects the relay. Don’t run it from the phone session. Learned the hard way.
  • --sandbox is intentionally off. I want my local MCPs (Gmail, Calendar, Google Tasks, Playwright, Notion, Supabase, Vercel) to keep working. If you sandbox the spawned sessions, those break.

Why this matters

I now reach for my phone in line at the coffee shop, tap ”+ New session,” and a fresh Claude Code session boots in my home directory with every MCP I’ve configured. From the bus. From the gym. From the couch. The latency is the same as if I were typing in a local terminal because the model is being called from my house, not from my phone — the iOS app is just the thin client.

For anyone Googling “claude code from phone linux” or “dispatch linux claude code” or “run claude code on linux from iphone” — this is the answer. The feature is built in. It’s called claude remote-control. Wrap it in a systemd unit, fix the API-key and trust-dialog gotchas, and you have your own personal Dispatch on Arch.

Took me an afternoon to figure out. Hopefully it takes you fifteen minutes.