Copper for deterministic Rust robot applications
Copper is an operating system for robots - build, run, and replay your entire robot deterministically.
At a glance
- What is it?
- Copper is a Rust runtime and SDK for static robot task graphs, recorded runs, and deterministic replay across Linux and bare-metal targets. It suits developers who need compile-time graph construction and replayable robot behavior, but its static model and specialized toolchain add constraints.
- Who is it for?
- Copper is a practical choice for Rust teams designing relatively fixed robot pipelines that benefit from compile-time wiring, unified logs, and offline replay. It is less suitable for applications whose graph changes dynamically at runtime or teams unwilling to work in RON and Copper's generated scheduling model.
- Can I use it commercially?
- Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 1 day ago.
- What is it written in?
- Mainly Rust, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on November 7, 2026, and from our analysis. They are not legal advice.
Star history
- copper-project/copper-rs1,547 ★ · +25
| Repository | 2026-10-16 | 2026-11-07 |
|---|---|---|
| copper-project/copper-rs | 1.5k | 1.5k |
25 Stars in the last 22 days, measured from the daily GitHub snapshot. Compare with other projects
Editorial analysis
Copper's target problem is repeatable robot execution
Copper addresses a specific robotics engineering problem: turning a robot application into a declared task graph whose execution can be recorded and reproduced. It is intended for developers building robot control stacks in Rust, including applications that need to run on Linux, single-board computers, or bare-metal microcontrollers. The README describes flight control, balance, human pose, sensor bridge, and distributed resimulation examples in the repository, which indicates a broad application layer rather than a single robot-control library.
The central design choice is staticity. A robot pipeline is declared in RON and wired at compile time through `#[copper_runtime]`. That makes the topology visible before execution and allows Copper to produce a purpose-built runtime for that application. For a fixed control loop with known inputs, processing tasks, and outputs, this is a clearer contract than assembling communication and scheduling behavior dynamically.
Copper also addresses debugging after deployment. According to the README, a run records messages, timing, and state in a unified `.copper` log. The recorded run can then be replayed and inspected offline. This is more specific than ordinary application logging because the log represents the declared task graph and can participate in deterministic reconstruction. Teams that need to investigate sensor decisions, task latency, or control outputs after a field run have a concrete reason to consider Copper.
The project does not promise arbitrary Python or dynamically changing orchestration in its core model. It presents a Rust-first runtime with compile-time guarantees and ROS 2 interoperability through a bridge, so its strongest fit is a fixed, typed robot dataflow rather than a workflow engine whose topology is decided while the robot is running.
Copper's compile-time graph and replay path
The documented pipeline has five distinct stages. First, the developer declares a static graph in `copperconfig.ron`. Sources produce typed messages, tasks consume and transform those messages, and sinks deliver results. The generated starter application follows a `source → task → sink` structure, giving a new project a concrete data path instead of an empty runtime.
Second, `#[copper_runtime]` wires the graph during compilation. Based on the repository's crate organization, this work spans runtime construction, graph and schedule views, derive macros, message values, logging, and serialization rather than living in one application package. The `Cargo.toml` workspace separates `cu29`, `cu29_runtime`, `cu29_build`, derive crates, logging crates, graph tooling, codecs, bridges, payloads, and monitors. That structure matters for adoption because it shows that Copper is a framework with runtime, tooling, and integration layers.
Third, the generated runtime executes the graph with a hot path that the README describes as zero-allocation. Fourth, it records messages, timing, and state in one `.copper` file. Fifth, tooling can replay that record, export its data, and inspect state. The application also provides commands for viewing logs and CopperLists, rendering the topology as a graph, and examining the exact generated schedule.
The scheduling detail deserves attention. The starter `schedule.ron` is described as a conservative placeholder that should be tuned for the actual workload. Copper can therefore derive and expose an exact process schedule, but the generated schedule is not automatically proof that a particular timing configuration is suitable. Static graph generation gives developers a precise object to inspect and modify, while timing validation remains a deployment concern.
Installing Copper and running hello_copper
The README requires the latest stable Rust toolchain. The repository metadata specifies Rust 1.95 or newer, so the environment must satisfy that requirement before using the documented generator. Install the project generator and create the starter application with these commands:
cargo install cargo-cunew
cargo cunew hello_copperThe generator asks whether the target is bare metal and uses `no_std`. That choice changes the generated project, and host-only PGS scaffolding is omitted for a bare-metal target. The README says project creation also generates a `justfile`, so the exact local helper inventory depends on the selected target.
For the default starter flow, move into the generated directory and run it:
cd hello_copper
cargo runThe expected result is not an empty process. The generated app prints its first messages and records `logs/hello-copper.copper`. At this point, inspect three files: `copperconfig.ron` defines the graph, while `src/main.rs` and `src/tasks.rs` contain the application entry point and task implementations. The `.copper` log confirms that execution passed through the runtime's recording path.
The generated helper file also offers commands such as `just graph`, `just sched`, `just sched-log`, and replay helpers. Host projects also include `just pgs-baseline`, `just pgs-optimize`, `just pgs-candidate`, and `just pgs-measure`. Those names are documented as tuning helpers; the README does not define their defaults or outputs, so their behavior should be checked in the generated `justfile` before use.
Copper target coverage and ROS 2 integration
Copper's execution target ranges from desktop-class Linux and macOS to single-board computers and bare-metal microcontrollers. The repository contains a dedicated `examples/cu_baremetal_safety` project, an STM32H7 flight-controller example, and a Raspberry Pi balancebot example. These are repository examples, not proof that every application can move unchanged between hosts and devices. Hardware-specific drivers, memory constraints, codec support, and scheduling requirements still need to be checked per deployment.
The README describes a zero-allocation, data-oriented hot path and compile-time task wiring. Those choices matter more on an embedded controller than on a desktop simulation because runtime allocation and graph interpretation add avoidable sources of timing variation. Copper's model is therefore most compelling when deterministic execution and inspectable schedules are core requirements.
ROS 2 support is progressive rather than absent. The repository includes `cu_ros2_bridge` and `cu_ros2_payloads`, while the README says Copper can connect to ROS 2 through Zenoh and migrate progressively. Other workspace components include Zenoh, iceoryx2, serial, CRSF, MSP, and Feetech bridges. This makes Copper usable as one execution layer inside a larger robot software system, rather than requiring an immediate replacement of every existing ROS component.
The practical boundary is topology. Copper's graph is static and compile-time wired. If the required topology is assembled dynamically according to conditions that are unknown until runtime, that requirement conflicts with the central model and needs a different orchestration approach or an upstream component that remains dynamic.
Recording, telemetry, and replay constraints
Copper distinguishes local recording from live telemetry, but both paths involve trade-offs. The normal `.copper` log combines messages, timing, and state so the same record can support replay and inspection. The README's telemetry feature adds a separate path: robot data and structured logs can stream to a ground station over UDP, live task outputs can be viewed, and a replayable archive can be saved.
The telemetry documentation also describes a live Copper twin that reconstructs selected deterministic task outputs locally to reduce bandwidth. That is useful when a ground station does not need every intermediate result, but it also means the value of the recording depends on the state and message history required for reconstruction. The README excerpt does not quantify bandwidth savings or define retention policy for long deployments.
Storage growth is another practical concern. The documentation does not state the size of `.copper` files, compression behavior, retention configuration, or recovery procedure for a truncated archive. Those omissions prevent a confident claim about logging overhead on a long-duration robot deployment. Developers should first establish their required recording rate and then inspect actual archives on the target.
Replay also does not replace validation of the physical environment. A replay can reconstruct selected outputs from a recorded run, but the README does not claim that replay reproduces every external interaction, such as actuator movement or sensor noise. It should be treated as a deterministic software execution record, not automatically as a hardware-in-the-loop simulator.
Where Copper is the wrong abstraction
Copper is a poor fit when a robot's task graph must be assembled or substantially changed while the application is running. Its defining mechanism is static declaration followed by compile-time wiring. A workflow engine designed around dynamic graph mutation would be a closer conceptual match, although no specific alternative implementation is named in the repository documentation.
It is also a weak fit for teams whose primary requirement is a general ROS 2 application rather than a fixed Copper-controlled pipeline. The `cu_ros2_bridge` makes interoperability possible, but bridging adds another boundary. If ROS 2 already owns orchestration and messaging throughout the system, adopting Copper mainly for one isolated task may not justify an additional runtime and configuration model.
Copper should not be selected solely because the README mentions real-time execution, browser examples, or multiple hardware targets. Those claims identify supported scenarios, not project-specific timing guarantees for a new workload. The generated `schedule.ron` is explicitly a placeholder, and the README does not provide a universal scheduler selection procedure or latency bound. Acceptance testing must therefore occur with the actual task set, message sizes, codecs, and target processor.
There is also a terminology trap. “Operating system for robots” does not mean that Copper replaces Linux or the firmware on a microcontroller. The repository description calls it an operating system, while the README more precisely presents a Rust runtime and SDK. The latter description better matches the documented build, run, record, and replay workflow.
Copper maintenance, licensing, and adoption cost
The repository is not archived. Its last push was on 2026-10-16, one day after release `v1.3.0`, which was published on 2026-10-15. Releases `v1.2.3` and `v1.2.4` appeared earlier in October. These facts indicate recent repository activity, but they do not establish long-term API stability.
Copper is licensed under Apache-2.0. That permits use and modification under the license's conditions, including preservation of notices and patent-related provisions. This is a license summary rather than legal advice. Teams should review the repository `LICENSE` and their own compliance obligations when distributing binaries or embedded firmware.
The immediate adoption cost is a Rust 1.95 or newer toolchain, installation of `cargo-cunew`, and familiarity with RON configuration, Copper derive macros, generated projects, `.copper` logs, and scheduling helpers. Bare-metal projects introduce `no_std` and target-specific choices from the beginning. The repository's `justfile` identifies Rust 1.95.0 as its MSRV, while public API tooling is tied to `nightly-2026-06-25`; developers should confirm which toolchain a chosen package requires.
The upgrade cost is not only source compatibility. A new graph configuration, serialization feature, decoder catalog, target, or schedule can change generated artifacts and recorded-log interpretation. Release notes and the `RELEASING.md` file are therefore part of the upgrade workflow, not optional background reading.
Editorial conclusion
Copper is a practical choice for Rust teams designing relatively fixed robot pipelines that benefit from compile-time wiring, unified logs, and offline replay. It is less suitable for applications whose graph changes dynamically at runtime or teams unwilling to work in RON and Copper's generated scheduling model. Before adoption, inspect `copperconfig.ron`, confirm the supported target and Rust 1.95 or newer toolchain, and run the generated project on the intended hardware.
Frequently asked questions
What is Copper and who is it for?
Copper is a Rust runtime and SDK for developers building static robot task graphs. It supports recording and deterministic replay across Linux and bare-metal targets.
How do I create and run a Copper application?
Install `cargo-cunew`, run `cargo cunew hello_copper`, enter the generated directory, and run it with `cargo run`. The starter prints messages and writes `logs/hello-copper.copper`.
Does Copper support dynamic task graphs and ROS 2?
Copper declares graphs in RON and wires them at compile time, so its core model is static. The repository includes a ROS 2 bridge and ROS 2 payloads for progressive interoperability.
Official sources
Where developers are discussing it
Posts on Hacker News, dev.to and Lobsters that link to this repository, found by our scan of those communities. 1 in the last 30 days; newest first.
- Copper is an operating system for robotsHacker News · Nov 1, 2026 · 4 points · 1 comments
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/copper-project-copper-rs)Star history chart for your README
[](https://hysenlabs.com/projects/copper-project-copper-rs)Was this useful?