A custom Rerun viewer for ROS 2 visualization, built on top of Rerun v0.34.
- Topics Panel — sortable table of subscribed ROS 2 topics with type, publisher count, and subscriber count
- Nodes Panel — sortable table of discovered ROS 2 nodes with transport info
- Status Bar — live connection state, relay-sourced bridge count, node count, topic count, and uptime
- Self-healing connection — dials a relay (or any Rerun gRPC endpoint) and auto-reconnects with backoff; start order does not matter
Requires Rust 1.82+.
cargo build --releaseOr with pixi:
pixi run build
pixi run sanity # check + fmt + lint + testcargo run --releaseBy default the viewer connects to rerun+http://127.0.0.1:9876/proxy. Point it elsewhere with
--connect, which accepts host, host:port, or a full proxy URL:
rewire-viewer --connect robot.local:9876If no relay is running yet, the viewer waits in "Connecting..." and attaches as soon as one appears; if the relay restarts, it reconnects on its own.
The WebAssembly build (app.rewire.run) reads two query parameters:
| Parameter | Values | Default |
|---|---|---|
url |
a recording to open on start | — |
theme |
dark · light · system |
follows the browser |
https://app.rewire.run/?url=https://examples.rewire.run/turtlebot3-example.rrd&theme=dark
Without theme, the viewer follows the browser's prefers-color-scheme. A page embedding the
viewer in an iframe cannot override that from the outside: color-scheme does not cross an
origin boundary, and the UI is painted into a canvas rather than out of browser widgets, so there
is nothing for the embedder's CSS to restyle. theme is the supported way to pin an embed.
To follow a host page's own theme toggle without reloading the iframe — a reload would re-download the recording — post a message to it:
frame.contentWindow.postMessage({ type: "rewire:theme", theme: "light" }, "*");The viewer applies dark, light and system and ignores anything else. The message only
changes appearance, so it is accepted from any origin.
Licensed under the Apache License, Version 2.0. See LICENSE for details.