Features
- Rerun 0.37 — the bridge, the bundled viewer, and the
.rrdfiles it writes are Rerun 0.37.
What shipped in every version of Rewire, with downloads for each.
Install the latest release
macOS & Linux · installs v0.11.0, and rewire upgrade keeps it current.
.rrd files it writes are Rerun 0.37.~/.local/bin, which is not how a declarative system is built, and an unpacked tarball will not
run without patching. github:rewire-run/rewire now exposes a rewire package and a default
overlay, so it can go straight into a system configuration, and nix run github:rewire-run/rewire
works without installing anything. It repacks the published release archives rather than building
from source, so it gives you the same binaries every other channel ships.rewire upgrade fetched from a release host of their own. Both now resolve the latest version and
pull the archives from github.com. Nothing you type changes and existing installs keep upgrading,
but on a network that allowlists outbound hosts, the two to allow are github.com and
release-assets.githubusercontent.com.rewire uninstall removes what the installer put there — removing a curl install meant working
it out by hand, which missed the viewer beside the binary and left config, logs and version caches
behind. --purge takes config and logs too, recordings are never touched, and a copy a package
manager owns is left alone with the right command printed instead.record and play carry worked examples. --color auto|always|never decides the styling.--log-level on record, play and serve — verbosity could only be set through RUST_LOG
or the config file, and the help mentioned neither. The flag outranks RUST_LOG.rewire types --json — the supported type table now prints as JSON, straight from the
converter registry, so it can be fed to tooling instead of scraped from the terminal output.example_interfaces primitives are bridged — newer distros publish demo topics such as
/chatter as example_interfaces/String, which Rewire reported as unsupported. They now convert
like their std_msgs counterparts, and the schemas ship with the binary.REWIRE_VERSION pins the install script — the script honoured a bare VERSION, so a value CI
had set for its own project could install a release nobody asked for. A leading v is accepted..rrd files it writes are Rerun 0.36.rewire types > types.txt wrote raw escape codes into
the file. Styled output now drops its colour when it is not writing to a terminal.rewire record spends one on every subscription
alongside the relay, the viewer and its log files. The allowance ran out partway through, so the
topics at the end of the alphabet failed to subscribe on every run while the rest came through
fine. Rewire now raises its own allowance at startup, the way a server does, and warns instead of
failing if the system refuses.Live streaming keeps up now. On a real recording, the delay between the bridge batching data and the
viewer ingesting it fell from 3.7 s to under 30 ms, and recovery after an outage ships the present
instead of replaying a backlog. rewire record --save now opens a viewer alongside the file, so you
can watch what you are capturing, and a bare rewire record records the whole graph instead of
printing a topic list and exiting.
--save wrote the file and nothing else, so
record-and-watch meant sitting in front of an empty viewer while the capture ran. A save run now
resolves the same live half as a flagless rewire record: it tees into whatever already owns port
9876, or starts the embedded relay and spawns the viewer. Add --no-live, or output.live: false
in the config file, for pure file-only output on measurement runs and machines with no display. It
requires a save target and cannot be combined with --connect.--transport chooses which wire transports start — every bridge started DDS and Zenoh
together, so a DDS-only deployment carried a Zenoh session and a background dial loop against a
router that was never meant to exist. rewire record, rewire doctor and
rewire mappings generate now take --transport all|dds|zenoh, with a transport key in the
config file. The default still starts both, so nothing moves unless you ask it to.rewire mappings generate reads the config file — it ignored it entirely, so a domain or a
transport set there was not honored when generating a mapping template.-v is short for --version.multicast_scouting reaches Zenoh — the key was parsed, documented in the config template and
never read; the bridge hardcoded it off, so setting it produced neither the behaviour nor an
error. Zenoh now always receives an explicit config, and the address the bridge dials is logged
when the default applies. The template also documents the transport key and what
multicast_scouting actually does.rewire record with no topic selection records everything — it used to wait for discovery to
settle, print the topics it found, and exit without recording anything. A bare rewire record now
behaves like rewire record --all, and --all is only needed to override a config include list.
To see what is on the graph without recording it, rewire doctor lists every topic with its type
and whether a converter exists for it.--save run now probes for and can spawn a viewer — saving is no longer file-only, so it
looks at port 9876 and starts the relay and viewer when nothing answers. Pass --no-live, or set
output.live: false, on measurement runs and displayless deployments where that is unwanted.--memory-limit and serve.memory_limit drop
from 512MiB to 1MiB, for both rewire serve and the relay a plain rewire record starts.
History backfill actively harmed the reader it was sent to: it arrives at wire speed on top of the
real-time stream and parks unread in the viewer's receive queue as permanent staleness, scaling
with the limit. Static and store-info records are evicted last, so a scene still survives at this
size, and the bridge replays statics and latched topics to every reader that joins. Raise the
limit if you specifically want deep late-join backfill from the relay.--flush-tick-ms 20 or output.flush_tick_ms.Joining a session late now works the way you would expect. A viewer that connects mid-session goes live
immediately and backfills history behind it instead of replaying the whole buffer oldest-first, and latched
topics such as /tf_static are replayed to every late joiner even after high-rate traffic pushed them out of
the relay's history.
The bridge is also more honest under load and in its logs. Overloaded image and point cloud topics now stay fresh and report their drops instead of hiding lag in a queue, relay and Rerun SDK messages show up in the bridge's logs, and log files on disk are capped at a week instead of growing forever.
/tf_static or a URDF,
could be evicted from the relay's history by high-rate traffic, leaving every viewer that joined afterward
without transforms. The bridge now notices each reader joining the relay and replays its latched cache to
them at the original times. Archives written with --save are unaffected..../topics/<topic>/hz, .../bytes_per_sec, .../drops, and
.../latency_ms no longer exist; all four are named series on the topic entity itself. Blueprints
referencing the old paths need updating.Running rewire upgrade now updates the viewer too, and no longer needs sudo. It used to extract only the
rewire binary from a tarball that carried both, and a viewer-only release was invisible to it. The bridge and
the viewer are now independently versioned upgrade channels, and fresh installs land in a directory you own.
rewire upgrade installs the rewire-viewer bundled with the
release it fetches, keeping the pair matched, and picks up a viewer that has moved on its own since.rewire upgrade --relocate — moves an install out of a root-owned directory
such as /usr/local/bin into ~/.local/bin, brings both binaries up to date, and clears the originals once
the new location is reachable on PATH. It is refused under sudo, where HOME and PATH belong to root
rather than to you.~/.local/bin — a directory you own, so upgrades never need sudo. The
script prints the line to add when it is not on your PATH, and warns when an older copy shadows it;
re-running with REWIRE_REMOVE_SHADOWED=1 removes that copy. Override the target with INSTALL_DIR./usr/local/bin made every
upgrade require sudo. Upgrade now checks the directory before it downloads anything, and points at
--relocate when moving the install is the fix.x86_64-apple-darwin, a target that has
never been built, so an Intel Mac composed a URL that could only fail. Detection now carries exactly the
published targets and reports the platform by name, the install script rejects Intel macOS up front, and a
failed download prints the URL it could not fetch. Rosetta is not a workaround — it runs x86_64 on Apple
Silicon, not the reverse.If rewire was installed into /usr/local/bin by an earlier version, run rewire upgrade --relocate once,
without sudo. A v0.7.1 install cannot move itself, so it stays where it is and keeps asking for sudo on
every upgrade until relocated.
--save alone is unaffected.Rewire now plays back recorded bags. The rewire play command reads an MCAP file and runs it through
the same converters as the live bridge — streaming it to a viewer at recorded pace, or converting it
straight to an .rrd file. No ROS 2 installation and no robot on the network.
This release is also faster and easier on the viewer. Vector-valued signals such as position and velocity now log as a single plot with one series per axis instead of one entity per axis, live viewing through a relay no longer lags or stutters, and h264/h265 video is on by default.
rewire play — run rewire play flight.mcap to stream a recorded MCAP bag to
a viewer at recorded pace, with --rate to speed it up or slow it down. Adding -o flight.rrd
converts the bag to an .rrd file as fast as the machine allows. Selection and mapping flags such
as --topics, --exclude, --throttle, and --mappings work as they do on record.rewire record --throttle /camera/image_raw=10 bridges at most
10 Hz from that topic and drops the rest. Topic names accept glob patterns, the config file exposes
the same setting as topic_overrides[].max_hz, latched topics are never throttled, and the
diagnostics panel shows the cap next to the topic's actual rate.sensor_msgs/CompressedImage carrying h264 or h265 now map
to Rerun's VideoStream archetype without an opt-in flag, and rewire types lists it.header.stamp. It stays correct while replaying a bag with ros2 bag play, is reported
for every subscribed topic, and shows - rather than an absurd number when a publisher's clock is
out of sync.rewire doctor — on Linux a low net.core.rmem_max silently drops
large images and point clouds under load. The doctor command now flags it and prints the sysctl
fix.--discovery-timeout <SECS> (or set discovery_timeout in the config) to get the old
wait-then-subscribe behavior..rrd files it writes are Rerun 0.35.serve.memory_limit config key now applies to the relay that a plain run
of rewire record or rewire play starts for you. Archives written with --save are unaffected
and stay complete.header.frame_id no longer land in a frame that exists
nowhere in the TF tree.rewire play --save went from 9.5 s to 6.6 s, and throughput from 30k to 43k messages/s.trace, so RUST_LOG=debug stays
readable on high-rate topics..../position/x, .../position/y
and .../position/z now logs one .../position entity with x, y, z as named series.
Blueprints referencing per-axis paths need updating; to isolate one axis in a plot, click a series
in the legend to toggle it, or Alt-click to solo it. The BatteryState converter keeps per-field
entities because its fields do not share a unit, and custom JSON5 mappings keep their user-defined
paths.Rewire now has a relay. The rewire serve command runs a headless hub. Bridges stream into it, and
viewers — including browser viewers — connect to it. The default rewire record flow embeds one
automatically. Bridges reconnect on their own when a relay or viewer restarts, replaying static
transforms and latched topics so nothing important is lost.
Second, Rewire supports ROS 2 Lyrical, the new LTS distro, out of the box — the same zero-install
drop-in, now from Humble through Lyrical. This release also adds a nav2_msgs/VoxelGrid converter
and variance/covariance series for sensor topics.
rewire serve — headless relay — run a standalone relay that hosts the Rerun stream endpoint
and the Rewire monitoring service on one port. Configure with --bind, --port,
--memory-limit, and repeatable --cors-allowed-origin flags, or a new serve section in the
JSON5 config file. Browser viewers can connect directly (gRPC-web with CORS)./tf_static) and one-time static data
(coordinate frames, URDFs) are replayed after every reconnect, so late or restarted viewers still
get their transforms.rewire record with no flags now starts an in-process
relay and connects the bundled viewer through it, so viewer restarts no longer interrupt
recording. When the port is busy, the bridge probes for a relay, then a legacy 0.5.x viewer, then
a stock Rerun viewer.rewire status — inspect a running relay: uptime, buffer memory, and one line per connected
bridge with its state, app, recording id, and how recently it was heard from.--save archives — rewire serve --save archives everything flowing through the relay into
a .rrd file, and rewire record --connect --save writes a local archive while streaming live.
You name a stem and Rewire completes the filename (recording id or session timestamp), so
restarts and rewire log swaps never overwrite an earlier archive; --save-session appends
every recording of a run to a single file instead.rewire log now
survive relay and viewer restarts just like the startup recording, and rewire status shows the
recording that is actually live.INT64/UINT64/BOOL point cloud field datatypes, and Lyrical's _buf_*
buffer side-channel topics are skipped by auto-subscribe (subscribe explicitly by name if you
really want one).nav2_msgs/VoxelGrid — new converter mapping Nav2 voxel grids to Rerun's VoxelGridMap
archetype, colored by value through the Turbo colormap. Marked unstable while the Rerun archetype
itself is.Temperature, FluidPressure,
RelativeHumidity, Illuminance, Range) now log their reported variance as a series, Imu
logs its orientation, angular velocity, and linear acceleration covariance diagonals, and
Odometry logs its twist covariance diagonal.<unknown> instead of showing its name and start time. Names now appear correctly
in every output mode.High-resolution camera images and large point clouds now show up reliably in the viewer — streams that could previously fail to appear now come through. This release also makes 3D mesh markers display in the right place and adds an option for more reliable static transforms.
--latched-depth option keeps more of a topic's
latched messages, so coordinate frames published by several sources (e.g. /tf_static) all show up.Rewire now supports visualization_msgs — Markers, MarkerArrays, and ImageMarkers render in the
viewer out of the box, including 3D mesh loading for MESH_RESOURCE markers. OccupancyGrid has been
upgraded to use Rerun's native GridMap archetype, and multi-robot setups get first-class URDF support
with per-robot TF frame prefixes.
visualization_msgs/Marker — all 12 marker types are supported: ARROW, CUBE, SPHERE,
CYLINDER, LINE_STRIP, LINE_LIST, CUBE_LIST, SPHERE_LIST, POINTS, TEXT_VIEW_FACING,
MESH_RESOURCE, and TRIANGLE_LIST. DELETE and DELETEALL actions are handled. MarkerArray
batches are processed in a single pass.visualization_msgs/ImageMarker — 2D overlay markers on camera images.MESH_RESOURCE markers resolve mesh URIs (package://, file://,
absolute paths) and load GLB, glTF, OBJ, STL, and DAE/COLLADA files in the viewer, with optional
color tinting.nav_msgs/OccupancyGrid maps to GridMap — nav_msgs/OccupancyGrid now uses Rerun's GridMap archetype
instead of rendering as an image, providing native grid visualization with proper spatial coordinates.frame_prefix option per URDF entry in the config file.
Prefixes all TF frame names (e.g., robot1/base_link) so multiple robots can coexist in the same
viewer session without frame collisions.rewire config subcommand — rewire config path prints the active config file location,
rewire config generate writes a starter JSON5 config with all available fields documented.rewire log, rewire topics, rewire graph) now runs
over a loopback gRPC service on 127.0.0.1 instead of a Unix domain socket. CLI commands find a
running bridge and connect to it automatically.rewire upgrade on managed installs — running rewire upgrade when installed via pixi or apt
now prints a helpful message instead of attempting a self-update that would fail./ prefix to match the
ROS TF convention.AMENT_PREFIX_PATH is no longer required by default — only set it when you need
Rewire to resolve custom message types from a sourced workspace.rewire mappings generate — new subcommand that inspects discovered topics and generates a
JSON5 mappings template for custom message types. Spawns a type resolver automatically and waits
for custom schemas to resolve before writing output.intensity, rgba, and label fields are now rendered
correctly in the viewer.Rewire now ships with its own viewer. Run rewire record --all and the Rewire Viewer launches
automatically — no separate Rerun instance needed. The viewer includes custom panels for Topics,
Nodes, and Diagnostics built specifically for ROS 2 workflows.
--connect flag is specified. Includes three new panels:
--connect shorthand — --connect now accepts shorthand forms like host:port, host, or
localhost in addition to full rerun+http:// URLs.--connect
flag needed.--connect URL parsing — shorthand forms like host:port and localhost are now resolved
correctly on all platforms.--connect.bridge/* to /rewire/bridge/*. If you
have saved Rerun layouts or blueprints referencing the old paths, update them.--zenoh-connect CLI flag and zenoh.connect config field to specify
remote Zenoh router endpoints, replacing the hardcoded tcp/localhost:7447 default.XDG_CONFIG_HOME and
XDG_STATE_HOME. Fixes macOS defaulting to ~/Library/Application Support instead of ~/.config.list_nodes.
Enable with --ws.GeoPoseStamped, GeoPoseWithCovarianceStamped, and GeoPath from
geographic_msgs are now supported (GeoPoints, Scalars, Ellipsoids3D, GeoLineStrings).get_type_description). AMENT_PREFIX_PATH is no longer required for type definitions
(pre-Jazzy nodes are the exception).0.2.2 instead of 0.2.3),
which incorrectly triggered the upgrade prompt.apt.rewire.run, so installing and upgrading Rewire goes through apt alongside everything else on the
machine, instead of unpacking a tarball or re-running the install script by hand. Every release so far is
in the repository, not just this one.rewire topics shows what a running bridge is subscribed to — confirming what was actually being
streamed meant reading back through the logs. The command lists the live subscriptions with each topic's
ROS 2 type and whether it arrived over DDS or Zenoh, and takes --pid to pick between bridges when several
are running.CameraInfo is converted by default — the converter existed but was left out of published builds, so
camera intrinsics never reached the viewer from a released binary. It is now on for everyone, and the
Pinhole is logged above the image rather than beside it, so the projection applies to the image underneath
it and the camera is placed by the transform tree.frame_id collision fixed for images in 0.2.1
applied to CameraInfo, so two cameras sharing a frame overwrote each other's intrinsics.frame_id in the message
header, so two cameras publishing under a shared frame landed on the same entity and each overwrote the
other. Images now follow the topic they arrived on, which is unique by construction.rewire upgrade fetches the new version and replaces the binary in place.--topics and --exclude take several values at once — both flags accepted only a single value despite
reading as lists, so a space-separated selection silently used the first entry.rewire log finds the running bridge — it looked for the bridge under its own process ID, which is
never where a bridge is, so the command failed every time. It now finds running instances on its own, takes
--pid to pick between them, and clears up entries left behind by a bridge that has since exited.The first release of Rewire. Point it at a running ROS 2 graph and it discovers the topics, converts each
message into the matching Rerun archetype, and streams the result to a viewer or an .rrd file. There is no
ROS 2 runtime to install and nothing to build into a workspace — Rewire speaks DDS and Zenoh natively, so it
works against CycloneDDS, FastDDS and Zenoh alike. It does need AMENT_PREFIX_PATH set, which is where it
resolves message schemas and URDF meshes from.
rewire record --all takes the whole graph,
--topics narrows it to a list, and --exclude drops topics by glob pattern. A node that starts later is
picked up without restarting the bridge.PointCloud2, LaserScan,
IMU and the other sensor scalars, poses and twists, odometry, paths, occupancy grids, 2D and 3D detections,
and rosout. rewire types lists every one of them with the archetype it maps to./tf and /tf_static becomes a
coordinate frame with axes, so the hierarchy you see in the viewer is the one the robot publishes./robot_description is loaded automatically — the robot model appears in the viewer with no
extra step and no separate description file to point at.--mappings takes a JSON5 file describing
how a type becomes Rerun archetypes, including arrays that expand into one entity per element and access to
nested fields.--save writes an .rrd and --connect streams to a
viewer running elsewhere.--diagnostics reports what each topic is doing — rate, bandwidth, drops and latency, as time series in
the viewer rather than numbers you have to go looking for.rewire doctor checks what Rewire can see — the environment, the nodes and topics it discovered, which
of them have converters, and QoS mismatches that would otherwise silently stop data arriving.rewire completions.