Releases

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.

September 2026

August 2026

0.10.1

Features

  • A Nix flake — NixOS and nix-darwin had no install path. The install script writes into ~/.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.
  • Installs and upgrades come from the public GitHub releases — the install script and 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.

0.10.0

Features

  • 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.
  • A help screen worth reading — flags are grouped under headings, each names the value it wants, and 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.
  • Rerun 0.36 — the bridge, the bundled viewer, and the .rrd files it writes are Rerun 0.36.

Fixes

  • Colour stays out of redirected output — 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.

Breaking changes

  • Rerun 0.36 streams — a stock Rerun viewer older than 0.36 is no longer supported. It will warn that the data is newer than it is and may not read all of it. The bundled viewer moves with the bridge, so this only affects a viewer you installed yourself.

0.9.1

Fixes

  • Recording a large graph no longer drops its last topics on macOS — macOS starts a process with an allowance of 256 open files, and a full-graph 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.
  • A topic that fails to subscribe reports the cause — a topic that could not be bridged was reported without the reason underneath it, so a failure told you that it had happened and nothing more. This is why the limit above went unnoticed for so long. A failed topic now comes with the error behind it, both in the logs and in the reason recorded against the topic.

0.9.0

Overview

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.

Features

  • Recording to a file streams to a viewer too — --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.
  • Fewer, larger chunks on the live stream — scalar and text data now leaves the bridge merged, cutting the live chunk rate 13× on entity-heavy workloads.
  • 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.

Fixes

  • Unsubscribed latched topics stay gone — the latched replay cache had no eviction, so unsubscribing a latched topic and then triggering a replay, such as a relay reconnect or a reader joining, brought its last value back into the current recording. Across a session boundary the whole previous selection reappeared. An explicit unsubscribe now forgets the value while a publisher going away keeps it, which is the case the cache exists to survive, and the cache no longer grows without bound.
  • 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.
  • One recording no longer disturbs the next — leftover work from a finished recording could act on the one that followed it, in one case sending the new stream to the previous session's address. Each recording now cleans up after itself before the next begins.
  • Clean shutdown after unsubscribing everything — a run that dropped all of its topics before exiting failed to shut down cleanly and left its DDS participant for peers to time out. Shutdown now completes on its own, and warns rather than hanging when something refuses to stop.

Performance

  • Live latency, CPU and chunk count all down — on a real recording at the 8 ms tick, batch-to-ingest latency fell from 3.7 s to under 30 ms, encode CPU by 26%, and viewer UI-thread time by 14%. A heavy stress profile — three 1000 Hz transform streams plus two raw 100 Hz cameras — runs at 13 ms end to end where it previously showed 15.5 s.

Breaking changes

  • 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.
  • A --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.
  • The relay keeps almost no history by default — --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.
  • The live flush tick default drops from 20 ms to 8 ms — affordable now that plot data no longer pays the tick, and it keeps 3D transforms ahead of the display. Restore the old cadence with --flush-tick-ms 20 or output.flush_tick_ms.

0.8.0

Overview

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.

Features

  • Late viewers go live immediately — a viewer that joined mid-session replayed the entire buffered history oldest-first and could watch half a minute of stale data before catching up. The relay now serves the live stream first and backfills history behind it, newest first, so the display stays current while the timeline fills backward.
  • Latched topics reach late joiners — a latched topic published once, such as /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.

Fixes

  • Overload drops instead of lagging — under load, images and point clouds queued up out of sight, so the viewer fell behind while drop counters read zero. Delivered frames now stay fresh and drops are counted where they happen. Expect drop counts to rise on systems that were silently lagging before.
  • Viewer panels no longer stick on stale state — the Topics, Nodes and Diagnostics panels could show values from earlier in the session instead of what was happening now. They stay current.
  • Idle topics warn once, not every five seconds — "no data for 5s" repeated for the life of the bridge on a quiet-but-healthy topic. A topic now warns once per idle stretch and logs when data resumes, and latched topics never warn because silence is their normal state.
  • Relay and SDK messages appear in the logs — upstream Rerun records such as relay evictions and gRPC server errors were filtered out, so an eviction that explained missing data left no trace. They now show up, on screen and in the log file.
  • No runaway CPU after a peer shuts down — a remote participant going away, such as a simulator being closed, could trap the bridge in a discovery loop that echoed every dispose message back onto the network, pinning it at several cores' worth of CPU until restarted. The bridge now idles quietly after a peer leaves, and interrupting it with Ctrl+C during live traffic tears down cleanly instead of re-subscribing topics mid-shutdown.
  • Log files are capped at one week — logs rotated daily with no retention, so they accumulated until cleaned up by hand. They now rotate hourly and keep at most a week of files, pruning the oldest automatically.

Performance

  • One diagnostics row per topic — rate, bandwidth, drops, and latency logged as four separate entities per topic every second, so a session with hundreds of topics spent real work on diagnostics alone. They now log as one row per topic with named series.

Breaking changes

  • Per-metric diagnostics paths are gone — .../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.

July 2026

0.7.2

Overview

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.

Features

  • The viewer upgrades with the bridge — 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.
  • New-version notices cover the viewer — the startup check only ever compared the bridge against the published version, so a viewer release went unannounced. It now checks both and reports whichever is behind, sharing one block when both are. Notices are suppressed when stderr is not a terminal, so pipes and CI logs stay clean.
  • Relocating an install with 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.
  • The install script installs to ~/.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.

Fixes

  • A non-writable install directory fails immediately — replacing a binary renames over it, which needs write permission on the directory rather than on the file, so an install in /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.
  • Intel macOS says so instead of 404ing — platform detection named 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.
  • A viewer that cannot be fetched is reported on its own — a failed viewer download used to take the bridge upgrade, or the relocation that had succeeded alongside it, down with it.

Upgrading from an older install

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.

0.7.1

Fixes

  • Live viewing no longer falls behind on high-rate topics — the viewer received data in very small, very frequent batches, more than it could ingest per frame, so the display drifted further behind the robot the longer a session ran. Rewire now sends batches every 20 ms while streaming, enough to keep the viewer current without adding noticeable delay. Writing to a file with --save alone is unaffected.

0.7.0

Overview

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.

Features

  • Bag playback with 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.
  • Per-topic throttling — running 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.
  • Video on by default — topics of type sensor_msgs/CompressedImage carrying h264 or h265 now map to Rerun's VideoStream archetype without an opt-in flag, and rewire types lists it.
  • Latency reflects the network, not the publisher's clock — per-topic latency in the diagnostics panel now measures how long a message took to arrive, instead of comparing wall clock to the message's 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.
  • Receive-buffer check in 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.
  • Recording starts immediately — the bridge no longer waits five seconds for discovery to settle before subscribing; topics are bridged as they are discovered, so early messages are not missed. Pass --discovery-timeout <SECS> (or set discovery_timeout in the config) to get the old wait-then-subscribe behavior.
  • Rerun 0.35 — the bridge, the bundled viewer, and the .rrd files it writes are Rerun 0.35.

Fixes

  • Live viewing keeps up — a viewer that ingested slower than the stream could fall minutes behind and then fast-forward once the bridge stopped. The relay now keeps 512 MiB of history by default instead of 4 GiB, and the 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.
  • No stutter through a relay — live viewing through a relay arrived in clumps and rubber-banded; it is now as smooth as connecting a viewer directly.
  • Video plays smoothly — live h264 and h265 streams stuttered because the viewer's decoder was reset on every frame. Switching a topic's codec mid-run is also picked up correctly now.
  • Images appear in 3D views — images now sit under their camera's pinhole in the transform tree, so 3D views project them instead of reporting that the pinhole or image is not connected to the view's frame. Messages with an empty header.frame_id no longer land in a frame that exists nowhere in the TF tree.
  • No dropped messages in bursts — messages that arrived in the same instant could be discarded, losing both discovery data and samples from bursty publishers.

Performance

  • Less data to the viewer — grouped scalar plots, styling sent once instead of per message, and faster message decoding cut the work on both ends. Converting a real bag with rewire play --save went from 9.5 s to 6.6 s, and throughput from 30k to 43k messages/s.
  • Quieter logs — per-message converter logging moved to trace, so RUST_LOG=debug stays readable on high-rate topics.

Breaking changes

  • Per-axis scalar paths are gone — a signal that used to log to .../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 Viewer 0.5.x is no longer supported — upgrade the viewer alongside the bridge.
  • Rerun 0.35 streams — a stock Rerun viewer must be 0.35; older viewers cannot read the stream.

0.6.0

Overview

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.

Features

  • 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).
  • Automatic reconnect — when a relay or viewer restarts, the bridge reconnects on its own and keeps streaming the same recording. Latched topics (e.g. /tf_static) and one-time static data (coordinate frames, URDFs) are replayed after every reconnect, so late or restarted viewers still get their transforms.
  • Relay in the default flow — running 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.
  • Recording swaps are first-class in relay mode — recordings created by rewire log now survive relay and viewer restarts just like the startup recording, and rewire status shows the recording that is actually live.
  • ROS 2 Lyrical — wire compatibility with the new LTS distro: Fast DDS 3.6 and Zenoh 0.10 discovery, the new 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.
  • Covariance at a glance — scalar sensor converters (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.

Fixes

  • Recordings show their name again — setting an explicit recording id caused the viewer to label the recording <unknown> instead of showing its name and start time. Names now appear correctly in every output mode.
  • Fast DDS 3 latched delivery — latched (transient-local) topics now deliver reliably on Fast DDS 3 distros (Kilted, Lyrical).

0.5.3

Fixes

  • Bundled viewer matches the bridge — installs now ship Rewire Viewer 0.5.0, compatible with this release's Rerun 0.34 streams.

0.5.2

Features

  • Rerun 0.34 — upgraded from 0.33 to Rerun 0.34. Point the bridge at a Rerun 0.34 viewer to stream and record.

June 2026

0.5.1

Fixes

  • Stale topics clear promptly — when a ROS 2 node or publisher stops or crashes, its topics now disappear from the viewer right away instead of lingering, and other tools on the network see them go too.

0.5.0

Overview

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.

Features

  • More reliable static transforms — a new --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.

Fixes

  • Large images and point clouds no longer go missing — high-resolution camera images and dense point clouds now stream through reliably instead of occasionally failing to appear.
  • Mesh markers appear in the right place — 3D mesh markers are now positioned correctly in the viewer.

Performance

  • Lighter 3D meshes — static meshes are sent once instead of repeatedly, so they use less bandwidth and viewer memory.

0.4.0

Overview

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.

Features

  • 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 support — 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.
  • Multi-robot URDF frame prefixes — new 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.
  • gRPC control plane — runtime control (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.
  • Rerun 0.33 — upgraded from 0.31 to Rerun 0.33.

Fixes

  • 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.
  • URDF frame prefix leading slash — TF frame names now use a leading / prefix to match the ROS TF convention.

April 2026

0.3.1

Features

  • Bundled built-in ROS 2 message definitions — standard ROS 2 message schemas are now bundled with Rewire. 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.
  • PointCloud2 field support — intensity, rgba, and label fields are now rendered correctly in the viewer.
  • Bridge activity state — heartbeat now reports idle/active state, so the viewer can show whether a bridge is currently streaming data.

Fixes

  • DDS type resolution — message schemas now resolve on older DDS setups where they previously failed.

Performance

  • Faster PointCloud2 rendering — intensity-colored point clouds render faster.

0.3.0

Overview

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.

Features

  • Rewire Viewer — a custom Rerun-based viewer bundled with every install. Launches automatically when no --connect flag is specified. Includes three new panels:
    • Topics panel — sortable table of all subscribed topics with type and pub/sub counts.
    • Nodes panel — discovered ROS 2 nodes with publisher/subscriber counts.
    • Diagnostics panel — per-topic Hz, bandwidth, drops, and latency at a glance.
  • Multi-bridge support — multiple bridge instances can stream to the same viewer simultaneously.
  • --connect shorthand — --connect now accepts shorthand forms like host:port, host, or localhost in addition to full rerun+http:// URLs.
  • Auto-detect running viewer — when a Rerun viewer is already running on the default port, the bridge connects to it automatically instead of failing with a port-in-use error. No --connect flag needed.
  • Rerun 0.31 — upgraded to Rerun 0.31 with improved rendering and new view icons in the viewer.

Fixes

  • Node restart handling — when a ROS 2 node restarts, topics are resubscribed cleanly and diagnostics reset instead of showing stale values.
  • --connect URL parsing — shorthand forms like host:port and localhost are now resolved correctly on all platforms.
  • Clearer error messages — IPC and subscription errors now include actionable recovery suggestions.

Performance

  • Reduced streaming overhead — lower latency and less memory pressure when streaming to the viewer or a remote endpoint via --connect.

Breaking changes

  • Entity path namespace — bridge entity paths moved from bridge/* to /rewire/bridge/*. If you have saved Rerun layouts or blueprints referencing the old paths, update them.

March 2026

0.2.6

Features

  • Zenoh connect endpoints — new --zenoh-connect CLI flag and zenoh.connect config field to specify remote Zenoh router endpoints, replacing the hardcoded tcp/localhost:7447 default.

Fixes

  • Zenoh type resolution — fixed Zenoh topics not being subscribed because their message schemas failed to resolve.
  • Topic subscription retry — topics that initially fail to resolve are now retried automatically instead of being skipped.
  • XDG paths on all platforms — config and log directories now respect XDG_CONFIG_HOME and XDG_STATE_HOME. Fixes macOS defaulting to ~/Library/Application Support instead of ~/.config.

0.2.5

Fixes

  • Linux compatibility — x86_64 Linux binaries now build against GLIBC 2.35 (Ubuntu 22.04), fixing crashes on older distributions.

0.2.4

Features

  • WebSocket API — stream live ROS 2 topic data to any client over WebSocket. JSON and CDR wire formats, ZSTD compression, bearer token auth, per-topic rate limiting, graph discovery events, and list_nodes. Enable with --ws.
  • Geographic message converters — GeoPoseStamped, GeoPoseWithCovarianceStamped, and GeoPath from geographic_msgs are now supported (GeoPoints, Scalars, Ellipsoids3D, GeoLineStrings).
  • Automatic type resolution — Rewire resolves custom message types automatically via ROS 2 service introspection (get_type_description). AMENT_PREFIX_PATH is no longer required for type definitions (pre-Jazzy nodes are the exception).

Fixes

  • Version reporting — fixed the CLI reporting a stale version (e.g. 0.2.2 instead of 0.2.3), which incorrectly triggered the upgrade prompt.
  • Graceful shutdown — Rewire now shuts down cleanly instead of potentially hanging or dropping data.

0.2.3

Features

  • Debian and Ubuntu install from an APT repository — packages are published and signed at 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.

0.2.2

Features

  • 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.

Fixes

  • Camera info is logged under its topic name — the same frame_id collision fixed for images in 0.2.1 applied to CameraInfo, so two cameras sharing a frame overwrote each other's intrinsics.

0.2.1

Fixes

  • Images are logged under their topic name — the entity path came from the 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.

0.2.0

Features

  • Rewire keeps itself up to date — an install had no way of knowing a newer version existed, so staying current meant going back through the install script. Rewire now checks in the background and says so when it is behind, and rewire upgrade fetches the new version and replaces the binary in place.
  • Topics with no converter are reported at startup — a message type Rewire could not convert was skipped in silence, which looked exactly like a topic that never published. Startup now lists the types that matched your selection but have nothing to convert them, so a gap in coverage is visible and you know what to write a custom mapping for.

Fixes

  • Ctrl+C shuts down cleanly — the bridge tore the process down where it stood rather than unwinding, so a recording could be left short of what had already been captured. It now closes its subscriptions and finishes the recording on the way out.
  • --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.

Performance

  • Large graphs come up faster — topics were subscribed one after another, so a graph with hundreds of them spent a noticeable stretch of startup working through the list. Subscriptions now happen concurrently, both on the first sweep and when resubscribing after a node restart.

0.1.0

Overview

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.

Features

  • Topics are discovered and subscribed as nodes come and go — 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.
  • 49 message types convert with no configuration — images and depth images, 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.
  • The full transform tree is rebuilt in Rerun — every frame from /tf and /tf_static becomes a coordinate frame with axes, so the hierarchy you see in the viewer is the one the robot publishes.
  • A URDF on /robot_description is loaded automatically — the robot model appears in the viewer with no extra step and no separate description file to point at.
  • Pose uncertainty is drawn, not just plotted — covariance on poses and odometry becomes a 1-sigma ellipsoid in the 3D view, alongside the per-component time series.
  • Your own message types can be mapped without writing code — --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.
  • Recordings go to a file, a viewer, or both — --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.
  • Several bridges can run at once — each instance is addressed separately, so one graph can feed more than one recording without the two colliding.
  • A topic that falls silent is resubscribed on its own — a publisher that disappears and comes back does not need the bridge restarted to be picked up again.
  • Settings can live in a config file — anything available on the command line can be set in a JSON5 file, and an unrecognised key is reported rather than ignored, so a typo surfaces immediately. Shell completions are generated by rewire completions.