ARC Relay — WebSocket relay server for agent remote control by Axolotl AI
Project description
ARC — Agent Remote Control
Universal remote control for AI agent frameworks. Connect any agent to a browser-based interface for real-time monitoring and remote interaction.
Agent Support
| Agent | Status | Viewer → Agent | Agent → Viewer | How |
|---|---|---|---|---|
| Hermes Agent | ✅ Supported | ✅ Messages | ✅ Tool calls, responses, status | Native plugin + /remote-control |
| DeepAgent | 🔜 Planned | — | — | @axolotlai/arc-adapter-deepagent |
| OpenClaw | 🔜 Planned | — | — | @axolotlai/arc-adapter-openclaw |
| Claude Code | 🔜 Planned | — | — | Skill file |
Quick Start
# Install and configure
curl -fsSL https://raw.githubusercontent.com/axolotl-ai-cloud/arc/refs/heads/main/install.sh | sh
arc setup --hermes # uses hosted beta relay — no server needed
# Start Hermes, then type /remote-control
hermes
The /remote-control skill starts a session, opens the viewer in your browser, and streams all tool calls and responses to the viewer in real-time.
Note:
arc setup --hermespatches thehermesentrypoint to enable bidirectional viewer ↔ agent messaging. Ifhermes updateoverwrites the patch, runarc updateto re-apply it. Once NousResearch/hermes-agent#3778 is merged, the patch is unnecessary.
How It Works
Agent (Hermes, DeepAgent, OpenClaw, any)
│
│ WebSocket
▼
Relay Server (arc-beta.axolotl.ai or self-hosted)
│
│ WebSocket
▼
Web Viewer (browser)
• Live trace view (tool calls, messages, status)
• Send messages to the agent
• Approve/deny tool calls
Traces flow agent → relay → viewer. Commands flow viewer → relay → agent.
Self-Hosted Relay
For users who want to run their own relay server:
# Option 1: Docker
docker compose up relay
# Option 2: Python directly
pip install -r relay/requirements.txt
python -m relay
# Option 3: Use the CLI (handles everything)
arc setup --self-hosted
Environment Variables
# Required — set a fixed token, or one is auto-generated at startup
export AGENT_TOKEN="your-strong-random-token"
# Optional
export PORT=8600 # Listen port (default: 8600)
export MAX_SESSIONS=100 # Max concurrent sessions
export MAX_TRACE_LOG=2000 # Max trace events per session
export SESSION_TTL_HOURS=24 # Idle session cleanup
export ALLOWED_ORIGINS="*" # CORS origins (comma-separated)
export REQUIRE_TLS=false # Reject non-TLS connections
export AGENT_TOKEN_PREFIX="" # Accept prefix-based tokens (beta mode)
Running with ARC_ENV=dev
For local development, use ARC_ENV=dev to default to self-hosted mode:
# arc setup will default to localhost relay, auto-start it
ARC_ENV=dev arc setup --hermes
# Or start the relay manually
AGENT_TOKEN=dev-token python -m relay
# Then configure the CLI to use it
ARC_ENV=dev arc setup --self-hosted
Verify the relay is running
curl http://localhost:8600/health
# {"status": "ok", "sessions": 0}
Open http://localhost:8600/viewer to access the web viewer (if web-client is built).
Supported Frameworks
| Framework | Integration | How |
|---|---|---|
| Hermes Agent | Native Python plugin | /remote-control or arc_start_session tool |
| DeepAgent (LangChain) | TypeScript middleware | @axolotlai/arc-adapter-deepagent |
| OpenClaw | TypeScript plugin | @axolotlai/arc-adapter-openclaw |
| Claude Code | Skill file | /remote-control slash command |
CLI Commands
arc setup [--hermes|--self-hosted] # Configure relay URL, token, framework
arc config [--viewer|--relay|...] # Get or set individual config values
arc update # Pull, rebuild, reinstall skills
arc install-skill # Install /remote-control skill
arc status # Show current configuration
Choosing a Viewer
By default, viewer links point to the viewer bundled into your relay server — the same built-in React app served at /viewer on whatever relay you're connected to. This is the simplest setup and requires no extra configuration.
There are two reasons you might want a different viewer URL:
Use the OSS viewer on GitHub Pages — useful if you want to verify the viewer source code independently of the relay operator. The viewer is deployed directly from this repo via GitHub Actions and can be inspected at any commit:
arc config --viewer https://axolotl-ai-cloud.github.io/arc
# When a session starts: https://axolotl-ai-cloud.github.io/arc?relay=https://arc-beta.axolotl.ai&session=...&s=...
Use a locally running viewer — useful when developing the web client or running fully air-gapped:
# In one terminal: start the dev viewer
npm run dev:viewer # serves at http://localhost:5173
# In another terminal: point arc at it
arc config --viewer http://localhost:5173
# When a session starts: http://localhost:5173?relay=http://localhost:8600&session=...&s=...
Reset to the default relay-bundled viewer at any time:
arc config --viewer default
The viewer URL is stored in ~/.arc/config.json and can also be set via environment variable:
ARC_VIEWER_BASE=https://axolotl-ai-cloud.github.io/arc
Security Model
- Agent token — required to register sessions. Prevents unauthorized agents.
- Session secret — generated per-session, required for viewer subscription. Only share with trusted parties.
- Role enforcement — viewers can't send traces, agents can't send commands.
- Rate limiting — per-IP limits on HTTP (60/min) and WebSocket (120 msg/min).
- TLS — set
REQUIRE_TLS=truein production. - Prefix tokens — beta mode (
AGENT_TOKEN_PREFIX) gives each agent its own session namespace.
Extensibility
The relay is extensible via protocol interfaces:
from relay import create_app, RelayConfig
app = create_app(RelayConfig(
auth=MyAuthProvider(...), # Authenticate agents, viewers, admins
store=MySessionStore(...), # Persist session state
policy=MySessionPolicy(...), # Enforce session limits
hooks=MyLifecycleHooks(...), # React to session events
))
Project Structure
├── relay/ # OSS relay server (Python/FastAPI)
├── packages/
│ ├── protocol/ # Wire types, client, crypto
│ ├── cli/ # `arc` CLI (setup, connect, update)
│ ├── web-client/ # React SPA viewer
│ ├── adapter-hermes/ # Hermes Agent TypeScript adapter
│ ├── adapter-deepagent/ # DeepAgent adapter
│ └── adapter-openclaw/ # OpenClaw adapter
├── hermes-plugin/ # Native Hermes Python plugin
├── tests/ # Integration tests
├── install.sh # curl | sh installer
└── docker-compose.yml # Local dev
Testing
npm run test:ts # TypeScript tests
npm run test:py # Python tests (needs pytest, pytest-asyncio, httpx)
npm test # All tests
Roadmap
- Per-session authentication
- CLI with
arc setup//remote-control - Tool approval/deny from viewer
- Native Hermes Agent plugin with lifecycle hooks
- Beta relay with prefix-based tokens
- Web viewer auto-connect from URL params
- Viewer → agent message injection (pending Hermes PR)
- Mobile app (iOS/iPadOS)
- Multi-agent dashboard view
- Persistent trace storage
License
MIT. See 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 arc_relay-0.1.5.tar.gz.
File metadata
- Download URL: arc_relay-0.1.5.tar.gz
- Upload date:
- Size: 161.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
644a449d4222c811bf4308a65abd9ce5a1415b5d0256d92c7985aadc552ceab8
|
|
| MD5 |
3b396aa0e563e9f1a53cde8c87550d99
|
|
| BLAKE2b-256 |
f493634a142bed1972f19d6d671e22de1ef702f6ed16f96909eb74b5d05f7176
|
Provenance
The following attestation bundles were made for arc_relay-0.1.5.tar.gz:
Publisher:
publish-pypi.yml on axolotl-ai-cloud/arc
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
arc_relay-0.1.5.tar.gz -
Subject digest:
644a449d4222c811bf4308a65abd9ce5a1415b5d0256d92c7985aadc552ceab8 - Sigstore transparency entry: 1200480700
- Sigstore integration time:
-
Permalink:
axolotl-ai-cloud/arc@1addcec8d060ec8be66425384a07a243de6471f8 -
Branch / Tag:
refs/tags/v0.1.5 - Owner: https://github.com/axolotl-ai-cloud
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@1addcec8d060ec8be66425384a07a243de6471f8 -
Trigger Event:
push
-
Statement type:
File details
Details for the file arc_relay-0.1.5-py3-none-any.whl.
File metadata
- Download URL: arc_relay-0.1.5-py3-none-any.whl
- Upload date:
- Size: 25.8 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 |
c76887f89ddeed37b3fea9b753c38b2db344f570cd0588711f04ecdd6ee14c67
|
|
| MD5 |
01a4c43bd7bb6b70b2f65f5d0c339fa9
|
|
| BLAKE2b-256 |
11314389bf6ed6e2b93f5d5a37f27a924a0f2fddc2bd501b9638c0b876f6a208
|
Provenance
The following attestation bundles were made for arc_relay-0.1.5-py3-none-any.whl:
Publisher:
publish-pypi.yml on axolotl-ai-cloud/arc
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
arc_relay-0.1.5-py3-none-any.whl -
Subject digest:
c76887f89ddeed37b3fea9b753c38b2db344f570cd0588711f04ecdd6ee14c67 - Sigstore transparency entry: 1200480777
- Sigstore integration time:
-
Permalink:
axolotl-ai-cloud/arc@1addcec8d060ec8be66425384a07a243de6471f8 -
Branch / Tag:
refs/tags/v0.1.5 - Owner: https://github.com/axolotl-ai-cloud
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@1addcec8d060ec8be66425384a07a243de6471f8 -
Trigger Event:
push
-
Statement type: