Rerun is an easy-to-use database and visualization toolbox for multimodal and temporal data.
Try it live at https://rerun.io/viewer.
- Python:
pip install -U rerun-sdk - Rust:
cargo add rerunandcargo install rerun-cli --locked - Online demo: https://rerun.io/viewer
- C++ FetchContent: https://github.com/rerun-io/rerun/releases/download/0.35.0/rerun_cpp_sdk.zip
🧳 Migration guide: https://rerun.io/docs/reference/migration/migration-0-35
✨ Overview & highlights
Improved command palette
The Viewer's command palette (Cmd+k/Ctrl+k) now lets you find & select entities & components!
commandpalette.mp4
It also adds context dependent commands like, like refreshing the currently selected
catalog or dataset.
Experimental Viewer catalog
The Viewer now includes an experimental built-in catalog for working with local recordings without starting a separate catalog server.
For now, it has to be activated through the settings menu since there's still some rough edges.
The main advantage of this is that it allows you to stream arbitrary large rrd files from disk with ease!
The internal Viewer catalog implements the entire functionality of the OSS redap server protocol and can be connected to via the Python SDK.
For security reasons, we limit this to connections from the same machine.
It also is a first step in a series of changes that make the Viewer more streamlined & explicit
about consuming live versus server data.
Rich display of built-in url types
Rerun now detects links known url formats (links to rrds, hub datasets, etc.) and shows them as a compact link button:
Previously these all would all be shown as a plain link.
The Rerun Hub dataset open button has been reworked as well:
Import HDF5 data using the chunk processing API
This release introduces Hdf5Reader, which reads an HDF5 file into a lazy stream of chunks — each group becomes an entity, each dataset a component:
from rerun.experimental import Hdf5Reader, IndexColumn
reader = Hdf5Reader("episode.h5")
store = reader.stream(index_column=IndexColumn.timestamp("/time", input_unit="s")).collect()Improved video chunk reader
Mp4Reader (Rust & Python) can now plumb data through FFmpeg to remove unsupported B-frames, transcode to different output formats, adjust gop size, and take advantage of some GPU accelerated codecs.
Also added improvements around reporting unsupported codecs more clearly, and handles large MP4 offsets without crashing.
This is experimental so we are still iterating on how to make it as seamless as possible to go from mp4 to RRD.
Feedback is welcome!
Time-windowed and corrupted MCAP conversion
You can now read a selected time range from a source MCAP file.
The corresponding option is available both for the Python McapReader and the CLI (see rerun mcap convert --help).
Besides simple time filtering, this also enables large recordings to be converted and optimized in bounded windows instead of loading the entire recording at once.
In a 20 GB test recording, processing 32 windows reduced peak memory use from about 26 GB to 1.4 GB and reduced wall-clock time from 14.3 seconds to 5.8 seconds.
Some user code is required to loop over windows in the source MCAP.
The converter can also read corrupted MCAP files directly without a separate recovery pass.
When the recover option is enabled in McapReader or CLI, the converter will attempt to recover the missing summary and index on-the-fly during processing.
Improved ROS 2 timestamp handling
All ROS 2 MCAP messages that have a top-level std_msgs/msg/Header "header" or a builtin_interfaces/Time "stamp" field now appear also on the ros2_timestamp timeline in addition to the standard MCAP log and publish timelines.
Previously, the ros2_timestamp timeline was only populated for ROS messages that were converted to Rerun archetypes.
Now this is supported for any ROS message that goes through schema reflection (e.g. custom ROS message types), making it easier to see all data in header timestamp order if desired.
⚠️ Breaking changes
- Rust SDK:
StateChange::with_statenow takes an iterator of values.
UseStateChange::single("open")for one state, or pass an array such aswith_state(["open"]). - CLI: The
--followmode for tailing.rrdfiles has been removed.
For live workflows, log to the Viewer and an.rrdfile with multiple sinks instead.
🧳 Migration guide: https://rerun.io/docs/reference/migration/migration-0-35
🔎 Details
🪵 Log API
- Add preliminary support for LeRobot v3 variant from 0.6.0 release 23b38b1
- Fix lerobot v3 ingest by ignoring lang dtype 97fa9a6
🐍 Python API
- Make segment unregistration a task, add UnregistrationHandle to SDK 71eb001
- Add b-frame removal in
Mp4Readerusing ffmpeg sidecar 43f4e1f - Add ability to split source MCAP in time 1fff2ee
- dataloader: incremental video decoding for sequential reads fb0d551
- Fix dimension check of Python
BarChart05c087c - Introduce
re_hdf5378ecb1 - Provide more FFMPEG sidecar knobs to MP4Reader cccbdb3
- Introduce
Hdf5Readerfe43874 - Expose
re_videoutilities to Python 494d5c1 - Use
IndexColumndataclass inParquetReadera7bac45
🦀 Rust API
- Use a single process-wide CPU runtime for dataframe queries 9ee95cc
🪳 Bug fixes
- Fix: auto-refresh collections when opening a recording 617032f
- Better error for unsupported mp4 codec e299277
- Fix stack overflow for live-streamed data d125236
- Fix chunk optimize failing on multi-timelines 112475b
- Fixes crash when zooming out the timeline too much 58d82cf
- Fix rendering a single-point line series as point 3dba889
- Treat CRA (and BLA) as an H.265 GOP start, not only IDR dd07a96 (thanks @adsick!)
- Fix clash of
ctrl+mandctrl+shift+mshortcuts when a view is focused 128b5a7 - Fix large MP4 offsets causing crash in
Mp4Reader6b45b0d - Fix not taking depth clouds into account for scene bounding box, leading to incorrect zoom limits df7d6c8
- Improve error messages by hiding details 954bf95
- Fix reflection-only decoding of standard ROS2 messages 7dc7b31
- Show camera rays (when hovering 2d) & reprojected points (when hovering in 3d) for named transforms f6beeba
- Fix drag & dropping component not picking correct selector if one is required 6724d08
- Fix web video decoding issues with large timesstamps 2bc9f4e
- Fix missing button hover effect in light mode fe43242
🌁 Viewer improvements
- Add experimental Viewer catalog server d945e0e
- Add
:<port>suffix to remote servers (except for HTTPS on 443) 823af63 - State timeline supports link-to-global time range e1c89e7
- Automatically spawn time series views when semantic type matches fcdd48a
- State timeline: null values and empty arrays reset state c3ba669
- State timeline's range ends are drawn like on the timeline panel 586ebe9
- Remove file-tailing (
--follow) mode 14f4d32 - Add
SpatialInformationblueprint controls to 2D view 5797b85 - Fixes nested components not showing up on state timeline 354714a
- State timeline can display arrays of states 4151615
- Fixes EncodedDepthImage depth_range fallback e84ad0a
- Load
.rrds(eagerly) into the internal catalog on Wasm 33cbf85 - Fall back to
tf#/<entity>for""frame IDs in transform retrieval 507732f - Always spawn an internal Viewer catalog (experimental) add2412
- Loop mode button no longer goes into time selection loop unless there's a time selection 55c3fe4
- Add
RrdFingerprintas a way to uniquely identify recordings ab5f279 - Give a clear error when a glTF/GLB requires an unsupported extension #12858 (thanks @wuisabel-gif!)
🗄️ OSS server
- Add asset datasets, which can be used to store shared data between segments in a dataset 6fbbc8f
- Fix FindEntries compatibility with clients that predate asset datasets 2d36803
🧑🏫 Examples
- Add Qdrant to Semantic Search Example 121530e
📚 Docs
- Remove custom
convert_mcap_protobufdoc snippets 0f1484e - Better docs description of alpha behavior for Points3D and LineStrips3D #12850 (thanks @alcolado!)
🖼 UI improvements
- Format target frame suggestions hierarchically e6fdc4e
- Command palette: find entities, components 96912a8
- Use a better color for highlighted nodes/edges in transform tree UI 204032a
- Improve display of reruns builtin url types bfa1e30
🕸️ Web
- Load
.rrds intore_servervia Origin Private Filesystem APIs 11482fb - Make
ChunkProviderandRrdChunkProviderasync 8d0e46c
🧢 MCAP
- MCAP: port
sensor_msgs/CameraInfoto lens and remove superfluousCoordinateFrame745647b - Add ability to convert from corrupted MCAP without running recover 9bd243a
- Move ROS2 stamp handling from lenses to the reflection decoder c944a28
- MCAP: add CLI args for recovery and time range 909766a
📈 Analytics
- Improve
query_metrics()accuracy d66340d
📦 Dependencies
- Patch
tonic-web-wasm-clientwith cherry-picked trailer changes 961bf9b - Fix ipykernel version restriction too strict e695e81
- Update Rust to 1.95 5e0d770
🤷 Other
- Expose remaining blueprint view types in the Rust SDK #12767 (thanks @FredrikNoren!)
- Limit total number of concurrent chunk fetches 69a6626