The Ecosystem
One ROBOT.md file. Any model. Real hardware.
OpenCastor is an open-source ecosystem for declaratively describing and operating physical robots. A single manifest at the root of your robot's project, language-agnostic runtimes, an MCP server so any LLM can drive it, and a public registry implementing the first five EU AI Act-aligned endpoints. Built almost entirely with Claude Code.
Architecture
The layered cake
Each layer is its own repo, its own release cadence, its own clear concern. The order matters — the protocol is the deepest because everything above it depends on it being stable. Surfaces are the shallowest because they're the easiest to add and the most likely to change.
┌─────────────────────────────────────────┐
│ Surfaces (Claude Code, Claude Desktop,│
│ Gemini CLI, Codex CLI, voice pendant…) │
└─────────────────────────────────────────┘
│
┌─────────────────────────────────────────┐
│ robot-md-mcp (MCP server) │
│ + robot-md-dispatcher (Agent SDK, │
│ remote dispatch, BYOK billing) │
└─────────────────────────────────────────┘
│
┌─────────────────────────────────────────┐
│ robot-md (manifest spec + CLI) │
└─────────────────────────────────────────┘
│
┌─────────────────────────────────────────┐
│ RCAN (rcan-spec, rcan-py, rcan-ts) │
└─────────────────────────────────────────┘
│
┌─────────────────────────────────────────┐
│ Robot │
└─────────────────────────────────────────┘
Off to the side:
┌─────────────────────────────────────────┐
│ Robot Registry Foundation │
│ (FRIA, safety benchmarks, IFU, │
│ incident reports, EU register) │
└─────────────────────────────────────────┘
Repositories
What lives in each layer
Eleven active repos across two GitHub orgs. Every one is open source.
Surfaces
Where humans and agents drive the robot
robot-md-mcp
MCP server — exposes ROBOT.md to Claude Desktop, Claude Code, Cursor, Zed, Gemini CLI, Codex CLI.
claude-code-plugins
Claude Code plugin marketplace. Hosts the `robot-md` plugin which bundles the `using-robot-md` Agent Skill and auto-registers robot-md-mcp.
robot-md-pendant
Touchscreen + voice pendant — ESP32-S3 AMOLED + Pi running Claude Agent SDK.
robot-md-dispatcher
BYOK Claude Agent SDK dispatcher — remote tasks over HTTPS, agent runs on the robot host.
robot-md-autoresearch
Karpathy-style nightly eval harness for ROBOT.md templates, Claude as the eval model.
robot-md-surfaces
Multi-vendor expansion — Google, OpenAI, Microsoft, Amazon adapters.
Manifest
The single self-describing file every layer depends on
Protocol
Wire-level robot communication semantics
Registry
Public compliance and identity layer — "like ICANN for the internet's domain names, but for physical machines"
Reference runtime
The original framework, still a first-class peer RCAN 3.x runtime against a single ROBOT.md
Method
Built with Claude Code
The point isn't that an LLM helped me write code. The point is that a one-person team — me — was able to ship and maintain a
multi-repo ecosystem because Claude Code's long-context behavior made the cascade tractable. Spec change in
rcan-spec ripples through
rcan-py and
rcan-ts; manifest schema change ripples through
robot-md,
robot-md-mcp, and every consumer. Claude Code holds the
context that would otherwise be split across a team.
The Anthropic-native bias of the surfaces (MCP server, Claude Code plugin marketplace, Agent SDK on the pendant and dispatcher, Claude as the exclusive eval model) is on purpose: every Anthropic primitive gets a first-class surface here. Other vendors get the same primitives, in their own paradigms, in their own focused weeks. Google is up next.
By the numbers
Safety & cryptography
Protocol-level guarantees, not just glue code
RCAN is designed for environments where authentication, replay, and revocation matter — drone swarms, manipulator arms, mobile robots talking over LoRa. A few of the load-bearing details from the spec:
Three signing profiles
Classical Ed25519, post-quantum pqc-v1, and hybrid pqc-hybrid-v1 — XOR of both, requires breaking both channels. Shipped in rcan-spec v2.3.0.
Three transport tiers
RCAN-HTTP (64 KB), RCAN-Compact (CBOR, 512 B), RCAN-Minimal (fixed 32 B binary). The 32-byte ESTOP frame fits in a single LoRa SF12 packet — ~1 s transmit at the lowest spread factor.
Hardware-token identity
FIDO2 / WebAuthn binding for human identity — Levels of Assurance 1, 2, 3. P66 manifest carries min_loa_for_control; safety scope can require LoA ≥ 3.
Replay-attack prevention
30-second sliding-window dedup on every signed envelope. Robot identity revocation broadcast as ROBOT_REVOCATION with a 1-hour TTL cache. (rcan-spec v1.5.)
Bounded delegation
Command delegation chains capped at 4 hops, every link Ed25519-signed. Consent wire protocol: CONSENT_REQUEST / GRANT / DENY.
ESTOP-priority QoS + offline mode
Exactly-once ESTOP delivery semantics. 300-second offline grace window, but ESTOP is always permitted — even when the robot can't reach the registry.
Every fact above lives in the canonical spec at continuonai/rcan-spec — see CHANGELOG entries for v1.5, v1.6, v2.3.
Compliance
Five RCAN spec sections, five live endpoints
The Robot Registry Foundation implements EU AI Act-aligned compliance blocks defined in the RCAN spec. Each block has a
canonical schema (the rcan-*-v1 family), a deterministic
canonical-JSON serialization, and Ed25519 signing — so submissions are verifiable end-to-end.
| RCAN § | Endpoint | Schema |
|---|---|---|
| §22 | FRIA — Fundamental Rights Impact Assessment | rcan-fria-v1 |
| §23 | Safety Benchmark Protocol | rcan-safety-benchmark-v1 |
| §24 | Instructions for Use (IFU) | rcan-ifu-v1 |
| §25 | Post-Market Monitoring / Incidents | rcan-incidents-v1 |
| §26 | EU Register Submission (Art. 49) | rcan-eu-register-v1 |
Identifier conventions
- RRN
- Robot Registration Number — per-instance identity. bob is
RRN-000000000001. - RMN
- Robot Model Number — per-model identity, used in §26 EU Register submissions. Art. 49 registration is per-model, not per-robot.
- RRN URI
- Resolvable form:
rrn://owner/category/model/id
A real ROBOT.md
bob, the SO-ARM101 on my desk
Excerpt from site/examples/bob.ROBOT.md in the robot-md repo.
This file is the single source of truth — every layer above (CLI, MCP server, dispatcher, Claude Code plugin, registry) consumes it.
---
rcan_version: "3.0"
schema: https://robotmd.dev/schema/v1/robot.schema.json
metadata:
robot_name: bob
rrn: RRN-000000000001
rrn_uri: rrn://craigm26/robot/opencastor-rpi5-hailo-soarm101/bob-001
ruri: rcan://robot.local:8001/bob
manufacturer: craigm26
model: opencastor-rpi5-hailo-soarm101
license: Apache-2.0
physics:
type: arm+camera
dof: 6
kinematics:
- id: shoulder_pan
axis: z
limits_deg: [-180, 180]
- id: shoulder_lift
axis: y
limits_deg: [-90, 90]
- id: elbow_flex
axis: y
limits_deg: [-90, 90]
- id: wrist_flex
axis: y
limits_deg: [-90, 90]
- id: wrist_roll
axis: x
limits_deg: [-180, 180]
- id: gripper
axis: y
limits_deg: [0, 90]
drivers:
- id: arm_servos
protocol: feetech
port: /dev/ttyUSB0
model: STS3215
count: 6
- id: camera
protocol: depthai
model: OAK-D
brain:
planning:
provider: anthropic
model: claude-opus-4-7
confidence_gate: 0.60
--- Shipped recently
A month of named releases
10 of the 67 releases shipped between 2026-04-01 and 2026-04-29 — the ones with the most consequential changes.
| Date | Repo | Tag | What shipped |
|---|---|---|---|
| 2026-04-29 | robot-md-autoresearch | v1.0 | foundation — Karpathy-style nightly eval harness for ROBOT.md templates |
| 2026-04-29 | rcan-ts | v3.4.2 | TypeScript SDK release — 593 tests |
| 2026-04-28 | robot-md | v1.2.5 | EU-register endpoint URL routing + RMN required |
| 2026-04-28 | robot-md | v1.2.4 | PyPI release — 1,100 tests |
| 2026-04-25 | robot-md-dispatcher | v0.2.0 | init wizard — pure OIDC trusted publishing |
| 2026-04-24 | robot-md-mcp | v0.3.0 | MCP server release |
| 2026-04-24 | rcan-py | v3.3.0 | Python SDK — whole-float canonical fix |
| 2026-04-17 | rcan-py | v2.0.0 | major: from_manifest() ROBOT.md cross-link |
| 2026-04-02 | rcan-spec | v2.3.1 | Robot Memory Schema |
| 2026-04-01 | rcan-spec | v2.3.0 | PQC Profiles (pqc-v1, pqc-hybrid-v1) |
Data pulled from the GitHub Releases API as of 2026-04-29. The full list (all 67) lives in each repo's /releases tab.
Consumer UX
Three-tier on-ramp, repeated everywhere
The first nine months were about getting the architecture right. The last two have been about the on-ramp — because it doesn't matter how good the schema is if a hobbyist gives up before their first successful tool call.
Zero-friction default
--yes gets you running with sensible defaults. No questions.
First run prints any one-time secret exactly once and never persists it.
robot-md init --yes
Guided
An init that explains every knob as it asks. For first-time
setup or anyone who wants to understand what they're choosing.
robot-md init
From inside the agent
A slash command from inside Claude Code that does the setup without printing secrets into the conversation. For operators who shouldn't be editing YAML.
/enable-dispatch
Where to start
If you have a robot on your desk
pip install robot-md robot-md-mcp
robot-md init --yes # one-shot, defaults
# OR
robot-md init # guided
Then point any MCP-aware client at robot-md-mcp and start asking it questions about your robot.
If you don't have a robot but want to read the spec
- → robotmd.dev — the manifest's own dev site ("the one-file declaration for agentic robots")
- → github.com/continuonai/rcan-spec — the wire protocol
- → github.com/RobotRegistryFoundation/robot-md — the manifest CLI
- → docs.opencastor.com — full documentation
- → robotregistryfoundation.org — the public registry