Skip to main content
DimOS is a modular robotics runtime: you write small modules, wire them into a blueprint, and run that stack with dimos run. You usually compose existing modules first; you write new ones when you need custom sensors, planners, or skills.

Mental model

Flow in one line: write modules → compose with autoconnect() into a blueprint → dimos run <name> (or .build().loop() in Python)

Day 0: run something that already exists

See the Quickstart for full install options. Useful ops:
Start here if you just want a working stack. Building your own app usually means reusing these modules and blueprints, then extending them.

How you actually build applications

There are three layers. Most apps touch all of them eventually; you start at the top.

1. Compose blueprints (most common)

A blueprint is a frozen recipe of modules. You glue them with autoconnect(), which connects streams by (name, type) (e.g. both have color_image: Image).
Run it:
Or expose it so the CLI finds it (dimos run my-app):
  • In-repo: add a module-level blueprint variable and regenerate the registry (pytest dimos/robot/test_all_blueprints_generation.py)
  • External package: entry points under dimos.blueprints (see Blueprints)
You can nest blueprints (inherit a Go2 stack, swap one module, add skills):
Overrides: later duplicate wins; remappings rename streams; transports pick LCM vs shared memory for images, etc. This is the main “create my robotics application” path: pick existing modules (robot connection, cameras, mapping, agent, MCP), wire a blueprint, run it.

2. Write modules (when you need new capability)

A module is a Python class with lifecycle + streams:
Patterns you’ll use:
  • Sensors / hardware: produce Out[...] streams
  • Perception / planning: In + Out
  • Skill containers: @skill methods the agent can call
  • Cross-module RPC: declare a Spec Protocol; the blueprint injects the matching module at build time
Heavy things (robot drivers, voxel maps) often set dedicated_worker = True so they get their own process. You can also run a single module in-process for debugging (webcam demo in Modules) without a full blueprint.

3. Add agent skills (for LLM-driven robots)

@skill = RPC + tool schema for the agent. Docstring and type annotations are required.
Agentic blueprints usually include both:
  • McpServer.blueprint() - HTTP tools on port 9990
  • McpClient.blueprint(system_prompt=...) - LLM that calls those tools
Then:

Practical path: “my own robotics app”

A realistic sequence:
  1. Run a stock blueprint for your robot (or closest stack) and confirm hardware/replay works.
  2. Clone composition - copy a nearby blueprint under dimos/robot/.../blueprints/ (or an external package) and autoconnect only what you need.
  3. Add or swap modules - e.g. your camera, detector, custom planner.
  4. Wire mismatches with .remappings(...) when stream names differ.
  5. Expose behavior with @skill + update the system prompt if you use an agent.
  6. Run & debug with dimos log, topic tools, and Rerun (--viewer).
  7. Ship as a named blueprint (dimos list / entry point).
You do not need a full framework rewrite for every app. Most product apps are:
  • 80% composition of existing modules
  • 20% one custom module + skills

What goes where in the repo

Read next (in order):
  1. Modules - modules + connecting streams
  2. Blueprints - composition, remapping, skills, RPC
  3. Configuration - GlobalConfig / CLI / .env
  4. A real blueprint, e.g. Go2 agentic under dimos/robot/unitree/go2/blueprints/

Short answers