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

Written by the Rerun Team 9 months ago

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](https://github.com/rerun-io/rerun/releases/tag/0.27.0) for all the details.

## 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](/content/docs/reference/types/archetypes/pinhole/index.html), instance poses, and implicit transforms on some primitives.

This release introduces experimental support for defining coordinate frames that work independently from your [entity path](/content/docs/concepts/entity-path/index.html) structure. Previously, [transform hierarchies](/content/docs/concepts/spaces-and-transforms/index.html) 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](/content/docs/reference/types/archetypes/coordinate_frame/index.html), 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`](/content/docs/reference/types/archetypes/transform3d/index.html) 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))
```

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

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](/content/docs/howto/integrations/embed-notebooks/index.html), log robotics data and analyze them - all without leaving Python.

## Blueprint API improvements

The [blueprint API](/content/docs/concepts/blueprints/index.html) adds new capabilities for programmatic control over the [viewer](/content/docs/reference/viewer/overview/index.html).

### 3D camera control

You can now set the [3D camera](/content/docs/reference/types/views/spatial3d_view/index.html) 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],
        )
    )
)
```

### Playback control

Control play state, loop mode, and loop selection programmatically. Set up [recordings](/content/docs/concepts/apps-and-recordings/index.html) 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

Programmatically set the time range and zoom level of [TimeSeries plots](/content/docs/reference/types/views/time_series_view/index.html). 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

The [time panel](/content/docs/reference/viewer/timeline/index.html) has several new improvements for temporal data navigation:

- **Editable timestamps** 
- **Shift-to-snap** 
- **Intelligent rounding** 
- **Dynamic precision** 
- **Redesigned loop region selection**

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

**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:

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

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

## Additional highlights

### Eye-camera tracking for any entity

The [3D view](/content/docs/reference/types/views/spatial3d_view/index.html) camera can now track and follow any [entity](/content/docs/concepts/entity-path/index.html) 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`](/content/docs/reference/types/archetypes/points3d/index.html) 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

A new cyclic [colormap](/content/docs/reference/types/components/colormap/index.html) (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.

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

### 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

Rerun 0.27 is now available on [GitHub](https://github.com/rerun-io/rerun/releases/tag/0.27.0) and [PyPI](https://pypi.org/project/rerun-sdk/0.27.0/). This release includes experimental flexible spatial primitives, production-ready Python APIs for server management, and improved time navigation controls.
