Feature Request: claude remote-control --headless — daemonizable remote control without TTY dependency

Open 💬 4 comments Opened Mar 3, 2026 by Foodcoman

Summary

Remote control and headless mode are two powerful capabilities that solve complementary problems. Combining them would unlock a new class of deployment: always-on, remotely-accessible Claude Code instances on headless servers — no terminal multiplexer required.

The Architectural Insight

Today, three pieces exist independently:

| Capability | What it proves |
|---|---|
| Headless mode (claude -p) | The execution engine runs without a TTY |
| Remote control (claude remote-control) | The UI can live entirely on another device (phone, browser) |
| Remote control networking | Outbound-only HTTPS polling — no inbound ports, no local UI interaction needed |

When using remote control, the local terminal is rendering a mirror of what the remote client (claude.ai/code, iOS/Android app) already displays. The local TUI is redundant — the user is on their phone or browser, not looking at the server terminal.

Proposal

A --headless flag (or --daemon) for remote control:

claude remote-control --headless

Behavior:

  • Starts the execution engine + HTTPS polling loop as a plain process (no PTY required)
  • Prints the session URL/token to stdout, then runs as a background-friendly process
  • No local terminal rendering — all UI interaction happens on the remote client
  • Compatible with nohup, systemd, supervisord, Docker, or any process manager

Permission Handling — Remote Client as the Permission UI

In current remote control, permission prompts are already forwarded to the remote client (iOS app, claude.ai/code). In headless mode, this becomes the primary permission interface — the remote client isn't just mirroring a terminal, it's the only UI.

| Scenario | Approach |
|---|---|
| Interactive remote (typical) | Permission prompts appear on iOS / claude.ai/code. User approves from phone/browser. |
| Unattended / sandboxed | --dangerously-skip-permissions or --permission-mode for environments where no human is watching. |
| Semi-trusted | --allowedTools to pre-approve specific tools, prompt for everything else via remote client. |

This means the iOS app and claude.ai/code effectively become the permission controller for a headless instance — no local terminal needed for any part of the workflow.

Flag Compatibility

Existing CLI flags should compose naturally with headless remote control:

| Flag | Why it matters for headless RC |
|---|---|
| -r / --resume | Essential. Reconnect to an existing session after a process restart, server reboot, or crash. Without this, a daemon that restarts generates a new session URL every time. |
| --dangerously-skip-permissions | Unattended operation for sandboxed/trusted environments where the remote client may not be connected when a permission is needed. |
| --permission-mode | Finer-grained alternative — e.g., --permission-mode acceptEdits for semi-trusted setups. |
| --allowedTools | Scope what the headless instance can do (e.g., only Bash(git:*), Read, Edit), with remaining prompts forwarded to the remote client. |

Use Cases

Always-on dev server (systemd):

[Service]
ExecStart=/usr/local/bin/claude remote-control --headless
Restart=on-failure

Resilient daemon with resume:

# First launch: prints session URL
claude remote-control --headless \
  --session-id 550e8400-e29b-41d4-a716-446655440000 \
  > ~/rc-session.txt 2>&1

# After restart: reconnect to same session
claude remote-control --headless \
  --resume 550e8400-e29b-41d4-a716-446655440000

Quick background process:

nohup claude remote-control --headless > ~/rc-session.txt 2>&1 &
cat ~/rc-session.txt  # grab session URL, open on phone

Docker / cloud dev environments:

CMD ["claude", "remote-control", "--headless", "--permission-mode", "acceptEdits"]

SSH fire-and-forget:

ssh devbox 'nohup claude remote-control --headless > /tmp/session.txt 2>&1 &'
ssh devbox 'cat /tmp/session.txt'  # get URL, open on phone

Why This Is Not a TTY Bug

This is not about fixing stty ioctl errors when a TTY is absent (see #15428). This is a feature request for a new mode of operation where the local terminal rendering is intentionally removed because the remote client is the only UI. The execution engine and networking already work without a terminal — they just need to be offered as a first-class headless option.

Impact

Remote control is currently limited to machines where you can maintain an interactive terminal session (directly or via tmux/screen). This is ironic — remote control is designed to free you from being at your machine, but it still requires your machine to have an active terminal. A headless mode, combined with --resume for crash recovery and the remote client as the permission UI, would make remote control a true always-on development service.

View original on GitHub ↗

This issue has 4 comments on GitHub. Read the full discussion on GitHub ↗