Run AI coding agents from everywhere
A mobile-friendly web control panel for Claude Code and GitHub Copilot CLI
Features | Prerequisites | Quick Start | Docker | Remote Access | Configuration
RemoteAgent gives you a full interactive terminal to your AI coding agents from anywhere. Start a coding session on your desktop, continue it from your phone while grabbing coffee, and get push notifications when the agent needs your input.
| Feature | Description |
|---|---|
| Interactive Terminal | Full PTY terminal in your browser - type commands, respond to prompts, see real-time output |
| Mobile-First PWA | Designed for laptops, phones, and tablets |
| Session Persistence | Stop and resume conversations anytime |
| Push Notifications | Get notified when the agent needs input or finishes |
| Docker Sandboxing | Network-filtered container with domain allowlisting |
| Multi-Agent | Seamlessly switch between Claude Code and GitHub Copilot sessions |
Install only what you need based on how you plan to run RemoteAgent:
Skip this if you're using Docker only.
# Check if already installed
node --version # Should print v18.x or higher
# Install via nvm (recommended)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash
nvm install 20
# Or download directly from https://nodejs.orgRequired if you want to use Claude as your AI agent.
npm install -g @anthropic-ai/claude-code
# Authenticate (opens browser)
claude
# Then type: /loginYou need a Claude Pro, Max, or Team subscription, or an Anthropic API key.
See the Claude Code documentation for more details.
Required if you want to use Copilot as your AI agent.
npm install -g @github/copilot
# Authenticate
copilot
# Then type: /loginYou need a GitHub Copilot subscription.
Required only if you want to run RemoteAgent inside a container with network sandboxing.
# Check if already installed
docker --version
docker compose version
# Install Docker Desktop (Windows/Mac): https://www.docker.com/products/docker-desktop
# Install Docker Engine (Linux): https://docs.docker.com/engine/install/Only needed if you want to access RemoteAgent from your phone or another device outside your local network.
# Linux/macOS
curl -sL https://aka.ms/DevTunnelCliInstall | bash
# Windows
winget install Microsoft.devtunnel
# Authenticate with your GitHub or Microsoft account
devtunnel user login -gRun RemoteAgent directly on your machine. Requires Node.js 18+ and at least one CLI agent installed.
# 1. Clone the repository
git clone https://github.com/josecisneros001/RemoteAgent.git
cd RemoteAgent
# 2. Install dependencies
npm run install:all
# 3. Start in development mode
npm run devOpen http://localhost:3000 in your browser. From there:
- Add a workspace (point it to a project directory on your machine)
- Create a new session - choose Claude or Copilot as the agent
- Type a prompt and start coding
For production use:
npm run build
npm startRun RemoteAgent in a sandboxed container with network filtering. The container only allows outbound traffic to approved domains, preventing AI agents from accessing unauthorized resources.
Step 1: Clone and configure
git clone https://github.com/josecisneros001/RemoteAgent.git
cd RemoteAgent/dockerEdit docker-compose.yml to set your workspace path:
volumes:
# Change this to your project directory
- ~/your/projects/folder:/workspaceStep 2: Set up CLI authentication on your host
The container mounts your host CLI credentials so you don't need to re-authenticate inside Docker.
For Claude Code, make sure you've run claude and authenticated on your host machine. The container reads from:
~/.claude.json(auth token)~/.claude/(session data - mapped from~/.claude-docker/to avoid conflicts)~/.claude/settings.json(auto-copied and adapted for Docker)
For GitHub Copilot, authenticate on your host first. The container reads from:
~/.copilot-docker/(Copilot session data)~/.config/github-copilot/(auth config)
Step 3: Build and run
# Build and start the container (match your host user for file permissions)
HOST_UID=$(id -u) HOST_GID=$(id -g) docker compose up --buildThe container includes a Dev Tunnel sidecar that automatically exposes RemoteAgent for remote access. On first run, the tunnel service will print setup instructions to authenticate (one-time):
# One-time: login to Dev Tunnels inside the container
docker compose build
docker compose run --rm --entrypoint "" tunnel devtunnel user login -g -d
# Then start everything
docker compose up -dThe tunnel auto-starts with the app on every docker compose up and persists across reboots (restart: unless-stopped). To run the app without the tunnel:
docker compose up remote-agentStep 4: Verify
Open http://localhost:3000 and create a session. Check the container logs if anything goes wrong:
docker compose logs -f| Volume Mount | Purpose |
|---|---|
~/your/projects/folder:/workspace |
Your project files (the AI agent works here) |
./allowlist.json:/app/allowlist.json |
Allowed domains for network filtering (hot-reload) |
~/.claude.json:/home/agent/.claude.json |
Claude Code authentication token |
~/.claude-docker/:/home/agent/.claude/ |
Claude Code session data |
~/.claude/settings.json:/tmp/claude-settings.json:ro |
Claude settings (auto-adapted for Docker) |
~/.copilot-docker:/home/agent/.copilot |
Copilot CLI session data |
~/.config/github-copilot:/home/agent/.config/github-copilot |
Copilot authentication config |
~/.remote-agent-docker:/home/agent/.remote-agent |
RemoteAgent data (sessions, config) |
./logs:/var/log/dns |
DNS filter logs (optional, for debugging) |
tunnel-auth (Docker volume) |
Dev Tunnel auth tokens (persisted across restarts) |
Docker mode uses DNS-based filtering to restrict outbound network access:
- dnsmasq resolves only domains listed in
docker/allowlist.json - iptables blocks external DNS, FTP, SSH, and SMTP traffic
- HTTP and HTTPS traffic is allowed only to resolved (allowlisted) domains
Managing the allowlist:
# Edit the allowlist (changes apply automatically via hot-reload)
nano docker/allowlist.jsonThe default allowlist includes domains for Claude API, GitHub/Copilot API, common package registries (npm, PyPI, crates.io), and documentation sites.
To secure the allowlist so the AI agent can't modify it:
sudo chown root:root docker/allowlist.json
sudo chmod 644 docker/allowlist.jsonTo disable network filtering entirely, set in docker-compose.yml:
environment:
- ENABLE_NETWORK_FILTER=falseAccess RemoteAgent from your phone or any device outside your local network.
If you're running Docker, the tunnel sidecar is included in docker-compose.yml and starts automatically. See Docker Mode above for setup.
Dev Tunnels provides built-in authentication - only you can access the tunnel using your Microsoft or GitHub account. Each machine gets its own persistent tunnel URL (named remote-agent-<hostname>).
# Make sure you've authenticated (see Prerequisites)
devtunnel user login -g
# Start the tunnel
# Linux/macOS:
npm run tunnel
# Windows:
npm run tunnel:winOverride the tunnel name with the TUNNEL_NAME environment variable:
TUNNEL_NAME=my-custom-name npm run tunnelAny HTTPS tunneling service works with RemoteAgent. If you prefer Cloudflare Tunnel, ngrok, or another service, just point it at localhost:3000. Note that unlike Dev Tunnels, most alternatives require you to configure your own authentication to prevent unauthorized access.
RemoteAgent stores its configuration at ~/.remote-agent/config.json. This file is created automatically on first run. Workspaces are typically managed through the UI, but you can also edit the file directly.
{
"workspaces": [],
"defaultBrowsePath": "~/",
"port": 3000
}| Option | Type | Default | Description |
|---|---|---|---|
workspaces |
Array | [] |
Registered project directories. Each entry has id, name, and path. Typically managed through the UI. |
defaultBrowsePath |
String | home directory | Default folder shown when browsing for new workspaces in the UI. |
port |
Number | 3000 |
Port the server listens on. |
Push notification keys (
vapidPublicKey,vapidPrivateKey) are auto-generated on first start β you never need to set these manually.
RemoteAgent sends push notifications when the AI agent needs your input β so you can step away from the screen and get alerted on your phone or any subscribed device.
How it works:
- Claude sessions use Claude CLI's built-in Notification hook for reliable detection (auto-configured per session)
- Copilot sessions use idle-time heuristics (8 seconds of inactivity triggers a notification)
Setting up notifications:
- Open RemoteAgent in your browser (on each device you want notifications on)
- Click the π bell icon in the sidebar to open Notification Settings
- Click Subscribe and allow notifications when prompted
- Your device is automatically named (e.g., "Chrome on Windows", "Safari on iOS")
Managing devices:
The Notification Settings modal lets you manage all subscribed devices:
- Test β send a test notification to verify delivery
- Rename β give devices friendly names
- Delete β remove devices you no longer use
Stale subscriptions (e.g., from a browser you uninstalled) are automatically cleaned up when push delivery fails.
iOS note: On iOS, push notifications require installing RemoteAgent as a PWA first. Tap the Share button in Safari β Add to Home Screen, then open from the Home Screen and subscribe.
VAPID keys are generated automatically on first server start β no manual setup needed.
RemoteAgent/
βββ src/
β βββ server/ # Fastify + WebSocket backend
β β βββ services/
β β β βββ pty-manager.ts # Interactive terminal (node-pty)
β β β βββ git.ts # Branch/commit management
β β β βββ push.ts # Push notifications
β β βββ routes/api.ts # REST endpoints
β βββ client/ # React 19 + Vite frontend
β βββ src/components/
β βββ InteractiveTerminal/ # xterm.js terminal
β βββ SessionList/
β βββ NewSessionForm/
βββ docker/ # Docker + network filtering
β βββ Dockerfile
β βββ docker-compose.yml
β βββ allowlist.json # Allowed domains
β βββ entrypoint.sh # dnsmasq + iptables setup
βββ package.json
# Development with hot reload (server only)
npm run dev
# Watch both server and client with hot reload
npm run watch
# Production build
npm run build && npm startContributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
MIT License - see LICENSE for details.
Built for developers who code on the go


