Katherine oversees editorial operations across all six brands. Before joining The Meridan Group, she spent 14 years at the Minneapolis Star Tribune, where she led the metro desk through its digital transformation. She holds a Master's in Journalism from Northwestern's Medill School.
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