The headline change in 0.29 is small to describe and large in practice: you can send a blueprint to a viewer that is already open. Previously a layout was fixed at startup, which meant every change to how you wanted to look at a recording cost you a restart, and a restart cost you your place on the timeline.
That turns out to matter more than we expected, because it makes the viewer scriptable. A notebook cell can now rearrange panels between steps.
import dalaran as dl
import dalaran.blueprint as dlb
# Attach to the viewer that is already running
dl.connect("127.0.0.1:9876")
# ...and rearrange it mid-session
dl.send_blueprint(dlb.Blueprint(
dlb.Horizontal(
dlb.Spatial3DView(origin="world"),
dlb.TimeSeriesView(origin="metrics"),
column_shares=[2, 1],
)
))
Chunk scheduling
The other half of the release is less visible. Recordings served from Hub used to arrive in whatever order the transport delivered them, which was fine for playback from the start and poor for scrubbing: jumping to 8 minutes into a 40-minute run meant waiting on chunks you did not need.
The scheduler now orders requests by what the current view actually queries. Scrub to a timestamp and the chunks covering that timestamp, for the entities in visible panels, are fetched first. Everything else backfills behind it.
Cold open on a multi-gigabyte recording dropped by roughly 70% in our measurements. The number depends heavily on how many entities your blueprint has on screen — a single 3D view improves far more than a twelve-panel grid, because there is more to deprioritise.
Smaller things
dalaran ls --sizesranks entities by bytes on disk, which is the fastest way to find the one stream bloating a recording.- Static components logged twice now warn instead of silently overwriting. This was our most common support question.
- The Python SDK no longer holds the GIL during serialisation of large arrays.
Upgrading
No format change, so recordings written by 0.28 open unchanged. The blueprint API gained
send_blueprint but kept default_blueprint, so existing scripts run as-is.