Command center for AI-assisted development. Manage multiple AI coding agents from any device.
Project description
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
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file rdc-0.1.1.tar.gz.
File metadata
- Download URL: rdc-0.1.1.tar.gz
- Upload date:
- Size: 1.2 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
461a48f33dae6ca694fec16728367e759bac11479b40da744334b586cb7eaca5
|
|
| MD5 |
d2a7d26c3fe83a3e0cfd970bc62e2f0d
|
|
| BLAKE2b-256 |
e296d4c86af2cf0cb3500f7dc91e27eab6cc56a32542a0d6340af3c66c7c744d
|
Provenance
The following attestation bundles were made for rdc-0.1.1.tar.gz:
Publisher:
publish.yml on dawalama/remote-dev-control
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
rdc-0.1.1.tar.gz -
Subject digest:
461a48f33dae6ca694fec16728367e759bac11479b40da744334b586cb7eaca5 - Sigstore transparency entry: 1219103045
- Sigstore integration time:
-
Permalink:
dawalama/remote-dev-control@acf082ad067a5e82a8b54c1f1d4d98f1ba7abe4f -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/dawalama
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@acf082ad067a5e82a8b54c1f1d4d98f1ba7abe4f -
Trigger Event:
release
-
Statement type:
File details
Details for the file rdc-0.1.1-py3-none-any.whl.
File metadata
- Download URL: rdc-0.1.1-py3-none-any.whl
- Upload date:
- Size: 620.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2973aea5b754602e5a53cbf55bea3a848686b4c722196c7ef3eb3f0ed377d01c
|
|
| MD5 |
4b83ecc19862b86be777377f51db90b4
|
|
| BLAKE2b-256 |
5c789ec5d4d700f1a28c698d264cea57bbc77045442d8ae36275c7d932d979fb
|
Provenance
The following attestation bundles were made for rdc-0.1.1-py3-none-any.whl:
Publisher:
publish.yml on dawalama/remote-dev-control
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
rdc-0.1.1-py3-none-any.whl -
Subject digest:
2973aea5b754602e5a53cbf55bea3a848686b4c722196c7ef3eb3f0ed377d01c - Sigstore transparency entry: 1219103084
- Sigstore integration time:
-
Permalink:
dawalama/remote-dev-control@acf082ad067a5e82a8b54c1f1d4d98f1ba7abe4f -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/dawalama
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@acf082ad067a5e82a8b54c1f1d4d98f1ba7abe4f -
Trigger Event:
release
-
Statement type: