Rerun is the data layer for physical AI. Log, query, visualize, and stream to training on shared columnar storage built for multimodal 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.33.0/rerun_cpp_sdk.zip
🧳 Migration guide: https://rerun.io/docs/reference/migration/migration-0-32
✨ Overview & highlights
Python chunk processing API
This release introduces a chunk processing API designed for systematic and efficient wrangling of robotics data. It includes:
- A
Chunkobject for inspecting, creating, and manipulating chunks. - Readers for common file formats (RRD, MCAP, Parquet, URDF, and more to come) which output streams of chunks.
- A composable
LazyChunkStreamclass to define memory-bounded chunk-based filtering and transformation pipelines. - Lenses: an expressive and performant API to manipulate component data in chunks.
- A multithreaded, GIL-free, native engine for pipeline execution that is designed for distributed execution in the future.
- Interoperability with a catalog server and the Rerun SDK logging API.
In addition to enabling powerful data wrangling pipelines, the chunk processing API is significant for offering read/write chunk-level control of RRD files down to the raw Arrow data.
Note: this API is experimental and subject to breaking changes as we continue to improve it.
Experimental dataset review
You can now build tables of recording previews configured with arbitrary blueprints!
https://github.com/user-attachments/assets/7acf9671-c46a-4355-a50f-2670cc80c4d9
Clickable flags let you curate data directly from the table: toggles update a boolean flag column and are written back to the server.
To try it out, enable the experimental options in the Viewer's settings and try the two Python examples:
table_grid_with_flags for basic grids with clickable flags,
and table_blueprints for the full preview experience.
Limitations, or why this is still experimental:
- previews don't yet work directly on raw datasets; you have to send a special table to the server instead (see examples)
- table blueprints are currently text-encoded in table metadata, this is subject to change
- depending on the number and content of previews, overall runtime performance can be poor, especially in the browser
- many UX details are still unfinished
Experimental state timeline view
A new experimental view for visualizing discrete state transitions over time as horizontal colored lanes, useful for state machines, mode transitions, and similar discrete signals. Log state changes with the new StateChange archetype; configure their display on the UI or using StateConfiguration in the blueprint API.
Read our guide to get started. Feedback is appreciated!
GridMap archetype and MCAP support for ROS occupancy grids
Rerun now supports 2D grid maps, as used e.g. in robot mapping & navigation applications, through a new GridMap archetype.
- A
GridMapis an image buffer with defined cell size per pixel, which can be embedded as a textured rectangle in a 3D scene. GridMaphas a regularImageBuffercomponent, so you can also send color images (e.g. to do custom color-mapping in your code).- For layering of multiple maps you can optionally set draw order and opacity when logging, or separately in the viewer / blueprint.
- The visualizer also supports the colormap options that RViz users are familiar with, selectable at log time or in the viewer / blueprint.
- In a 3D scene, the map appears at the entity's coordinate frame (either entity-path based or with TF-style named frame like
CoordinateFrame("map")). Additionally, an optional translation & rotation offset can be specified.
For ROS 2 users:
- 🧢 Rerun's MCAP importer automatically loads ROS 2
nav_msgs/OccupancyGridmessages asGridMaps. - 📖 Our ROS 2 guide also shows an example how you can log
GridMapfrom your custom ROS nodes.
Here's a demo video showing a typical ROS 2 MCAP recording with multiple map and costmap layers in Rerun:
https://github.com/user-attachments/assets/f31b712d-2dd7-4e45-bb6a-0e103e7016b3
OSS catalog server now streams from disk
The OSS server (rerun server and rr.server.Server) no longer eagerly loads RRDs in memory when registering datasets.
It instead uses the manifest embedded in the RRDs to load chunks on demand when serving requests.
This greatly extends the amount of data that can be registered and queried for a given memory budget, and makes registration orders of magnitude faster.
Note: This requires the RRDs to have a manifest, which most modern RRDs have.
Legacy RRDs are still eagerly loaded.
Use the rerun rrd optimize CLI to migrate and optimize legacy RRDs.
Plot improvements
<picture>
</picture>
- Performance improvement for scenes with many series. Moved from egui CPU tesselation to GPU line rendering.
- Redesigned tooltips. Hovering over a plot now shows a cleaner, more compact tooltip with color swatches matching each series. Also it is visually obvious now when events were actually logged.
- Better NaN & Infinity handling. Time series views now gracefully handle non-finite values: the Y-axis range ignores them, isolated data points surrounded by NaN are drawn as dots instead of disappearing, and aggregation skips over non-finite values rather than corrupting nearby points
Performance improvements
This release comes with a few significant performance improvements. Among other things:
- Visualizing scenes with many transforms on the same entity (as it is often the case with
tf-style named transforms) will now perform vastly better - Plot line tessellation is now GPU accelerated, using the same rendering path as our 3D lines
- Web viewer now decodes images using the web decoder, resulting in much smoother play of raw-image "videos"
- various improvements to
rrd optimize(formerrrd compact) to produce more streaming & object storage friendly data - MCAP decoder is now multithreaded
New branding
<picture>
</picture>
<picture>
</picture>
You may have noticed a new Rerun logo and app icon! We've also slightly tweaked our color palette. Stay tuned for more exciting news!
Docs feedback on the website.
As a part of our website update, we've also added a feedback form to all our documentation pages. So you can add your feedback directly to the respective topic.
<picture>
</picture>
☁️ Highlights for Rerun Hub customers
Several improvements in the open-source Rerun SDK are designed specifically to work with Rerun Hub. Here are the key updates that are especially relevant if you're a customer of Rerun Hub:
Direct fetch from object storage for commercial Rerun Hub customers
The SDK will now fetch chunk data directly from the object store that holds your recordings, without needing to proxy the data through the server. This allows for better performance in highly parallel workloads, as well as lower latency when the client is located close to the data store.
The old proxy path is still supported, and can be opted into using the RERUN_CHUNK_STRATEGY=grpc environment variable.
Experimental training dataloader
You can now train PyTorch models directly against the Rerun OSS server, with no intermediate export step!
The new highly experimental rerun.experimental.dataloader module exposes Rerun recordings as iterable or map-style PyTorch datasets, streaming encoded images, scalars, and compressed video (h264/h265/av1) on the fly. Random access, multi-worker prefetching, and DDP support work out of the box.
Each field accepts an optional window=(start_offset, end_offset) parameter, an inclusive range relative to the current index. When set, the field yields the slice of values across that window instead of a single sample. For example, window=(1, CHUNK_SIZE) returns the next CHUNK_SIZE action values after every observation, making action-chunking policies a single query per batch.
See the new LeRobot ACT training example.
Expect breaking changes between releases while we iterate on the design. For large-scale training, Rerun Hub offers a higher-performance backend.
⚠️ Breaking changes
- "Data loaders" renamed to "importers" to avoid confusion with the widely-used ML/PyTorch "dataloader" concept
- Rust Lenses API has been restructured
rerun rrd compactrenamed torerun rrd optimize, has profiles and new defaultsDatasetEntry.registerrequires a sequence of URIs (Python)- URDF importer now loads the static transforms of the model to the
/tf_staticentity by default - MCAP metadata and statistics are now saved to
__mcap_metadata
🧳 Full Migration guide: https://rerun.io/docs/reference/migration/migration-0-32
🔎 Details
🪵 Log API
- Group URDF collision entity paths by geometry type a394117
- Add Parquet Dataloader with some workarounds for merging columns c1ee446
- Optionally add struct grouping on parquet columns ae22b4d
- Introduce
GridMaparchetype & visualizer d74cb27 - Rename "DataLoader" to Importer 11cd1c2
- Use
/tf_staticas default in URDF importer & make configurable inUrdfTree1f01a57 - Expose
mimicjoints from URDF cf4c652 - Add RViz-style "Map" and "Costmap" color options for
GridMapc452a48 - Add
stream() -> LazyChunkStreamto PythonUrdfTreedc51f60 - Renames ChunkBatcherConfig::ALWAYS to ALWAYS_TEST_ONLY 46c20b8
- Opt-out from generating a FileSink footer 0a78f28
- Add
UrdfTree::compute_joint_transform_batchesfor lens/chunk pipelines efd045c - Add snippet showing a
GridMapat a specific pose 2e99c68
🐍 Python API
- Introduce
LazyChunkStreama0ce421 - Introduce
McapLoaderto produceLazyChunkStreamfrom MCAP file ef51623 - Expose
Selectorin Python SDK ffc088d - Introduce Python
ChunkStoreobject 9294554 - Add ability to compact
ChunkStore5dd9f23 - Use Lenses to manipulate
ChunkStreamin Python SDK 72ff520 - Make notebook display loading spinner when waiting on send_table ea09906
- Make
RrdLoaderproduce lazyChunkStore2e804c4 - Add
mapandflat_mapmethod toLazyChunkStream393680c - Add
Chunkconstruction methods:from_columnsandfrom_record_batch547d650 - Add
exists_okoption toCatalogClient.create_dataset8d4e1b3 - Add
Chunk.apply_lenses()API 88fea86 - Expose split-size-ratio in python c21a5b8
- Initial torch dataloader dca28f2
- Rename
rrd compacttorrd optimizec5b027b - Add
apply_selectormethods toChunk5a20bd6 - Use
Mapping-basedLensOutputand improve naming 2fc409e - Add Map-style torch dataset ebb9953
- Make task cancellation API public, add
.cancel()on RegistrationHandle 260d119 - Add documentation page for lenses 1cb99e5
- Add include & exclude topic filter options to MCAP importer 1b586fa
- Further simplify Lenses API in Python and Rust 65d744a
- Allow creating a
Chunkcopy with a new entity path 3d8f97c - Make
Selectorpicklable db20691 - Add
dataset.segment_store(segment_id)to create a lazyChunkStore524b5cc - Introduce optimization profiles and change default d3488bc
- Split off
LazyStorefromChunkStore(now returned bydataset.segment_store()andRrdReader.store()) fa63189 - Improve dataloader config b96a985
- Add support for multi-store RRD to
RrdReader41ed51a - Rename
send_chunktosend_chunksand accepts stores andLazyChunkStreamc8e0965 - Deprecate
rerun.recording8b52512 - Fix disconnect footgun 4833706
🦀 Rust API
- Introduce
at_entityinstead of*_output_columns_at8e65ff0 - Decouple entity path filtering from
Lensdefinition 80ab3a9 - Pushdown filters for select 215e8aa
- Rework chunk output produced by Lenses dbeef05
- schema evolution: widen record-batch on read 838a669
- Unify
Chunk-based APIs between Rust and Python a171102 - Add
apply_selectormethods toChunk5a20bd6 - Enforce one-to-one mapping of
LensOutputto target entity b5709e5 - Add documentation page for lenses 1cb99e5
- Further simplify Lenses API in Python and Rust 65d744a
- Allow creating a
Chunkcopy with a new entity path 3d8f97c - Add
GraphViewto rust blueprint api 9327b5f
🪳 Bug fixes
- Fix our python 3.10 support 7d4716d
- Fix MCAP CLI decoder identifier list 5b170a4
- Fix bug where shapes defined with UI units were scaled incorrectly 7e7ec15
- Improve
rerun download1c9aa10 - Fix off-by-one bug in video stream cache f0484ee
- Fix: Hyperlinks shown in tables wouldn't resize f16707e
- Fix range queries on 3D points in
SpatialView3De8dc5e0 - Fix plot view time range ui 45de0cb
- Make arrow keys pause playback 37009c0
- Fix silent error swallowing in gRPC streaming, add error injection testing infrastructure ec01f7a
- Fix
follownot being propagated tohttpURLs with extensions 09d5f94 - Fix renderer registration order influencing draw order 97db1a1
- Unify
rerun//andrerun+httpsat parse time, fixing Viewer bugs for incorrectly distinguishing them 69ff58d - Add
SystemCommand::RemoveRedapServerfor more thorough cleanup 52bc3ea - Close recordings when a server is removed ad7371f
- Fix visualizations not showing up when initial data was empty c867040
- Fix reflection of "pure-constant" ROS2 message schemas fefbf6d
- Handle large video file error gracefully #12744 (thanks @AyushAgrawal-A2!)
- Use row id instead of byte span for video streams 645e57b
- Return empty tensor on video decoder cold-start instead of raising 13f92e5
🌁 Viewer improvements
- Cluster overlapping coplanar
TexturedRects and use draw order for tie-breaking 76b64c1 - Always open recording in background from context menu a173287
- Improve implicit handling of invalid instance pose rotations e65a6ce
- Use optional
poseof FoxglovePointCloud(if set) fee2815 - LeRobot loader: Add support for flat feature names a493658
- Select
message_log_timeas default timeline for MCAP b687bd6 - Properly handle outline masks of overlapping coplanar rectangles 617a7c2
- New liftable shape limit to avoid unresponsive viewer a4f6223
- Add configurable CORS policy for rerun proxy and re_server 8baa142
- Smarter
VideoStreamstreaming 2f73783 - Support focusing specific 3D points in viewer ddda5cf
- Experimental grid layout & flagging for tables 9b6bf71
- Make panel state toggable while inspecting tables/server 2eb8fb0
- Streaming info panel (as part of memory panel) 597fdd4
- Respect
up_axisin Collada (.dae) mesh importer #12708 (thanks @Abhisheklearn12!) - Improve handling of NaN & Infinity values in time series view 055777f
- By default, fetch similar chunks 30 seconds of playtime forward 7c0680e
- Remember memory limit between viewer relaunches 1eb763a
- Add support for duration columns in lerobot datasets 1cd0abc
- Support hierarchical dataset naming in viewer efa2f23
- Display
.separated dataset in a folder hierarchy a217309 - Full VP8+VP9 support on native & web a1642b4 (thanks @AyushAgrawal-A2!)
- Use video player for encoded depth images c3af7d5
- Better log console formatting bd4c866
- Make text document configuration part of the blueprint e6ae09a
- Experimental preview renders for tables with data set URLs b133946
- Add
VideoStream.is_keyframecomponent d50eab6 - Limit 2D & 3D view zoom out e43c172
- Make previews always play looping 90b5b01
- Fix arrows blowing up when cap behind camera db571f7
- Add Ellipses2D archetype 2cbf5ff
- Clamp time controls 8af40e2
🗄️ OSS server
🚀 Performance improvements
- Decode encoded images using our video-player system, and use the web video decoder 794a722
- Drop details from the manifest that aren't needed to reduce manifest memory bloat 612e9ef
rerun rrd compact: split by video GoP boundaries 2485570- By default, only prefetched what is visible b509f91
- Speed up
DatasetView.reader: only fetch schema once b266938 - Huge speedup transform lookups for overlapping transform chunks 803337d
- Don't traverse through parent entities in queries if there are no cleared entities at all a873b22
- Fix not taking fast paths in line/point for using default radii 5fb7c3d
CatalogClient: Add RTT and bandwidth probes 87c5e05- Improve performance of Protobuf reflection 3969825
registernow takes a list of URIs 9ec5265- Parallelize mcap decoder 6ccfcbf
- Emit sparse
is_keyframemarker chunks when running optimize ec6dff0
🧑🏫 Examples
- Add dataloader training example 8cd8acb
- Add snippet demonstrating
LineStrips3DwithVisibleTimeRange80dd138 - Use blueprint, component ui and type reflection in
custom_viewexample e64abd0 - Subscribe to occupancy grids in ROS node example b4a46c5
📚 Docs
- Clearer behavior for
CoordinateFrame("")5bf9c4a - Move "Installing Rerun" into Getting Started 0296f67
- Reduce python docs footguns 4e158e1
- Split "Set up a project" out of Log and Ingest d0d63bc
🖼 UI improvements
- New tooltip redesign b1a9d82
- Reduce the size of chevrons in the UI 3f63fa1
- Highlight invalid frame ID input and show
tf#/suggestions if applicable 2dbe13a - Status visualizer configuration bb83ed7
- Update our icon ✨ 0677bbf
- change colors for new brand colors 27c9036
🕸️ Web
- Add progress bar to rerun-js and handle incomplete wasm downloads ad551bd
- Add rerun-js login setting and default to hiding the login button 0d14814
- web_viewer: support overriding theme via ?theme= URL param 34b9958
🎨 Renderer improvements
- GPU accelerated time series plot drawing 8e9635b
🧢 MCAP
- Add
Selector::pipefor calling anonymous functions ea50667 - Support Foxglove
LocationFix&LocationFixes28fe84e - Split
Runtimeout ofSelector0febb36 - Transition Lenses to be
Selector<DynExpr>-based 75e965a - Lenses should not drop unrelated columns 849efb4
- MCAP: Add lens for ROS 2
nav_msgs/OccupancyGridc87a9ae - Write MCAP metadata to
__mcap_metadatainstead of__properties3352bb6 - Write MCAP stats & info to
__mcap_propertiesinstead of__properties31159e1 - Decode MCAP attachment records into
__mcap_attachments004539a
📈 Analytics
- More SDK analytics fc6c8c7
🧑💻 Dev-experience
- Add
rerun.tracing_session()for support correlation ec9f048
📦 Dependencies
- Update datafusion to 52.5.0 2832f82
- Unpin wasm-bindgen #12737 (thanks @anassinator!)