URC — Universal Remote Control
Control Codex and Gemini from the Claude App on your phone.

You know /remote-control — the Claude Code feature that lets you control a session from the Claude App on your phone. URC makes it universal. One command, and your phone controls Codex. Another command, and it controls Gemini. Same app, same conversation, same interface. No extra API keys. No extra apps.
/urc codex # Your phone now controls Codex
/urc gemini # Your phone now controls Gemini
Behind the scenes, URC spawns a lightweight Haiku relay that acts as a pure passthrough — your messages go through unchanged, output comes back verbatim. The relay is self-managing: it auto-clears, auto-reconnects on target death, and runs indefinitely without intervention.
Features
Phone control for every CLI
- Bridge any Codex or Gemini pane from your phone in one command
- Spawn new panes or bridge existing ones (
/urc 875)
- Initiate bridges from the other side too (Codex skill or Gemini
/rc command)
Self-managing relay
- Auto-clears at 25 sends — respawns itself, restores phone connection, resets counter
- Auto-reconnects on target death — spawns replacement, retries your message (3 attempts)
- Type "status" to check capacity, target health, and respawn count
- No manual maintenance, no
/clear, no restarts
Real-time visibility
- Push attribution shows who dispatched each message and what was asked
- Instant "message received" confirmation when target gets your message
- Responses stream back to your phone as turns complete
$0 relay mode
- Type
>codex: message or >gemini: message for hook-based passthrough
- Zero model invocation, zero cost — a
UserPromptSubmit hook handles dispatch
- Setup:
bash urc/core/relay-ctl.sh add codex %NNN && bash urc/core/relay-ctl.sh on
Cross-CLI coordination
- 11-tool MCP server for pane-level communication (dispatch, read, register, heartbeat, messaging)
- Agents across Claude Code, Codex, and Gemini can send messages, share work, and coordinate
- 5-layer inbox notification stack ensures no message is missed
Tested and validated
- 160 assertions across 10 test suites
- 23-check plugin validation
- Post-Enter stuck-input detection for TUI reliability
Quick Start
Prerequisites
- tmux:
brew install tmux (macOS) or sudo apt install tmux (Linux)
- Python 3.10+, jq
- Claude Code CLI:
curl -fsSL https://claude.ai/install.sh | bash
- Claude Max plan (for phone control — see claude.com/pricing)
- Codex CLI and/or Gemini CLI (optional — install whichever you want to bridge)
Install
tmux new -s urc # Start a tmux session (required)
git clone https://github.com/siddharthkandan/universal-remote-control
cd universal-remote-control
./setup.sh # Detects your CLIs, generates configs
Or install as a Claude Code plugin:
/plugin marketplace add siddharthkandan/universal-remote-control
/plugin install urc
Use It
From Claude Code (inside tmux):
/urc codex # Spawn Codex pane + bridge it to your phone
/urc gemini # Spawn Gemini pane + bridge it to your phone
/urc 875 # Bridge an existing pane by ID
/urc # List unbridged panes
Open the Claude App on your phone — the relay automatically activates Remote Control. Type a message and it goes straight to Codex or Gemini. Responses stream back as they complete.
Aliases: /rc-bridge, /rc-any, /rc-relay all work.
You can also bridge from the other side:
- From Codex: activate the
rc-bridge skill
- From Gemini: type
/rc
Your Claude plan covers the Haiku relay — no separate API key needed.
Gemini Setup Note
Gemini CLI requires additional configuration beyond what setup.sh generates:
setup.sh creates the project config and policy rules automatically
- If
~/.gemini/settings.json has a tools.allowed whitelist, remove the "tools" block
- Verify:
gemini mcp list (outside session) or /mcp list (in session)
- Note: Gemini's
/tools command intentionally hides MCP tools — don't use it to check
How It Works
Phone (Claude App)
| Remote Control
v
Haiku Relay (rc-bridge agent) ← self-managing, auto-clears at 25 sends
| send.sh push files
| (dispatch) ←———————— (response)
v |
Target pane (tmux) |
| hook.sh fires ———————————┘ ← captures response, writes push file