RDC - Remote Dev Ctrl
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.
Why RDC?
- 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
Quick Start
# Install from PyPI
pip install rdc
rdc setup # Guided config: API keys, presets, remote access
rdc server start # Open http://localhost:8420
Or install from source:
# One-line install (clones, installs deps, builds, runs guided setup)
curl -sSL https://raw.githubusercontent.com/dawalama/remote-dev-ctrl/main/install.sh | bash
# Or manual:
git clone https://github.com/dawalama/remote-dev-ctrl.git
cd remote-dev-ctrl
uv sync && cd frontend && pnpm install && pnpm run build && cd ..
rdc setup
rdc server start
Prerequisites
Python 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
Features
Three Layouts, All First-Class
| Desktop | Mobile | Kiosk |
|---|---|---|
| IDE-like split view | Card-based, touch-optimized | Tablet sidebar + terminal |
| Terminal + sidebar tabs | Fullscreen terminal overlay | Collapsible side panels |
Terminal Management
- 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
Browser Automation
- 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
Actions (Services & Commands)
- 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
AI Orchestrator
Natural language control via chat:
- "Start a terminal for my-project"
- "Show running tasks"
- "Switch to kiosk mode"
Remote Access
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.
Architecture
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
Configuration
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.5
API keys go in the vault, not config files:
rdc config set-secret ANTHROPIC_API_KEY sk-ant-...
CLI
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 securely
API
Interactive 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 |
MCP Integration
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" }
}
}
}
Remote Access Setup
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 start
Dashboard at https://rdc.yourdomain.com. Enable auth with:
rdc config set-secret RDC_SECRET_KEY $(openssl rand -hex 32)
Contributing
Contributions welcome. Please open an issue first to discuss what you'd like to change.
License
Metadata
Release files for rdc 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| rdc-0.3.0.tar.gz | 1.3 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| rdc-0.3.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 2.0 MB
Release files / rdc-0.3.0.tar.gz
| Download URL | rdc-0.3.0.tar.gz |
|---|---|
| Size | 1.3 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
469c7701f699a5d12139001bb1d971cc5af630655d12994e48bbea8f1c1b058e
|
|
BLAKE2b-256 checksum How to use checksums |
bc71471f6cd7a616a9435492c7fa3dd4769e108d3d853bd37642f78573fb7d6d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Apr 24, 2026.
Transparency logRelease files / rdc-0.3.0-py3-none-any.whl
| Download URL | rdc-0.3.0-py3-none-any.whl |
|---|---|
| Size | 675.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
3853c35b636d1cab24ce85e845ee969f096d0ae7399a5e8d65367388adbdab79
|
|
BLAKE2b-256 checksum How to use checksums |
d7ffadc2c978d7e875568c1aa9d1659ef187d0efc6f6eb2616afde11b1d25f98
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Apr 24, 2026.
Transparency log