rerun
The data-centric visualization tool for robium's ML/non-ROS side: a
timeline-and-entity-path logging model (Python-first via rerun-sdk,
pip install rerun-sdk / uv add rerun-sdk, currently at 0.34.1 as of
this session — verified via direct fetch of github.com/rerun-io/rerun's
release page) for policy rollouts, LeRobot episode data, and arbitrary
sensor streams that don't fit ROS message types. This skill deliberately
stays thin: Rerun's own logging API surface (which archetype for which data
shape, exact keyword arguments) changes across releases, and its own
getting-started docs and example gallery are the actual source of truth —
this skill's job is orientation (what the pieces are called, how the
operating modes map to robium's local/remote needs) and the hand-off into
lerobot for episode visualization, not a re-implementation of Rerun's own
tutorials.
When to use this skill
- Logging and viewing ML rollouts, sensor streams, or embeddings/tensors
outside ROS's message-type world; visualizing a LeRobot dataset episode.
- The trigger phrases in the description: 'rerun', visualizing ML
training/eval rollouts, LeRobot episode data, custom sensor pipelines
outside ROS tooling.
- Before writing any
rr.log(...) call for a new data shape — check
Rerun's own examples first (see Key directives); this skill's job is
pointing there, not supplying every archetype from memory.
- Cross-references — go to the sibling skill instead when the question is:
- LeRobot dataset mechanics themselves (the
LeRobotDataset format,
loading/recording, training/eval CLI) → lerobot. This skill only
covers viewing an episode once lerobot has one to show, not the
dataset format itself.
- Live ROS 2 topic debugging with a local display →
rviz2.
- Live ROS 2 topic debugging remote/headless, or MCAP recording →
foxglove.
- Deciding which dataset to source in the first place →
data.
- Choosing which viz tool fits the situation at all →
visualization
(routes here once Rerun is the right choice).
Key directives
- Delegation posture: point-upstream (delegate-leaning). Rerun ships
its own extensive example gallery and API reference at
rerun.io/docs
and rerun.io/examples, and the archetype/API surface has moved release
to release (see the SDK's own migration guides). Check those before
writing logging code for a new data shape — treat this skill as an
index into them, not a replacement.
- Never re-teach LeRobot dataset mechanics here.
lerobot's
lerobot-dataset-viz command already wraps Rerun for episode
visualization end to end (see Usage patterns) — this skill's job is
receiving that hand-off (what the Rerun-specific pieces mean once the
command is running), not duplicating lerobot's dataset/CLI docs.
- Pick the operating mode by where the viewer needs to be, not by
habit. Rerun's Python SDK supports several distinct sinks
(
rr.spawn(), rr.connect_grpc(), rr.save(),
rr.serve_grpc()/rr.serve_web_viewer(), rr.stdout()) — local
interactive work, a separately-running viewer, a file for later, and a
browser-accessible remote view are different modes, not variations of
the same one. See Usage patterns and Rerun's own operating modes
docs (this session's
content came via search-synthesis, not a direct fetch — the URL 404'd; see
References — re-verify before relying on the exact operating-mode list)
before defaulting to spawn() on a headless box (it will fail — there's
no local display to spawn a viewer window on).
- Never write archetype names, constructor arguments, or CLI flags from
memory. The archetype list (
Points3D, Image, Scalars,
Transform3D, and others) and their exact fields change across
releases — verify against the rerun.io/docs quick-start/data-in pages or
the rerun-io/rerun GitHub repo (fetched directly this session for these
facts) before repeating a specific call signature in a real project.
Quick start
1. Install:
uv add rerun-sdk
2. Log something and view it locally — spawn=True starts a Viewer
process and streams to it over gRPC:
import rerun as rr
rr.init("my_app", spawn=True)
rr.log("world/points", rr.Points3D(points, colors=colors, radii=0.05))
3. For anything beyond a first smoke test — a new data shape, a
timeline, a blueprint/layout — go to Rerun's Python quick-start
docs and
example gallery before hand-writing more
rr.log() calls; see Key directives.
Usage patterns
Log a simple stream. rr.init(app_id, spawn=True) opens a local
viewer; each rr.log(entity_path, archetype) call writes one entity at the
current time. Entity paths (e.g. "robot/camera/image") form a hierarchy
that drives the viewer's tree and default layout — group related data
under a common path prefix rather than flat, unrelated names. For anything
with a time axis beyond wall-clock logging order, set an explicit timeline
first: rr.set_time("episode_step", sequence=i) (or duration=/timestamp=
for the other timeline kinds) before the rr.log() calls for that step —
Rerun uses "latest-at" semantics, so static data logged once at the start
persists across the whole timeline without re-logging it every step. See
the quick-start link above for the current archetype list.
Visualize a LeRobot episode. Don't hand-roll this — lerobot already
wraps Rerun for exactly this case:
lerobot-dataset-viz --repo-id=<id> --episode-index=0
This is the lerobot skill's command, cross-referenced here because it's
the primary way most robium projects will ever invoke Rerun directly. The
entity paths and layout it produces are LeRobot's own convention (camera
streams, state/action vectors, per-episode structure) — inspect what it
logs before adding custom rr.log() calls alongside it, rather than
guessing the path scheme.
Remote viewer. Two shapes, matching lerobot-dataset-viz's own
--mode distant flag: either start a gRPC server in the logging process
(rr.serve_grpc(), optionally paired with rr.serve_web_viewer() for a
browser-based viewer with no local install) and connect to it, or start a
standalone viewer first (rerun in a terminal) and have the logging
process call rr.connect_grpc() to stream into it. From a separate
machine, the native viewer connects to a running gRPC server with:
rerun rerun+http://<host>:<grpc_port>/proxy
which is the same pattern lerobot-dataset-viz --mode distant --grpc-port=<port>
uses under the hood — a headless training/eval box logs, a local machine
watches, with no data ever needing to leave the remote box as a file.
Platform gotchas
- The viewer runs natively everywhere — Linux, macOS (including Apple
Silicon), and Windows — unlike
rviz2, which needs ROS 2 and therefore
Docker on macOS. This is why rerun is the default answer for a non-ROS
pipeline regardless of local vs. remote, per the visualization
umbrella's selection table.
spawn() needs a local display; it will fail on a bare headless
box. If a training/eval script that calls rr.spawn() is moved to a
headless server, switch to rr.serve_grpc()/serve_web_viewer() or
rr.save() instead — don't try to get a local window working over SSH.
- The Python SDK bundles the Viewer; C++ and Rust don't. A pure-Python
robium project gets the viewer for free via
pip install rerun-sdk; a
C++/Rust logging path needs the separate rerun-cli (cargo install rerun-cli --locked --features nasm, per the SDK's own install docs) to
get the same standalone viewer/CLI.
serve_grpc() buffers in memory so late-connecting viewers still get
full history — on a long-running process logging a lot of data, set its
server_memory_limit argument rather than letting it grow unbounded.
Customization
- Entity path scheme for a new project: don't invent one from scratch —
Rerun's own docs on entity paths and hierarchies (linked from the
quick-start page above) cover the conventions (grouping by
sensor/subsystem, using
Transform3D logs to place entities in a common
coordinate frame); mirror lerobot-dataset-viz's own scheme when logging
alongside a LeRobot episode so the two show up coherently in one tree.
- Mixing ROS and non-ROS data in one debugging session: per the
visualization umbrella, this is normal — use rviz2/foxglove for the
ROS-side state and rerun for a policy's own inputs/outputs, viewed
side by side rather than forcing one tool to cover both.
References
- Upstream: Rerun documentation and Python
quick-start
(primary source for logging code — check before writing new
rr.log()
calls), operating modes
reference (source
of the spawn/connect/save/serve/stdout distinction above; the exact URL
404'd on direct fetch this session, so this content came via
search-synthesis — re-verify before relying on the exact operating-mode
list), rerun-io/rerun GitHub
repo (fetched directly this session —
source of the current version and rerun-cli install command),
example gallery. Sibling skills: lerobot
(owns LeRobot dataset mechanics; wraps this skill for episode
visualization via lerobot-dataset-viz), data (dataset sourcing
strategy), rviz2 and foxglove (ROS-native live debugging, not this
skill's territory), visualization (umbrella, routes here).
Changelog
1---2name: rerun-23description: Rerun for data-centric robotics and ML visualization: logging APIs (Python), timelines, entity paths, and viewing policy rollouts, episode data, and sensor streams. Use when: 'rerun', visualizing ML training/eval rollouts, LeRobot episode data, or custom sensor pipelines outside ROS tooling. Defers heavily to Rerun's official examples and docs — check them before writing logging code. Pairs with lerobot and data. Not for: live ROS topic debugging (rviz2, foxglove).4---56# rerun78The data-centric visualization tool for robium's ML/non-ROS side: a9timeline-and-entity-path logging model (Python-first via `rerun-sdk`,10`pip install rerun-sdk` / `uv add rerun-sdk`, currently at **0.34.1** as of11this session — verified via direct fetch of `github.com/rerun-io/rerun`'s12release page) for policy rollouts, LeRobot episode data, and arbitrary13sensor streams that don't fit ROS message types. This skill deliberately14stays thin: Rerun's own logging API surface (which archetype for which data15shape, exact keyword arguments) changes across releases, and its own16getting-started docs and example gallery are the actual source of truth —17this skill's job is orientation (what the pieces are called, how the18operating modes map to robium's local/remote needs) and the hand-off into19`lerobot` for episode visualization, not a re-implementation of Rerun's own20tutorials.2122## When to use this skill2324- Logging and viewing ML rollouts, sensor streams, or embeddings/tensors25 outside ROS's message-type world; visualizing a LeRobot dataset episode.26- The trigger phrases in the description: 'rerun', visualizing ML27 training/eval rollouts, LeRobot episode data, custom sensor pipelines28 outside ROS tooling.29- Before writing any `rr.log(...)` call for a new data shape — check30 Rerun's own examples first (see Key directives); this skill's job is31 pointing there, not supplying every archetype from memory.32- Cross-references — go to the sibling skill instead when the question is:33 - LeRobot dataset mechanics themselves (the `LeRobotDataset` format,34 loading/recording, training/eval CLI) → `lerobot`. This skill only35 covers viewing an episode once `lerobot` has one to show, not the36 dataset format itself.37 - Live ROS 2 topic debugging with a local display → `rviz2`.38 - Live ROS 2 topic debugging remote/headless, or MCAP recording →39 `foxglove`.40 - Deciding *which* dataset to source in the first place → `data`.41 - Choosing which viz tool fits the situation at all → `visualization`42 (routes here once Rerun is the right choice).4344## Key directives4546- **Delegation posture: point-upstream (delegate-leaning).** Rerun ships47 its own extensive example gallery and API reference at `rerun.io/docs`48 and `rerun.io/examples`, and the archetype/API surface has moved release49 to release (see the SDK's own migration guides). Check those before50 writing logging code for a new data shape — treat this skill as an51 index into them, not a replacement.52- **Never re-teach LeRobot dataset mechanics here.** `lerobot`'s53 `lerobot-dataset-viz` command already wraps Rerun for episode54 visualization end to end (see Usage patterns) — this skill's job is55 receiving that hand-off (what the Rerun-specific pieces mean once the56 command is running), not duplicating `lerobot`'s dataset/CLI docs.57- **Pick the operating mode by where the viewer needs to be, not by58 habit.** Rerun's Python SDK supports several distinct sinks59 (`rr.spawn()`, `rr.connect_grpc()`, `rr.save()`,60 `rr.serve_grpc()`/`rr.serve_web_viewer()`, `rr.stdout()`) — local61 interactive work, a separately-running viewer, a file for later, and a62 browser-accessible remote view are different modes, not variations of63 the same one. See Usage patterns and Rerun's own [operating modes64 docs](https://rerun.io/docs/reference/sdk/operating-modes) (this session's65 content came via search-synthesis, not a direct fetch — the URL 404'd; see66 References — re-verify before relying on the exact operating-mode list)67 before defaulting to `spawn()` on a headless box (it will fail — there's68 no local display to spawn a viewer window on).69- **Never write archetype names, constructor arguments, or CLI flags from70 memory.** The archetype list (`Points3D`, `Image`, `Scalars`,71 `Transform3D`, and others) and their exact fields change across72 releases — verify against the `rerun.io/docs` quick-start/data-in pages or73 the `rerun-io/rerun` GitHub repo (fetched directly this session for these74 facts) before repeating a specific call signature in a real project.7576## Quick start7778**1. Install:**7980```bash81uv add rerun-sdk82```8384**2. Log something and view it locally** — `spawn=True` starts a Viewer85process and streams to it over gRPC:8687```python88import rerun as rr8990rr.init("my_app", spawn=True)91rr.log("world/points", rr.Points3D(points, colors=colors, radii=0.05))92```9394**3. For anything beyond a first smoke test** — a new data shape, a95timeline, a blueprint/layout — go to [Rerun's Python quick-start96docs](https://rerun.io/docs/getting-started/quick-start/python) and97[example gallery](https://rerun.io/examples) before hand-writing more98`rr.log()` calls; see Key directives.99100## Usage patterns101102**Log a simple stream.** `rr.init(app_id, spawn=True)` opens a local103viewer; each `rr.log(entity_path, archetype)` call writes one entity at the104current time. Entity paths (e.g. `"robot/camera/image"`) form a hierarchy105that drives the viewer's tree and default layout — group related data106under a common path prefix rather than flat, unrelated names. For anything107with a time axis beyond wall-clock logging order, set an explicit timeline108first: `rr.set_time("episode_step", sequence=i)` (or `duration=`/`timestamp=`109for the other timeline kinds) before the `rr.log()` calls for that step —110Rerun uses "latest-at" semantics, so static data logged once at the start111persists across the whole timeline without re-logging it every step. See112the quick-start link above for the current archetype list.113114**Visualize a LeRobot episode.** Don't hand-roll this — `lerobot` already115wraps Rerun for exactly this case:116117```bash118lerobot-dataset-viz --repo-id=<id> --episode-index=0119```120121This is the `lerobot` skill's command, cross-referenced here because it's122the primary way most robium projects will ever invoke Rerun directly. The123entity paths and layout it produces are LeRobot's own convention (camera124streams, state/action vectors, per-episode structure) — inspect what it125logs before adding custom `rr.log()` calls alongside it, rather than126guessing the path scheme.127128**Remote viewer.** Two shapes, matching `lerobot-dataset-viz`'s own129`--mode distant` flag: either start a gRPC server in the logging process130(`rr.serve_grpc()`, optionally paired with `rr.serve_web_viewer()` for a131browser-based viewer with no local install) and connect to it, or start a132standalone viewer first (`rerun` in a terminal) and have the logging133process call `rr.connect_grpc()` to stream into it. From a separate134machine, the native viewer connects to a running gRPC server with:135136```bash137rerun rerun+http://<host>:<grpc_port>/proxy138```139140which is the same pattern `lerobot-dataset-viz --mode distant --grpc-port=<port>`141uses under the hood — a headless training/eval box logs, a local machine142watches, with no data ever needing to leave the remote box as a file.143144## Platform gotchas145146- **The viewer runs natively everywhere** — Linux, macOS (including Apple147 Silicon), and Windows — unlike `rviz2`, which needs ROS 2 and therefore148 Docker on macOS. This is why `rerun` is the default answer for a non-ROS149 pipeline regardless of local vs. remote, per the `visualization`150 umbrella's selection table.151- **`spawn()` needs a local display; it will fail on a bare headless152 box.** If a training/eval script that calls `rr.spawn()` is moved to a153 headless server, switch to `rr.serve_grpc()`/`serve_web_viewer()` or154 `rr.save()` instead — don't try to get a local window working over SSH.155- **The Python SDK bundles the Viewer; C++ and Rust don't.** A pure-Python156 robium project gets the viewer for free via `pip install rerun-sdk`; a157 C++/Rust logging path needs the separate `rerun-cli` (`cargo install158 rerun-cli --locked --features nasm`, per the SDK's own install docs) to159 get the same standalone viewer/CLI.160- **`serve_grpc()` buffers in memory** so late-connecting viewers still get161 full history — on a long-running process logging a lot of data, set its162 `server_memory_limit` argument rather than letting it grow unbounded.163164## Customization165166- **Entity path scheme for a new project:** don't invent one from scratch —167 Rerun's own docs on entity paths and hierarchies (linked from the168 quick-start page above) cover the conventions (grouping by169 sensor/subsystem, using `Transform3D` logs to place entities in a common170 coordinate frame); mirror `lerobot-dataset-viz`'s own scheme when logging171 alongside a LeRobot episode so the two show up coherently in one tree.172- **Mixing ROS and non-ROS data in one debugging session:** per the173 `visualization` umbrella, this is normal — use `rviz2`/`foxglove` for the174 ROS-side state and `rerun` for a policy's own inputs/outputs, viewed175 side by side rather than forcing one tool to cover both.176177## References178179- Upstream: [Rerun documentation](https://rerun.io/docs) and [Python180 quick-start](https://rerun.io/docs/getting-started/quick-start/python)181 (primary source for logging code — check before writing new `rr.log()`182 calls), [operating modes183 reference](https://rerun.io/docs/reference/sdk/operating-modes) (source184 of the spawn/connect/save/serve/stdout distinction above; the exact URL185 404'd on direct fetch this session, so this content came via186 search-synthesis — re-verify before relying on the exact operating-mode187 list), [rerun-io/rerun GitHub188 repo](https://github.com/rerun-io/rerun) (fetched directly this session —189 source of the current version and `rerun-cli` install command),190 [example gallery](https://rerun.io/examples). Sibling skills: `lerobot`191 (owns LeRobot dataset mechanics; wraps this skill for episode192 visualization via `lerobot-dataset-viz`), `data` (dataset sourcing193 strategy), `rviz2` and `foxglove` (ROS-native live debugging, not this194 skill's territory), `visualization` (umbrella, routes here).195196## Changelog197198<!-- One dated line per battle-tested change, added by skill-author hardening sessions. -->