# Dora-rs: a Rust dataflow runtime for real-time robotics and AI, reviewed for adoption

> DORA models a robot application as a directed graph of nodes and runs it with a Rust coordinator and daemon, zero-copy shared memory, and a Zenoh data plane. Here is what the repository actually documents, and where it stops.

**dora-rs/dora** — 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 dataflow capabilities. Applications are modeled as directed graphs, also referred to as pipelines.

- Repository: https://github.com/dora-rs/dora
- Website: https://dora-rs.ai
- Stars: 3,989 · Forks: 448
- Language: Rust
- License: Apache-2.0
- Published: 2026-09-23 · Updated: 2026-09-23 · Language: en
- Canonical page: https://hysenlabs.com/projects/dora-rs-dora

## What Dora-rs solves, and who it is written for

DORA stands for Dataflow-Oriented Robotic Architecture. The repository describes it as middleware for building AI-based robotic applications, where an application is modelled as a directed graph, also called a pipeline. That framing is the whole product: instead of writing a control loop that calls camera, model and actuator code in sequence, you declare nodes and the typed connections between them, and the runtime schedules the result.

The intended audience is narrow enough to state plainly. It is a team that already writes robotics or embodied-AI code and is willing to describe its application as a graph. The README claims 10-17x faster than ROS2 Python, with 100% Rust internals and zero-copy shared memory IPC for messages above 4KB. Treat that as a vendor claim from the project's own README, not an independent measurement. The more useful signal is the design underneath it: a Rust workspace that builds a CLI, a coordinator, a daemon and language bindings under apis/, with example dataflows checked in for Rust, Python, C and C++.

If your application is a single process with a tight loop and no need to mix languages or machines, a graph runtime adds a coordinator, a daemon and a YAML file you did not need.

## How the coordinator, daemon and Zenoh data plane fit together

The workspace layout in Cargo.toml names the moving parts directly: binaries/coordinator, binaries/daemon, binaries/cli, and runtime binaries for Python and shared libraries. The coordinator owns the state of which dataflows exist. The daemon runs the nodes on a machine. The CLI is what you type.

Data movement has two paths. The README states that nodes publish directly through Zenoh shared memory, bypassing the daemon, which it says gives 35% lower latency and 3-10x higher throughput on large payloads, with automatic network fallback for cross-machine communication. Messages are carried in Apache Arrow columnar format end to end, and the README notes optional Arrow IPC framing for a self-describing wire format. That combination is why the project can claim flat latency from 4KB to 4MB payloads: above the shared-memory threshold, large buffers stop being copied and serialized.

The control path is deliberately separate. Zenoh publishes are offloaded to a dedicated drain task so the event loop stays responsive; the README says control commands respond in under 500ms even under high data throughput. Coordinator state is persisted in a redb-backed store by default, and the daemon reconnects with exponential backoff. One caveat sits in the same paragraph: dataflow records survive a coordinator restart, but reclaim of a running dataflow across a restart is described as partial, with a pointer to the open issue tracker. If you plan to restart the coordinator during a running job, that is the sentence to read twice.

## Installing Dora-rs and running a first dataflow

The repository ships install.sh and install.ps1 at the top level, and the README also links crates.io for dora-cli and PyPI for dora-rs. The installation section of the README is truncated in the repository listing, so the exact flags are not something this article can quote. Check the guide at dora-rs.ai for the current invocation before you run anything.

Once dora is on your PATH, the documented lifecycle is a single CLI. The README lists dora run for local development and dora up plus dora start for distributed production, alongside build, logs, monitoring and record/replay. A dataflow is a YAML file describing nodes and their typed inputs and outputs. The README points to docs/types.md for optional type annotations with static validation, and notes that values can be overridden with environment variables.

The README's Quick Start is what to follow for the first run: the installation section of the README is truncated in the repository listing, so no command line can be reproduced here without inventing it. What the README does document is the shape of the work. You describe the pipeline in a YAML file, then drive it with the CLI. The README lists dora run for local development and dora up plus dora start for distributed production, alongside build, logs, monitoring and record/replay, and it points to docs/types.md for optional type annotations with static validation.

To watch a running graph, the README documents topic inspection commands: topic echo to print live data, topic hz for frequency analysis, and topic info for schema and bandwidth. These are described as printing live data and frequency information rather than requiring a separate broker UI.

For a first real use, the checked-in examples are the fastest reference. examples/rust-dataflow, examples/python-dataflow and examples/cross-language show the same shape in different languages, and examples/module-dataflow shows sub-graphs composed from standalone YAML files. The README states that modules expand at compile time with zero runtime overhead, and that Python operators can be live-reloaded without restarting the dataflow.

## Where Dora-rs is the wrong tool

Start with real-time guarantees. The README calls the offering soft real-time and describes an optional --rt flag for mlockall and SCHED_FIFO, plus per-node cpu_affinity pinning in YAML. That is a tuning surface, not a certification. If your application has a hard deadline that must be proven, a middleware that asks you to opt into memory locking and a real-time scheduler is a starting point, not an answer.

Second, the Node Hub is marked unstable in the README itself. The hub line in a dataflow, the cargo-style version resolution and the lockfiles are described as a feature of the project, with a link to the public catalog, but the guide reference carries an unstable label. Depending on a package manager the project calls unstable is a different risk than depending on its core runtime.

Third, the ecosystem gap is real. Dora-rs has a ROS2 bridge that handles topics, services and actions over DDS or Zenoh, with QoS mapping. It does not have ROS2's package universe. If your plan depends on pulling an existing ROS2 driver for a specific sensor and moving on, the bridge is a translation layer you now own.

Finally, coordinator HA is incomplete for the case people care about most. The README says dataflow records survive a coordinator restart while reclaim of a running dataflow across that restart is partial. A deployment that assumes seamless coordinator failover during a job will not get it from the current documentation.

## Dora-rs against ROS2: different graphs, different defaults

The honest comparison is not speed. It is what each system assumes about your application.

ROS2 is a set of conventions over DDS: nodes discover each other, topics are typed through message definitions, and the ecosystem supplies drivers, tools and years of deployment experience. Dora-rs replaces discovery with a declared graph. You write a YAML file naming nodes and edges, a coordinator tracks it, and a daemon launches the processes. The README's distributed story is explicit about this: shared memory between co-located nodes, Zenoh pub-sub across machines, and SSH-based cluster management with label scheduling, rolling upgrades and auto-recovery. That is a deployment model, not a discovery protocol.

The practical difference shows up in three places. Typing: Dora-rs uses Arrow as the in-memory format across all language bindings and offers optional type annotations with static validation, whereas ROS2 types come from generated message packages. Composition: Dora-rs modules let you embed a sub-graph as a standalone YAML file with typed inputs and outputs, expanded at compile time. Debugging: Dora-rs ships dora top, record/replay to .drec files, and trace list and trace view for coordinator spans without external infrastructure, while a ROS2 stack typically reaches for separate tooling.

If you are starting from scratch in Rust or Python and you control both ends of every connection, Dora-rs gives you a smaller, more explicit system. If you are integrating hardware whose vendor ships a ROS2 package, the bridge exists but the ROS2 side is still where the drivers live.

## Upgrade cost, licence and the QA ladder

The project reached v1.0.0 on 2026-09-02 and v1.0.1 on 2026-09-03, after a run of release candidates in late August 2026. The last push to the default branch was on 2026-09-20. A 1.0 tag is a stability statement about the API surface, not a promise that every feature is finished, and the README's own unstable label on the Node Hub is the clearest example.

The repository carries a Changelog.md, a cliff.toml for changelog generation, and a release.toml, so release notes are produced as part of the process rather than assembled by hand. The Makefile defines a quality ladder that is worth knowing before you upgrade: make qa-fast at roughly a minute for pre-commit, make qa-full at five to ten minutes for pre-push, make qa-deep at around fifteen minutes, and make qa-nightly at three to four hours for full parity with the nightly workflow. That ladder tells you the project tests itself in layers, and it also tells you the maintainers expect contributors to run something before pushing.

Licensing is Apache-2.0, with a NOTICE.md at the top level alongside LICENSE. Apache-2.0 includes an explicit patent grant and requires that notices be preserved. That is a permissive licence suitable for commercial products, but it is not legal advice and your counsel should confirm the NOTICE obligations and any dependency licences, which the repository also tracks through deny.toml.

One more maintenance fact is worth stating plainly because it affects how you read the codebase: the README says the project is built and maintained with agentic engineering, where AI agents do code generation, reviews, refactoring and testing, and humans set direction and gate every merge. Whatever you think of that arrangement, it is a real property of this project's process and it is disclosed rather than hidden.

## Conclusion

Adopt Dora-rs if your application is naturally a graph of typed streams and you want one CLI to run it locally and across machines, with Python, Rust, C and C++ nodes in the same dataflow. Do not adopt it if you depend on the ROS2 package ecosystem, on DDS discovery semantics, or on hard real-time guarantees, since the repository describes its scheduling as soft real-time behind an optional --rt flag. Before committing, verify three things yourself: that the Node Hub is still labelled unstable, that reclaim-across-restart for running dataflows is documented as partial, and that the install path you need (install.sh, install.ps1, or the crates.io and PyPI packages) is the one your target platform supports.

## FAQ

### What does DORA stand for in dora-rs?

Dataflow-Oriented Robotic Architecture. The README expands it as Agentic Dataflow-Oriented Robotic Architecture and describes middleware for building real-time robotics and AI applications as directed graphs.

### Which languages can I write dora-rs nodes in?

The README lists Rust, Python, C and C++ with native APIs, and states that languages can be mixed freely in one dataflow. The workspace in Cargo.toml contains separate crates under apis/ for the C, C++, Python and Rust bindings.

### Does dora-rs support running across multiple machines?

Yes. The README describes local shared memory between co-located nodes and automatic Zenoh pub-sub for cross-machine communication, with SSH-based cluster management that includes label scheduling, rolling upgrades and auto-recovery.

### What happens to a running dataflow if the coordinator restarts?

Dataflow records survive the restart because coordinator state is persisted in a redb-backed store by default, and the daemon reconnects with exponential backoff. The README states that reclaim of a running dataflow across a restart is partial and points to the open issue tracker.

## Sources

- [dora-rs/dora on GitHub](https://github.com/dora-rs/dora)
- [License: Apache-2.0](https://github.com/dora-rs/dora/blob/main/LICENSE)
- [Project website](https://dora-rs.ai)
- [README](https://github.com/dora-rs/dora/blob/main/README.md)
- [Releases](https://github.com/dora-rs/dora/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/dora-rs-dora
