Native Python. on_init finds chassis via atlas.find + cap.connect, declares own MCP tools (navigate / status / cancel from built-in robonix/service/navigation/*). Stub planner — replace with A* / Pure Pursuit / nav2.
skill
say_hello
Native Python. Owns its own contract under capabilities/ (IDL + toml). Single MCP tool the LLM dispatches via rbnx chat.
System services (atlas / executor / pilot / liaison / Soma) ship with
robonix-cli — rbnx boot spawns them automatically.
Prerequisites
Robonix dev installed from the
syswonder/robonix
repository with make install at the repository root. Run
rbnx setup <robonix_root> once so package build scripts can resolve the
source tree.
Python 3.10+ with grpcio-tools, mcp, fastmcp and PyYAML available.
Docker (for the primitive’s container).
A VLM endpoint reachable by pilot. Any OpenAI-compatible API works.
Quick start
git clone https://github.com/syswonder/template-rbnx.git
cd template-rbnx
cp .env.example .env
# Edit .env, then load it into the current shell.
set -a
source .env
set +a
# Build all 3 packages (codegen + docker image for the primitive).
rbnx build
# Bring up the whole stack. VLM creds can be in your shell rc or
# inlined on the command:
rbnx boot
In another terminal:
rbnx caps # list registered caps + their state
rbnx chat # talk to pilot — try "say hello to alice"
rbnx chat should pick up the say_hello skill and route your
prompt through it.
Each package’s config.spec documents the mapping accepted under its
config: entry in robonix_manifest.yaml. Keep it beside
package_manifest.yaml and describe every deployment-facing field with its
type, unit, default, meaning, and constraints. It is a human- and
tool-readable reference, not a second runtime schema: the package remains
responsible for parsing and validating the values.
Replace mock_chassis with your real driver: keep the same
contract IDs (robonix/primitive/chassis/{driver,move,twist_in,odom}),
swap the main.py body. Service consumers don’t need to change.
Replace my_navigate‘s planner: search for TODO(planner) in
main.py. The skeleton already wires init / dependency resolution
/ MCP tools — just fill the body.
Add a new skill: copy skills/say_hello/, change the contract
IDs under capabilities/, append to robonix_manifest.yaml.
template-rbnx — Robonix deployment template
Minimum viable Robonix deploy that boots end-to-end on a desktop without any robotic hardware or simulator. Clone, build, boot, chat.
Contains one of each package kind so you can see the full pattern:
primitivemock_chassis/odom, accepts/cmd_vel. Declares the built-inrobonix/primitive/chassis/*contracts.servicemy_navigateon_initfinds chassis viaatlas.find + cap.connect, declares own MCP tools (navigate / status / cancelfrom built-inrobonix/service/navigation/*). Stub planner — replace with A* / Pure Pursuit / nav2.skillsay_hellocapabilities/(IDL + toml). Single MCP tool the LLM dispatches viarbnx chat.System services (atlas / executor / pilot / liaison / Soma) ship with robonix-cli —
rbnx bootspawns them automatically.Prerequisites
devinstalled from thesyswonder/robonixrepository withmake installat the repository root. Runrbnx setup <robonix_root>once so package build scripts can resolve the source tree.grpcio-tools,mcp,fastmcpandPyYAMLavailable.Quick start
In another terminal:
rbnx chatshould pick up thesay_helloskill and route your prompt through it.Layout
Customizing
Each package’s
config.specdocuments the mapping accepted under itsconfig:entry inrobonix_manifest.yaml. Keep it besidepackage_manifest.yamland describe every deployment-facing field with its type, unit, default, meaning, and constraints. It is a human- and tool-readable reference, not a second runtime schema: the package remains responsible for parsing and validating the values.mock_chassiswith your real driver: keep the same contract IDs (robonix/primitive/chassis/{driver,move,twist_in,odom}), swap themain.pybody. Service consumers don’t need to change.my_navigate‘s planner: search forTODO(planner)inmain.py. The skeleton already wires init / dependency resolution / MCP tools — just fill the body.skills/say_hello/, change the contract IDs undercapabilities/, append torobonix_manifest.yaml.What gets bound to atlas
After
rbnx boot:mock_chassischassis/driver(grpc),chassis/twist_in(ros2),chassis/odom(ros2),chassis/move(grpc)my_navigatenavigation/driver(grpc),navigation/navigate(mcp),navigation/navigate/status(mcp),navigation/navigate/cancel(mcp)say_hellosay_hello/driver(grpc),say_hello/say(mcp)rbnx caps -vafter boot prints this same table from the live registry.