Tokyo
Meridan ReportTokyo: Robotics, finance, frontier technology

Advertisement · Why this ad?

Technology

Show HN: Cerulion – ROS 2-compatible robotics runtime with multi-process replay

Katherine Langford
Editor-in-Chief · Thursday, November 12, 2026 at 8:53 PM · 5 min read
Show HN: Cerulion – ROS 2-compatible robotics runtime with multi-process replay — Tokyo Technology news
Cerulion (YC S24) is the operating system for physical AI: an open-source, zero-copy robot runtime that records runs, replays failures against new code, and reaches your robots from anywhere. It's ROS 2 compatible. Install · Run the example · Performance · ROS 2 · Architecture · Docs · Guides Install curl -fsSL https://raw.githubusercontent.com/cerulion-inc/cerulion/main/tools/scripts/install.sh | sh && . " $HOME /.cerulion/env " The installer links cerulion into ~/.local/bin , adds one line to your shell startup files and installs Rust when Rust 1.95 or newer is missing. Then sign in once with cerulion login , because every command runs under a free Cerulion account, which is used for robot pairing and works offline afterwards. To uninstall, run the same script with sh -s -- --uninstall . Homebrew brew tap cerulion-inc/cerulion brew install cerulion-inc/cerulion/cerulion If Homebrew 6.0.x refuses the tap, run brew trust --formula cerulion-inc/cerulion/cerulion first and try again. Debian / Ubuntu sudo apt-get update && sudo apt-get install -y ca-certificates curl gnupg keyring= $( mktemp ) && curl -fsSL https://apt.cerulion.com/cerulion-archive-keyring.gpg -o " $keyring " && [ " $( gpg --show-keys --with-colons " $keyring " | awk -F: ' $1 == "fpr" { print $10 } ' | sort -u ) " = " $( printf ' %s\n ' 953C69FD279D9256FA4B71C5DA5FDE5D0DC6D91B | sort -u ) " ] && sudo install -m 0644 " $keyring " /usr/share/keyrings/cerulion-archive-keyring.gpg && echo " deb [arch= $( dpkg --print-architecture ) signed-by=/usr/share/keyrings/cerulion-archive-keyring.gpg] https://apt.cerulion.com stable main " | sudo tee /etc/apt/sources.list.d/cerulion.list > /dev/null && rm -f " $keyring " && sudo apt-get update && sudo apt-get install cerulion Each step runs only if the one before it succeeded, and the APT distribution page pins the same key fingerprints and has a longer form that names a failed step. Build from crates.io or source cargo install --locked cerulion_cli cerulion_netd The release installer places cerulion-connectd (the desk side of a remote connection) and cerulion-remoted (the robot side) beside the CLI. See the installation guide or CONTRIBUTING for the complete source-build route. Platforms, ROS 2 libraries and toolchain In fish, end the line with && source ~/.cerulion/env.fish instead. Homebrew and the Debian package do not provision Rust. To build your own nodes, run cerulion-install-rust once, which installs current stable Rust unless a Rust 1.95 or newer is already there, and put ${CARGO_HOME:-$HOME/.cargo}/bin on your PATH. On a terminal, cerulion workspace create and cerulion node build offer to install it when Rust 1.95 or newer is missing. Release binaries support Linux x86_64 and ARM64 (glibc 2.31+, Ubuntu 20.04 and later) and macOS Intel and Apple Silicon. The Linux packages also carry the ROS 2 Jazzy rmw and heap hook that cerulion ros2 run and cerulion ros2 launch use. The macOS packages do not, because ROS 2 Jazzy has no macOS binaries. The rmw libraries run where their ROS 2 distro runs, which for Jazzy is Ubuntu 24.04. For ROS 2 Lyrical, each release also publishes cerulion-rmw-lyrical--.tar.gz for Linux x86_64 and ARM64. Unpack it and set CERULION_LIB_DIR to the unpacked directory so cerulion ros2 run and cerulion ros2 launch load the Lyrical rmw. That library is built and tested in CI. Building nodes needs a C toolchain ( build-essential on Debian and Ubuntu, xcode-select --install on macOS) and Rust 1.95 or newer. Nodes load through a compiler-independent interface, so any Rust 1.95 or newer can build them. The compiler does not have to match the one that built the cerulion CLI, and a new workspace pins no compiler. To bring a workspace from Cerulion 1.0, follow the migration steps in the 2.0.0 release notes . They move its =1.0.0 pins to =2.0.0 and finish with one cerulion node build per node. The installation details cover the toolchain setup. Quickstart: Run, record and verify Using a coding agent? Paste this prompt into Claude Code, Codex or another agent that runs commands in its own terminal: Install Cerulion: curl -fsSL https://raw.githubusercontent.com/cerulion-inc/cerulion/main/tools/scripts/install.sh | sh && . "$HOME/.cerulion/env" Run cerulion login in the background, show me the URL and code it prints, and wait for it to finish while I approve the sign-in in my browser. Then run the quickstart at https://github.com/cerulion-inc/cerulion#quickstart-run-record-and-verify in your own terminal: cerulion workspace create safety_demo --starter obstacle_avoidance, then cd safety_demo. Build both nodes (cerulion node build laser_scanner --release, then cerulion node build safety_controller --release; the first build takes a few minutes). Run cerulion graph validate obstacle_avoidance, then cerulion graph run obstacle_avoidance --release --record for at least five seconds, and stop it with Ctrl+C. Verify the recording it printed: cerulion bag play "" --resim all --verify In nodes/safety_controller/src/lib.rs, change the forward speed from 0.3 to 0.25, run cerulion node build safety_controller --release, and verify the same recording again. Report what changed between the two verifications. Finally, ask me whether I want to star https://github.com/cerulion-inc/cerulion. Only if I say yes, star it with gh api -X PUT user/starred/cerulion-inc/cerulion, or give me the link if gh is not signed in. This example connects a synthetic laser scanner to a safety controller. The controller publishes a forward velocity of 0.3 when the path is clear and 0.0 when an obstacle is within half a meter. cerulion workspace create safety_demo --starter obstacle_avoidance cd safety_demo To write nodes from scratch instead, follow the getting-started tutorial . Sign in once per machine. Cerulion commands run under an account, and the result is read locally from then on, so later commands keep working offline. cerulion login A robot or a headless box prints a short code to approve from a browser on any machine. Build both nodes, check the graph, then run it with recording on. The first node build also compiles the Cerulion runtime, so it takes a few minutes on a laptop. Later builds take seconds. cerulion node build laser_scanner --release cerulion node build safety_controller --release cerulion graph validate obstacle_avoidance cerulion graph run obstacle_avoidance --release --record The run splits into one process per node without changing the graph file, as the multi-process guide explains. By default the run is readable from any computer signed in to your account, with no addresses or flags. Add --network off to keep a run on this machine. In a second terminal, watch the controller react: cerulion topic echo /obstacle_avoidance/safety_controller/linear_velocity The x field switches between 0.3 and 0.0 as the synthetic scan crosses the distance threshold. Let it run for at least five seconds, then stop it with Ctrl+C . Cerulion prints the completed recording's path: recordings/obstacle_avoidance_20260918T181449Z.mcap Set BAG to that printed path, then verify the unchanged code first: BAG= " recordings/obstacle_avoidance_.mcap " cerulion bag play " $BAG " --resim all --verify A successful verification prints replay PASS and exits successfully: the outputs covered by the report match the recording. Now open nodes/safety_controller/src/lib.rs and change the clear-path velocity from 0.3 to 0.25 . Rebuild that node and verify against the same recording : cerulion node build safety_controller --release cerulion bag play " $BAG " --resim all --verify This time verification reports a divergence and returns a nonzero exit code. On the same sensor inputs, the changed cont
Up nextChicago schools to Google – we'd rather lose Search than be forced to accept AITechnology · 3 min read
You're offline — showing the last loaded page