Built and maintained with agentic engineering – AI agents do the heavy lifting on code generation, reviews, refactoring, and testing; humans set direction and gate every merge.
10-17x faster than ROS2 Python – 100% Rust internals with zero-copy shared memory IPC for messages >4KB, flat latency from 4KB to 4MB payloads
Zenoh SHM data plane – nodes publish directly via Zenoh shared memory, bypassing the daemon for 35% lower latency and 3-10x higher throughput on large payloads; automatic network fallback for cross-machine
Apache Arrow native – columnar memory format end-to-end with zero serialization overhead; optional Arrow IPC framing for self-describing wire format; shared across all language bindings
Non-blocking event loop – Zenoh publishes offloaded to a dedicated drain task; control commands respond in <500ms even under high data throughput
Developer experience
Single CLI, full lifecycle – dora run for local dev, dora up/start for distributed prod, plus build, logs, monitoring, record/replay all from one tool
Declarative YAML dataflows – define pipelines as directed graphs, connect nodes through typed inputs/outputs, optional type annotations with static validation, override with environment variables
Multi-language nodes – write nodes in Rust, Python, C, or C++ with native APIs (not wrappers); mix languages freely in one dataflow
Reusable modules – compose sub-graphs as standalone YAML files with typed inputs/outputs, parameters, optional ports, and nested composition (compile-time expansion, zero runtime overhead)
Hot reload – live-reload Python operators without restarting the dataflow
Programmatic builder – construct dataflows in Python code as an alternative to YAML
Production readiness
Fault tolerance – per-node restart policies (never/on-failure/always), exponential backoff, health monitoring, circuit breakers with configurable input timeouts
Distributed by default – local shared memory between co-located nodes, automatic Zenoh pub-sub for cross-machine communication, SSH-based cluster management with label scheduling, rolling upgrades, and auto-recovery
Coordinator HA – persistent redb-backed state store (default), daemon auto-reconnect with exponential backoff, dataflow records survive coordinator restart (running dataflow reclaim-across-restart is partial, see the open issue tracker)
Dynamic topology – add and remove nodes from running dataflows via CLI (dora node add/remove/connect/disconnect) without restarting
Soft real-time – optional --rt flag for mlockall + SCHED_FIFO; per-node cpu_affinity pinning in YAML; comprehensive tuning guide for memory locking, kernel params, and container deployment
OpenTelemetry – built-in structured logging with rotation/routing, metrics, distributed tracing, and zero-setup trace viewing via CLI
Debugging and observability
Record/replay – capture dataflow messages to .drec files, replay offline at any speed with node substitution for regression testing
Topic inspection – topic echo to print live data, topic hz TUI for frequency analysis, topic info for schema and bandwidth
Resource monitoring – dora top TUI showing per-node CPU, memory, queue depth, network I/O, restart count, and health status across all machines; --once flag for scriptable JSON snapshots
Trace inspection – trace list and trace view for viewing coordinator spans without external infrastructure
Dataflow visualization – generate interactive HTML or Mermaid graphs from YAML descriptors
ROS2 bridge – bidirectional topics, services, and actions over DDS or native rmw_zenoh_cpp-compatible Zenoh; QoS mapping; Arrow-native type conversion
Node Hub (package manager) – pull a reusable node into a dataflow with one line – hub: dora-yolo@^0.5 – with cargo-style versioned resolution, reproducible lockfiles (--locked), and typed contracts checked at build time; backed by a git-based public catalog of ready-made nodes for cameras, YOLO, LLMs, TTS, and more. See the Hub guide(unstable)
In-process operators – lightweight functions that run inside a shared runtime, avoiding per-node process overhead for simple transformations
git clone https://github.com/dora-rs/dora.git
cd dora
cargo build --release -p dora-cli
PATH=$PATH:$(pwd)/target/release
# Python API (requires maturin >= 1.8: pip install maturin)
# Must run from the package directory for dependency resolution
cd apis/python/node && maturin develop --uv && cd ../../..
Platform installers
macOS / Linux:
curl --proto '=https' --tlsv1.2 -LsSf \
https://github.com/dora-rs/dora/releases/latest/download/dora-cli-installer.sh | sh
Important: The PyPI package is dora-rs, not dora. The import name
is dora (from dora import Node), but pip install dora installs an
unrelated package.
cargo install dora-cli # or use install script below
pip install dora-rs numpy pyarrow
git clone https://github.com/dora-rs/dora.git && cd dora
dora run examples/python-dataflow/dataflow.yml
This runs a sender -> transformer -> receiver pipeline. Here’s what the Python node code looks like:
# sender.py -- sends messages and polls for STOP
from dora import Node
import pyarrow as pa
import time
node = Node()
sent = 0
while sent < 100:
event = node.try_recv()
if event is not None and event["type"] == "STOP":
break
node.send_output("message", pa.array([sent]))
sent += 1
time.sleep(0.1)
# receiver.py -- receives and prints messages
from dora import Node
node = Node()
for event in node:
if event["type"] == "INPUT":
print(f"Got {event['id']}: {event['value'].to_pylist()}")
elif event["type"] == "STOP":
break
# Terminal 1: start coordinator + daemon
dora up
# Terminal 2: start a dataflow (--debug enables topic inspection)
dora start dataflow.yml --attach --debug
# Terminal 3: monitor
dora list
dora logs <dataflow-id>
dora top
# Stop or restart
dora stop <dataflow-id>
dora restart --name <name>
dora down
4. Managed cluster
# Bring up a multi-machine cluster from a config file
dora cluster up cluster.yml
# Start a dataflow across the cluster
dora start dataflow.yml --name my-app --attach
# Check cluster health
dora cluster status
# Tear down
dora cluster down
See the Distributed Deployment Guide for cluster.yml configuration, label scheduling, systemd services, rolling upgrades, and operational runbooks. The network side — one LAN, a VPN mesh, or isolated subnets joined by zenoh routers — is the Multi-machine Guide.
CLI Commands
Lifecycle
Command
Description
dora run <PATH>
Run a dataflow locally (no coordinator/daemon needed)
dora up
Start coordinator and daemon in local mode
dora down
Tear down coordinator and daemon
dora build <PATH>
Run build commands from a dataflow descriptor
dora start <PATH>
Start a dataflow on a running coordinator
dora stop <ID>
Stop a running dataflow
dora restart <ID>
Restart a running dataflow (stop + re-start)
Monitoring
Command
Description
dora list
List running dataflows (alias: ps)
dora clean
Remove finished and failed dataflows from the coordinator
dora logs <ID> [--node <NAME>]
Show logs for a dataflow or node
dora top
Real-time resource monitor (TUI); also dora inspect top
dora topic list
List topics in a dataflow
dora topic hz <TOPIC>
Measure topic publish frequency (TUI)
dora topic echo <TOPIC>
Print topic messages to stdout
dora topic info <TOPIC>
Show topic type and metadata
dora node list
List nodes in a dataflow
dora node info <NODE>
Show detailed node status, inputs, outputs, and metrics
dora node add --from-yaml <FILE>
Add a node to a running dataflow
dora node remove <NODE>
Remove a node from a running dataflow
dora node connect <SRC> <DST>
Add a live mapping between nodes
dora node disconnect <SRC> <DST>
Remove a live mapping between nodes
dora node restart <NODE>
Restart a single node within a running dataflow
dora node stop <NODE>
Stop a single node within a running dataflow
dora topic pub <TOPIC> <DATA>
Publish JSON data to a topic
dora param list <NODE>
List runtime parameters for a node
dora param get <NODE> <KEY>
Get a runtime parameter value
dora param set <NODE> <KEY> <VALUE>
Set a runtime parameter (JSON value)
dora param delete <NODE> <KEY>
Delete a runtime parameter
dora trace list
List recent traces captured by the coordinator
dora trace view <ID>
View spans for a specific trace (supports prefix matching)
dora record <PATH>
Record dataflow messages to .drec file
dora replay <FILE>
Replay recorded messages from .drec file
Cluster management
Command
Description
dora cluster up <PATH>
Bring up a cluster from a cluster.yml file
dora cluster status
Show connected daemons and active dataflows
dora cluster down
Tear down the cluster
dora cluster install <PATH>
Install daemons as systemd services
dora cluster uninstall <PATH>
Remove systemd services
dora cluster upgrade <PATH>
Rolling upgrade: SCP binary + restart per-machine
dora cluster restart <NAME>
Restart a dataflow by name or UUID
Setup and utilities
Command
Description
dora doctor
Diagnose environment, connectivity, and dataflow health
Built-in timer nodes:dora/timer/millis/<N> and dora/timer/hz/<N>.
Input format:<node-id>/<output-name> to subscribe to another node’s output. Long form supports queue_size, queue_policy (drop_oldest or backpressure), and input_timeout. See the YAML Specification for details.
Type annotations: Optionally annotate ports with type URNs for static and runtime validation. See the Type Annotations Guide for the full type library.
dora validate dataflow.yml # static check (warnings)
dora validate --strict-types dataflow.yml # fail on warnings (CI)
dora build dataflow.yml --strict-types # type check during build
DORA_RUNTIME_TYPE_CHECK=warn dora run dataflow.yml # runtime check
Modules: Extract reusable sub-graphs into separate files with module: instead of path:. See the Modules Guide for details.
PR-gated — every PR to main runs these tests; merge is blocked on failure.
Nightly-gated — the daily scheduled run (.github/workflows/nightly.yml) runs these. A failure auto-files a nightly-regression issue but does NOT block PRs.
Not gated — no automated CI coverage. Regressions surface via user reports.
dora new --lang rust/python template tests run in nightly across all three platforms;
C/C++ variants run in nightly on Linux only. Developers who need cross-platform
verification before merge can run make qa-test / make qa-examples / make qa-nightly
locally. See docs/testing-matrix.md for the full rationale.
Closed-loop ArduCopter SITL: arm + takeoff + hover + land driven from a Python dora node (Ubuntu / macOS, local-only)
Development
Rust edition 2024; MSRV and default workspace package metadata are
tracked in [workspace.package] of the root Cargo.toml. Most crates
inherit the workspace version via version.workspace = true; a handful
(e.g. apis/rust/operator/types, the examples/error-propagation/*
samples) pin their own version independently.
Build
# Build all (excluding Python packages which require maturin)
cargo build --all \
--exclude dora-node-api-python \
--exclude dora-operator-api-python \
--exclude dora-ros2-bridge-python
# Build specific package
cargo build -p dora-cli
Test
# Run all tests
cargo test --all \
--exclude dora-runtime-python \
--exclude dora-node-api-python \
--exclude dora-operator-api-python \
--exclude dora-ros2-bridge-python
# Test single package
cargo test -p dora-core
# Smoke tests (requires coordinator/daemon)
cargo test --test example-smoke -- --test-threads=1
Lint and format
cargo clippy --all
cargo fmt --all -- --check
Run examples
cargo run --example rust-dataflow
cargo run --example python-dataflow
cargo run --example benchmark --release
Quality assurance
Dora ships with a three-tier QA system designed for AI-authored code. Everything runs locally first; CI mirrors the same scripts.
make qa-install # one-time: install cargo-audit, cargo-deny, cargo-llvm-cov, cargo-mutants, cargo-semver-checks
make qa-fast # ~15s -- fmt + clippy + audit + unwrap-budget + secret-files + typos + publish-graph (pre-commit)
make qa-full # ~5-10m -- qa-fast + tests + coverage (pre-push)
make qa-deep # ~15m -- qa-full + mutation testing + semver (target Tier 1 gate, stronger than today's CI; alias: qa-tier1)
make qa-nightly # ~3-4h -- qa-deep + proptest@1000 + miri + example-smoke + ci-nightly-jobs (full parity with .github/workflows/nightly.yml)
make qa-release-gate # -- qa-deep + semver (Tier 3 automatable; audit/dogfood are human)
make qa-mutation-audit # ~10-18h -- full-repo cargo-mutants; deliberate test-quality audit
make qa-examples # ~15-20m -- run all smoke-eligible example dataflows end-to-end (skips CUDA/ROS2/C++/interactive)
On Ubuntu, install ripgrep separately and install typos-cli with Cargo:
Unwrap ratchet – counts .unwrap() / .expect( in production code; can only go down (.unwrap-budget)
Coverage – cargo-llvm-cov with diff-coverage gate (70% on PR-touched lines)
Mutation testing – cargo-mutants against critical crates (library crates at package scope, binary crates with test_workspace = true)
Property testing – proptest on wire-protocol types; catches edge cases unit tests miss
Miri – UB detection on pure-Rust unsafe hotspots (e.g., dora-core::metadata)
SemVer check – cargo-semver-checks against the last git tag
Breaking-change gate – every surface dora 1.x freezes, diffed against the last release tag: the C header, the cxx bridge, the dataflow YAML schema, the postcard wire format, the dora command, the Python floor, and the Rust API of the covered crates. Runs on every PR; the surface half needs no build (make qa-breaking)
Adversarial LLM review – scripts/qa/adversarial.sh runs a different model on your diff to catch single-model blind spots (local today; CI pending API secret)
POC Report – case studies, metrics, lessons learned, recommendations for the wider ecosystem
Contributing
We welcome contributors of all experience levels. See the contributing guide to get started.
For non-trivial work, discuss the approach in a GitHub issue, discussion, or Discord thread before implementing it. Before opening or updating a PR, run the QA level appropriate for the change and include the validation you ran in the PR description. The Contributor QA Cheat Sheet is the fastest day-to-day reference; the stricter per-change policy lives in docs/agentic-qa-policy.md.
This repository is built with agentic engineering. AI agents collaborate on day-to-day work – code generation, reviews, refactoring, testing, drafting PR comments, triaging nightly regressions – while maintainers set direction, review judgments, and authorize what ships. The two roles compound: AI agents move fast on mechanical work; humans catch the things that matter.
DORA (Dataflow-Oriented Robotic Architecture) is middleware designed to streamline and simplify the creation of AI-based robotic applications. It offers low latency, composable, and distributed datafl
English | 简体中文
Website | Python API | Rust API | Guide | Discord
dora 1.0 is out. Read the 1.0 release post.
Dora
Agentic Dataflow-Oriented Robotic Architecture – a 100% Rust framework for building real-time robotics and AI applications.
User Guide | 用户指南 (中文)
Table of Contents
Features
Performance
Developer experience
dora runfor local dev,dora up/startfor distributed prod, plus build, logs, monitoring, record/replay all from one toolProduction readiness
dora node add/remove/connect/disconnect) without restarting--rtflag for mlockall + SCHED_FIFO; per-nodecpu_affinitypinning in YAML; comprehensive tuning guide for memory locking, kernel params, and container deploymentDebugging and observability
.drecfiles, replay offline at any speed with node substitution for regression testingtopic echoto print live data,topic hzTUI for frequency analysis,topic infofor schema and bandwidthdora topTUI showing per-node CPU, memory, queue depth, network I/O, restart count, and health status across all machines;--onceflag for scriptable JSON snapshotstrace listandtrace viewfor viewing coordinator spans without external infrastructureEcosystem
rmw_zenoh_cpp-compatible Zenoh; QoS mapping; Arrow-native type conversionhub: dora-yolo@^0.5– with cargo-style versioned resolution, reproducible lockfiles (--locked), and typed contracts checked at build time; backed by a git-based public catalog of ready-made nodes for cameras, YOLO, LLMs, TTS, and more. See the Hub guide (unstable)Installation
From crates.io (recommended)
From source
Platform installers
macOS / Linux:
Windows:
Build features
tracingmetricspythonredb-backendQuick Start
1. Run a Python dataflow
This runs a sender -> transformer -> receiver pipeline. Here’s what the Python node code looks like:
See the Python Getting Started Guide for a full tutorial, or the Python API Reference for complete API docs.
2. Run a Rust dataflow
3. Distributed mode (ad-hoc)
4. Managed cluster
See the Distributed Deployment Guide for cluster.yml configuration, label scheduling, systemd services, rolling upgrades, and operational runbooks. The network side — one LAN, a VPN mesh, or isolated subnets joined by zenoh routers — is the Multi-machine Guide.
CLI Commands
Lifecycle
dora run <PATH>dora updora downdora build <PATH>dora start <PATH>dora stop <ID>dora restart <ID>Monitoring
dora listps)dora cleandora logs <ID> [--node <NAME>]dora topdora inspect topdora topic listdora topic hz <TOPIC>dora topic echo <TOPIC>dora topic info <TOPIC>dora node listdora node info <NODE>dora node add --from-yaml <FILE>dora node remove <NODE>dora node connect <SRC> <DST>dora node disconnect <SRC> <DST>dora node restart <NODE>dora node stop <NODE>dora topic pub <TOPIC> <DATA>dora param list <NODE>dora param get <NODE> <KEY>dora param set <NODE> <KEY> <VALUE>dora param delete <NODE> <KEY>dora trace listdora trace view <ID>dora record <PATH>.drecfiledora replay <FILE>.drecfileCluster management
dora cluster up <PATH>dora cluster statusdora cluster downdora cluster install <PATH>dora cluster uninstall <PATH>dora cluster upgrade <PATH>dora cluster restart <NAME>Setup and utilities
dora doctordora statuscheck)dora newdora graph <PATH>dora expand <PATH>dora validate <PATH>dora systemdora completion <SHELL>dora self updateNode Hub (unstable)
dora hub search <query>dora hub info <pkg>[@<ver>]dora hub init [PATH]dora-node.ymlmanifestdora hub publish [PATH]--dry-run)dora hub yank <pkg>@<ver>--undo)dora hub list/outdated/update <dataflow>dora hub fetch <target>Reference a node with one line of YAML –
hub: dora-yolo@^0.5– anddora buildresolves, pins, and type-checks it. See the Hub guide.For full CLI documentation, see docs/cli.md. For running a dataflow across several machines, start with docs/multi-machine.md; for cluster management, see docs/distributed-deployment.md.
Dataflow Configuration
Dataflows are defined in YAML. Each node declares its binary/script, inputs, and outputs:
Built-in timer nodes:
dora/timer/millis/<N>anddora/timer/hz/<N>.Input format:
<node-id>/<output-name>to subscribe to another node’s output. Long form supportsqueue_size,queue_policy(drop_oldestorbackpressure), andinput_timeout. See the YAML Specification for details.Type annotations: Optionally annotate ports with type URNs for static and runtime validation. See the Type Annotations Guide for the full type library.
Modules: Extract reusable sub-graphs into separate files with
module:instead ofpath:. See the Modules Guide for details.Architecture
Key components
Workspace layout
Language Support
dora-node-apidora-operator-apipip install dora-rsdora-node-api-cdora-operator-api-cdora-node-api-cxxdora-operator-api-cxxdora-ros2-bridgePlatform support
Gate meanings (#1716):
mainruns these tests; merge is blocked on failure..github/workflows/nightly.yml) runs these. A failure auto-files anightly-regressionissue but does NOT block PRs.dora new --lang rust/pythontemplate tests run in nightly across all three platforms; C/C++ variants run in nightly on Linux only. Developers who need cross-platform verification before merge can runmake qa-test/make qa-examples/make qa-nightlylocally. Seedocs/testing-matrix.mdfor the full rationale.Examples
Core language examples
Composition
dora validateCommunication patterns
request_idcorrelationSee docs/patterns.md for the full guide.
Dynamic topology
Advanced patterns
Logging
dora/logsPerformance
ROS2 integration
MAVLink 2 integration
--uv)cargo run --example mavlink2-bridge-cxx)Development
Rust edition 2024; MSRV and default workspace package metadata are tracked in
[workspace.package]of the rootCargo.toml. Most crates inherit the workspace version viaversion.workspace = true; a handful (e.g.apis/rust/operator/types, theexamples/error-propagation/*samples) pin their own version independently.Build
Test
Lint and format
Run examples
Quality assurance
Dora ships with a three-tier QA system designed for AI-authored code. Everything runs locally first; CI mirrors the same scripts.
On Ubuntu, install
ripgrepseparately and installtypos-cliwith Cargo:Gates in place:
cargo-audit+cargo-denyfor CVEs, license policy, dependency bans.unwrap()/.expect(in production code; can only go down (.unwrap-budget)cargo-llvm-covwith diff-coverage gate (70% on PR-touched lines)cargo-mutantsagainst critical crates (library crates at package scope, binary crates withtest_workspace = true)propteston wire-protocol types; catches edge cases unit tests missdora-core::metadata)cargo-semver-checksagainst the last git tagdoracommand, the Python floor, and the Rust API of the covered crates. Runs on every PR; the surface half needs no build (make qa-breaking)scripts/qa/adversarial.shruns a different model on your diff to catch single-model blind spots (local today; CI pending API secret)Reference docs:
Contributing
We welcome contributors of all experience levels. See the contributing guide to get started.
For non-trivial work, discuss the approach in a GitHub issue, discussion, or Discord thread before implementing it. Before opening or updating a PR, run the QA level appropriate for the change and include the validation you ran in the PR description. The Contributor QA Cheat Sheet is the fastest day-to-day reference; the stricter per-change policy lives in docs/agentic-qa-policy.md.
Communication
Agentic Engineering
This repository is built with agentic engineering. AI agents collaborate on day-to-day work – code generation, reviews, refactoring, testing, drafting PR comments, triaging nightly regressions – while maintainers set direction, review judgments, and authorize what ships. The two roles compound: AI agents move fast on mechanical work; humans catch the things that matter.
License
Apache-2.0. See NOTICE.md for details.