Why Copper
| Built for robots | Built to ship |
|---|---|
| Static by design: task graphs are declared in RON and wired at compile time. | Runs anywhere: Linux, macOS, SBCs, and bare-metal microcontrollers. |
| Realtime first: zero-allocation, data-oriented execution on the hot path. | Deterministic replay: record a run, reproduce it, and inspect it offline. |
| Rust-first: ergonomic task APIs with compile-time guarantees. | Interoperable: connect to ROS 2 through Zenoh and migrate progressively. |
Already flying, driving, swimming, spacefaring, and powering humanoids.
See It Run
These are the same Copper applications used on physical robots, recompiled for the browser. The simulator runs beside a live view of the Copper task graph and latency.
Watch more robots built with Copper in the community showcase, or explore the cross-framework benchmarks.
Build Your First Copper App
Install the latest stable Rust toolchain, then:
In about 30 seconds, you have a typed source → task → sink graph that prints its
first messages and records logs/hello-copper.copper. Start with
copperconfig.ron, src/main.rs, and src/tasks.rs; the generated justfile
also provides helpers for logs, CopperLists, topology (just dag), the exact
generated process schedule (just plan), post-execution timing from the default
Copper log (just plan-log), and replay.
How Copper Fits Together
flowchart LR
Config["copperconfig.ron<br/>Static task graph"]
Generate["#[copper_runtime]<br/>Compile-time generation"]
Runtime["Deterministic runtime<br/>Zero-alloc hot path"]
Log["Unified .copper log"]
Tools["Replay · Export · Inspect"]
Config --> Generate --> Runtime --> Log --> Tools
The robot is a static thing: Copper turns its declared graph into a purpose-built runtime, then records messages, timing, and state into one replayable log.