Monitor and control your AI coding agents from anywhere - phone, tablet, or browser.
RDC is an open-source command center for developers running multiple AI agents (Claude Code, Cursor, Gemini CLI) across multiple projects. One dashboard, all your terminals, accessible from any device.
- See all your agents in one place - 5 projects with Claude Code running? See them all, switch instantly
- Check on agents from your phone - Mobile-first UI with terminal access, virtual keyboard, and touch controls
- Shared browser preview - You and the AI agent see the same page. Click, type, navigate together
- Terminals that survive everything - PTY sessions persist across server restarts and network drops
# Install with uv (recommended — isolated, auto-managed CLI)
uv tool install rdc
# Or with pip
pip install rdc
rdc setup # Guided config: API keys, presets, remote access
rdc server start # Open http://localhost:8420One-off run without installing:
uvx rdc setupOr install from source:
# One-line install (clones, installs deps, builds, runs guided setup)
curl -sSL https://raw.githubusercontent.com/dawalama/remote-dev-control/main/install.sh | bash
# Or manual:
git clone https://github.com/dawalama/remote-dev-control.git
cd remote-dev-control
uv sync && cd frontend && pnpm install && pnpm run build && cd ..
rdc setup
rdc server startPython 3.11+, Node.js 18+, and Chrome (for browser preview).
# If you don't have uv/pnpm:
curl -LsSf https://astral.sh/uv/install.sh | sh
npm install -g pnpm| Desktop | Mobile | Kiosk |
|---|---|---|
| IDE-like split view | Card-based, touch-optimized | Tablet sidebar + terminal |
| Terminal + sidebar tabs | Fullscreen terminal overlay | Collapsible side panels |
- Spawn Claude Code, Cursor, Gemini CLI, or plain shell per project
- WebSocket streaming with auto-reconnect and snapshot-based session restore
- Terminal switcher: tap title or long-press Back to switch between terminals
- Virtual keyboard with arrow keys, Ctrl-C, Tab, Enter for mobile
- Waiting-for-input detection with visual alerts
- Local Chrome (no Docker required) with CDP screencast viewer
- 5 agent tools:
observe,click,type,navigate,screenshot - Observe-act loop: agent sees the page, decides actions, executes, verifies
- Same page shared between you and the agent - no separate sessions
- Auto-discover project scripts from package.json, Makefile, etc.
- Services (dev servers) with port detection and browser preview
- Commands (builds, tests, lints) with output capture
- Start, stop, restart, attach to orphaned processes
Natural language control via chat:
- "Start a terminal for my-project"
- "Show running tasks"
- "Switch to kiosk mode"
Access from anywhere via Cloudflare Tunnel + Caddy reverse proxy:
Internet -> Cloudflare Tunnel -> Caddy (:8888) -> RDC (:8420)
-> Dev servers (:3000, :5173, etc.)
Each dev server gets its own preview subdomain automatically.
src/remote_dev_ctrl/server/
app.py # FastAPI app, routes, lifespan
chrome.py # Local Chrome process lifecycle
browser.py # Browser sessions, CDP connections
browser_use.py # Agent browser control (observe/act/screenshot)
terminal.py # PTY management, WebSocket relay, snapshots
worker.py # Task execution engine
config.py # Config loading
agents/tools.py # Agent tool definitions (file, git, browser)
frontend/src/
layouts/ # desktop.tsx, mobile.tsx, kiosk.tsx
features/ # terminal, browser, chat, tasks, processes
stores/ # Zustand state management
hooks/ # use-browser-agent, use-mount-effect
Stack: Python (FastAPI) + React + TypeScript + Tailwind + Zustand + xterm.js + SQLite
Config lives at ~/.rdc/config.yml (auto-created on first run):
server:
host: 127.0.0.1
port: 8420
browser:
backend: chrome # Local Chrome, no Docker needed
headless: true
providers:
cursor:
type: cursor-agent
default: true
ollama:
type: ollama
model: qwen3.5API keys go in the vault, not config files:
rdc config set-secret ANTHROPIC_API_KEY sk-ant-...rdc server start [-d] # Start server (optionally as daemon)
rdc server stop # Stop server
rdc add <path> [-n name] # Register a project
rdc list # List projects
rdc config set-secret KEY VALUE # Store API key securelyInteractive docs at http://localhost:8420/docs when the server is running.
Key endpoints:
| Endpoint | Description |
|---|---|
WS /ws/state |
Real-time state updates |
WS /terminals/{id}/ws |
Terminal I/O stream |
POST /terminals |
Spawn terminal session |
POST /tasks |
Create task |
POST /browser/start |
Start browser session |
POST /browser/sessions/{id}/agent/loop |
Multi-step browser agent |
POST /orchestrator |
Natural language command |
GET /processes |
List actions |
For AI assistants that support Model Context Protocol:
{
"mcpServers": {
"remote-dev-ctrl": {
"command": "python",
"args": ["-m", "remote_dev_ctrl.mcp.server"],
"env": { "PYTHONPATH": "/path/to/remote-dev-ctrl/src" }
}
}
}For accessing RDC from your phone or another machine:
- Cloudflare Tunnel - Exposes your local machine to the internet (free tier)
- Caddy - Routes subdomains locally (auto-downloaded by RDC)
# Install and configure cloudflared
brew install cloudflared
cloudflared tunnel login
cloudflared tunnel create rdc
# Add to ~/.rdc/config.yml
caddy:
enabled: true
base_domain: yourdomain.com
rdc_domain: rdc.yourdomain.com
listen_port: 8888
# Start
cloudflared tunnel run rdc
rdc server startDashboard at https://rdc.yourdomain.com. Enable auth with:
rdc config set-secret RDC_SECRET_KEY $(openssl rand -hex 32)Contributions welcome. Please open an issue first to discuss what you'd like to change.