Open-source robot runtime — connect any AI model to any robot hardware through a single YAML config.
94,438 lines of Python · 7,334 tests · Python 3.10–3.13
OpenCastor is an open-source runtime for embodied AI. It implements the RCAN open protocol and handles the hard parts: safety gates, multi-provider AI routing, hardware drivers, messaging channels, and fleet management.
Point it at any LLM (Gemini, GPT-4.1, Claude, Ollama, and 13 more) and any robot body (Raspberry Pi, Jetson, Arduino, ESP32, LEGO) via a single YAML config. Your robot answers to WhatsApp, Telegram, Discord, Slack, and Home Assistant — and learns from its own experience through the Sisyphus self-improvement loop.
RCAN ≠ OpenCastor. RCAN is an independent open protocol — like DNS and ICANN, but for robotics. Any robot can implement RCAN without using OpenCastor. OpenCastor is one implementation that helped inform the spec.
pip install opencastor==2026.4.1.0castor setupThe wizard will:
- Name your robot and assign an RRN (Robot Registration Number)
- Generate a config file at
~/.config/opencastor/<name>.rcan.yaml - Show a QR code to connect to the Fleet UI at app.opencastor.com
- Configure your AI brain provider (Gemini, Claude, OpenAI, or local Ollama)
# Start the AI brain + REST API (port 8000)
castor gateway --config ~/.config/opencastor/bob.rcan.yaml
# Start the cloud bridge (connects robot to Fleet UI — outbound-only)
castor bridge --config ~/.config/opencastor/bob.rcan.yamlcastor bridge setup # generates and optionally installs systemd servicesdocker run -it \
-v ~/.config/opencastor:/config \
-e OPENCASTOR_CONFIG=/config/bob.rcan.yaml \
ghcr.io/craigm26/opencastor:2026.4.1.0 \
castor gateway| Profile | Description | Requires |
|---|---|---|
apple_native |
Mac with Apple Silicon (M1–M4) — runs models on-device via Apple Foundation Models. No API key needed. | macOS, Apple Silicon |
mlx_local_vision |
Mac with Apple Silicon — open-source models via MLX (Llama, Mistral, Qwen). More model choice than apple_native. | macOS, Apple Silicon |
ollama_universal_local |
Any machine — runs local models via Ollama. Works on Mac, Linux, and Windows. | Ollama installed |
On Apple Silicon, apple_native is the default. The wizard will ask which Apple model profile fits your use case:
| Apple Profile | Use case | Guardrails |
|---|---|---|
apple-balanced ⭐ |
General chat and robot commands — best starting point | Default |
apple-creative |
Creative tasks, less restrictive output | Permissive Content Transformations |
apple-tagging |
Classifying or labeling objects/scenes | Default |
- Protocol 66 safety — ESTOP never blocked, local safety always wins, confidence gates run on-device
- RCAN v1.6 — replay prevention, federation, constrained transport (BLE/LoRa), multi-modal payloads, Level of Assurance
- Multi-provider AI — Gemini, Claude, OpenAI, Ollama, MLX (Apple Silicon), Groq, DeepSeek, and 7 more; hot-swap via YAML
- Fleet UI — real-time fleet dashboard at app.opencastor.com; no port forwarding needed
- SO-ARM101 arm support — auto-detected via USB, guided setup for follower/leader/bimanual configurations
- 18 hardware presets — Raspberry Pi, Jetson, Arduino, ESP32, LEGO Mindstorms, OAK-D, LeRobot SO-ARM101, and more
- Self-improving loop — Sisyphus PM→Dev→QA→Apply pipeline learns from every episode
- Messaging channels — WhatsApp, Telegram, Discord, Slack, Home Assistant, MQTT
- castor setup wizard — guided onboarding with QR codes; works headless on Pi
[ app.opencastor.com / Fleet UI ]
│ Firebase / Firestore
│
[ Cloud Functions ] R2RAM enforcement + rate limiting
│
[ castor bridge ] outbound-only Firestore connection
│
[ castor gateway ] FastAPI REST + messaging channels
│
┌──────────────────────┐
│ Protocol 66 Safety │ ESTOP | confidence gates | bounds
└──────────────────────┘
│
[ Tiered Brain ] Gemini / Claude / GPT / Ollama / …
│
[ RCAN Config + Drivers ] .rcan.yaml → hardware abstraction
│
[ Robot Hardware ] Pi / Jetson / Arduino / SO-ARM101 / …
| Feature | Description |
|---|---|
| Replay prevention | Sliding-window msg_id cache; stale messages rejected |
| Federation | Cross-registry consent, DNS trust anchors, JWT verification |
| Constrained transport | Compact CBOR (512B), 32-byte ESTOP minimal for BLE/LoRa |
| Multi-modal payloads | Inline or referenced media chunks; streaming sensor data |
| Level of Assurance | LoA 1/2/3 on operator JWTs; configurable minimum per scope |
| Command | Description |
|---|---|
castor setup |
Interactive onboarding wizard — config, RRN, Fleet UI QR code |
castor gateway |
Start AI brain + REST API + messaging channels |
castor bridge |
Start cloud bridge (Fleet UI connection) |
castor scan |
Auto-detect connected hardware (USB, I2C, V4L2) |
castor doctor |
System health check — providers, channels, hardware |
castor fix |
Auto-fix common configuration issues |
castor status |
Provider and channel readiness summary |
castor improve |
Run Sisyphus self-improvement on recent episodes |
castor audit --verify |
Verify audit chain integrity |
castor approvals |
Review and approve pending high-risk commands |
castor deploy |
Push config to a remote robot over SSH |
castor fleet |
Discover and monitor all robots on the local network |
castor upgrade |
Pull latest version + pip install + service restart |
Full reference: docs.opencastor.com/runtime/cli
Minimal bob.rcan.yaml:
rcan_version: "1.6"
metadata:
robot_name: bob
agent:
provider: google
model: gemini-2.5-flash
drivers:
- id: wheels
protocol: pca9685
channels: {}That's it. castor gateway --config bob.rcan.yaml starts the REST API, messaging channels, and the self-improving loop.
Swap the AI brain with one line:
agent:
provider: anthropic
model: claude-sonnet-4-6Protocol 66 is RCAN's mandatory safety layer. Current OpenCastor conformance: 94%.
Key invariants:
- ESTOP delivered at QoS 2 (EXACTLY_ONCE) — never blocked by backpressure
- Local safety always wins — cloud commands pass through the same confidence gates as local commands
- Audit chain required for all flagged commands
GuardianAgenthas veto authority over unsafe actions
P66 manifest: sbom/ · Full spec: rcan.dev/docs/safety/
app.opencastor.com — sign in with Google to see your fleet.
- Real-time status cards for all registered robots
- Robot detail: telemetry, command history, chat-scope instructions
- ESTOP button on every screen
- Consent management — approve/deny R2RAM access requests
- Revocation display — shows if a robot's identity has been revoked
- LoA display — shows operator Level of Assurance on control commands
Robots connect via castor bridge (outbound-only Firestore). No open ports on the robot side.
The LeRobot SO-ARM101 6-DOF serial bus servo arm is auto-detected via USB VID/PID (CH340, 0x1A86/0x7523).
pip install opencastor[lerobot]
castor scan # detects arm + suggests preset
castor wizard --preset so_arm101 # guided config: follower / leader / bimanual
castor gateway --config so_arm101.rcan.yamlcastor scan counts connected Feetech boards and automatically suggests the right preset: single arm (follower or leader), or bimanual pair (ALOHA-style). Koch arms use the same detection path.
| Project | Version | Purpose |
|---|---|---|
| OpenCastor (this) | v2026.3.17.13 | Robot runtime, RCAN reference implementation |
| Fleet UI | live | Web fleet dashboard |
| RCAN Protocol | v1.6.0 | Open robot communication standard |
| rcan-py | v0.6.0 | Python RCAN SDK |
| rcan-ts | v0.6.0 | TypeScript RCAN SDK |
| Robot Registry Foundation | v1.6.0 | Global robot identity registry |
OpenCastor is Apache 2.0 and community-driven.
- Discord: discord.gg/jMjA8B26Bq
- Issues: github.com/craigm26/OpenCastor/issues
- PRs: See CONTRIBUTING.md
- Docs:
docs/claude/— structure, API reference, env vars
Apache 2.0 · by Craig Merry
Implements the RCAN open protocol. RCAN is an independent open standard — any robot or runtime can implement it.