Rerun 0.27 - Flexible transforms, Python server management, and improved time controls

Last week, we released Rerun 0.27. This release focuses on making Rerun more flexible for robotics and Physical AI workflows - from how you define spatial relationships to how you manage data infrastructure. Check out the full changelog for all the details.

Coordinate frames independent of entity hierarchy (⚠️ Experimental) coordinate-frames-independent-of-entity-hierarchy--experimental

Note: This feature is currently experimental and the API may change in future releases. There are known limitations around pinholes, instance poses, and implicit transforms on some primitives.

This release introduces experimental support for defining coordinate frames that work independently from your entity path structure. Previously, transform hierarchies were tied directly to the entity tree - if you wanted camera to be a child of robot_base, they needed to be nested in the entity path like /robot_base/camera.

With the new CoordinateFrame archetype, you can now define transform relationships based on semantic meaning rather than path structure. Log coordinate frames to establish the available frames, then use child_frame and parent_frame on Transform3D to reference them:

import rerun as rr

# Note: CoordinateFrame and parent_frame/child_frame are experimental APIs
# Define coordinate frames
rr.init("rerun_example_transform3d_hierarchy", spawn=True)

rr.set_time("time", sequence=0)
rr.log(
    "red_box",
    rr.Boxes3D(half_sizes=[0.5, 0.5, 0.5], colors=[255, 0, 0]),
    # Use Transform3D to place the box, so we actually change the underlying coordinate frame and not just the box's pose.
    rr.Transform3D(translation=[2.0, 0.0, 0.0]),
)
rr.log(
    "blue_box",
    rr.Boxes3D(half_sizes=[0.5, 0.5, 0.5], colors=[0, 0, 255]),
    # Use Transform3D to place the box, so we actually change the underlying coordinate frame and not just the box's pose.
    rr.Transform3D(translation=[-2.0, 0.0, 0.0]),
)
rr.log("point", rr.Points3D([0.0, 0.0, 0.0], radii=0.5))

# Change where the point is located by cycling through its coordinate frame.
for t, frame_id in enumerate(["tf#/red_box", "tf#/blue_box"]):
    rr.set_time("time", sequence=t + 1)  # leave it untouched at t==0.
    rr.log("point", rr.CoordinateFrame(frame_id))

Coordinate frame hierarchy independent of entity paths

This is particularly useful for multi-robot scenarios, sensor fusion setups, or any workflow where logical grouping (by subsystem, sensor type, or data pipeline) doesn't match your entity hierarchy.

Python API for Rerun server management python-api-for-rerun-server-management

You can now launch and manage the open source Rerun server directly from Python. This includes programmatic control for making changes on the server.

import rerun as rr

# Launch the server directly from Python
server = rr.server.Server(port=9876, datasets={"my_data": "path/to/data.rrd"})
client = server.client()

# Get a dataset
dataset = client.get_dataset(name="my_data")

You can spin up a server in a Jupyter notebook, log robotics data and analyze them - all without leaving Python.

Blueprint API improvements blueprint-api-improvements

The blueprint API adds new capabilities for programmatic control over the viewer.

3D camera control 3d-camera-control

You can now set the 3D camera position, orientation, and properties directly in blueprints. This is useful for creating reproducible demos, automated reports, or tutorials where you want to highlight specific viewpoints:

import rerun as rr
import rerun.blueprint as rrb

# Set up a specific camera viewpoint in your blueprint
blueprint = rrb.Blueprint(
    rrb.Spatial3DView(
        camera=rrb.Camera3D(
            eye=[10, 5, 8],
            look_at=[0, 0, 0],
            up=[0, 0, 1],
        )
    )
)

3D camera control in blueprint

Playback control playback-control

Control play state, loop mode, and loop selection programmatically. Set up recordings that auto-play, loop specific time ranges, or pause at critical moments:

import rerun.blueprint as rrb

blueprint = rrb.Blueprint(
    rrb.TimePanel(
        state="playing",
        loop_mode="loop_range",
        loop_selection=[start_time, end_time]
    )
)

This allows you to create guided tours that automatically loop through critical events, useful for demos, trade shows, or automated testing visualization.

TimeSeries time range control timeseries-time-range-control

Programmatically set the time range and zoom level of TimeSeries plots. Create pre-configured analysis views where different plots automatically focus on relevant time windows - one showing the full mission timeline, another zoomed to a critical event, another focused on startup behavior.

Note: This API may be deprecated in future releases as we continue to refine the blueprint system.

Time panel improvements time-panel-improvements

The time panel has several new improvements for temporal data navigation:

  • Editable timestamps - Click and type to jump to specific times
  • Shift-to-snap - Hold shift while scrubbing to snap to grid alignment
  • Intelligent rounding - Time values round appropriately based on your current zoom level
  • Dynamic precision - Sub-second precision adapts as you zoom from hours to microseconds
  • Redesigned loop region selection - Easier to define and modify time ranges

Before: Time scrubbing picked arbitrary precision regardless of zoom level:

Time scrubbing before - arbitrary precision

After: Intelligent rounding adapts to zoom level, picking whole multiples of 10s when zoomed out, then 0.5s, 5ms, 10μs as you zoom in:

Time scrubbing after - intelligent rounding

The new loop region selection UI makes it easier to define and modify time ranges:

Loop region selection UI

These changes improve working with high-frequency sensor data, debugging timing-sensitive issues, and comparing events across different time scales.

Additional highlights additional-highlights

Eye-camera tracking for any entity eyecamera-tracking-for-any-entity

The 3D view camera can now track and follow any entity in your scene, not just camera objects. This keeps moving objects centered during playback - useful for following a drone through a flight path, tracking a robot's end effector during manipulation, or keeping a detected object in view.

Activate tracking via Alt+double-click on an entity, or through the context menu.

Points3D instance poses points3d-instance-poses

Points3D now supports multiple instance poses, allowing you to transform individual points independently. This enables visualizing per-point orientations in point clouds - like surface normals, flow vectors, or detected object orientations.

Cyclic colormap cyclic-colormap

A new cyclic colormap (Twilight) is available for periodic data like angles, phases, or directional information where values wrap around (0° = 360°). The colormap smoothly transitions without visual discontinuities at the wrap-around point.

Twilight cyclic colormap

The colormap selection UI has also been improved with grouping by category:

Colormap selection UI with categories

Open source server features open-source-server-features

The OSS server now supports layers for organizing recordings, properties for metadata, and the ability to rename dataset entries.

In closing in-closing

Rerun 0.27 is now available on GitHub and PyPI. This release includes experimental flexible spatial primitives, production-ready Python APIs for server management, and improved time navigation controls.