DreamLake

View components

Every registered view: what you get if you bind it (a live render from a minimal .dreamrc) and every option it takes. The YAMLs are complete and standalone — copy any of them into the gallery playground and edit from there.

Three things apply to every view, so the tables below don't repeat them:

  • Sizing — every view takes width, height, aspectRatio (how they behave). Unsized, a view falls back to its own default height — lineChart 180, trajectory2d 260, recon3d and pointCloud 360 — and every other view takes its content's natural height (camera grids from their tiles, tables and bands from their rows). The camera views additionally take tileAspect to force one ratio on every tile; by default each tile uses its own media's ratio.
  • The shared cursor — every view whose x-axis is time (videos, frames, depth, charts, bands, the timeline) scrubs the episode's shared cursor on hover; hover any demo to move it. The 3D views leave the pointer to orbiting, so their demos pair a chart or timeline sibling as the time source.
  • Errors are named — bind a field a slot cannot read and the panel prints the mismatch and the fix; nothing renders on a guess.

videoStack

Camera videos as a tile grid, each tile at its video's own aspect ratio. overlays draws two different things, so each entry says which with as — here a COCO file as: keypoints becomes a hand skeleton and a WebVTT file as: segments becomes captions:

Resolving dataset…
optiontype / valuesdefaultmeaning
camerasfield names / globsrequiredthe camera fields (video or image); "*" takes every camera and skips everything else
overlays[{ field, as, on? }]—as: keypoints (skeleton) or as: segments (captions); on: pins an overlay to one camera when several are bound
columnsnumber3tile grid columns
tileAspectnumbereach video's ownforce one aspect ratio on every tile

frameStack

Per-frame image sequences (cameras stored one frame per file or chunk) — each tile fetches only the frame under the cursor, with background prefetch around it; scrub to step. JPEG-XL frames need Safari 17+ or Chrome's JXL flag:

Resolving dataset…
optiontype / valuesdefaultmeaning
camerasfield names / globsrequiredthe frames fields (image sequences)
overlays[{ field, as, on? }]—same as videoStack — a frames camera is a camera
columnsnumber3tile grid columns
tileAspectnumbereach frame's ownforce one aspect ratio on every tile

depthStack

Per-frame depth maps colorized on the fly; 0/invalid readings stay transparent. The corner chip shows the mapped range — metres when the format knows the depth scale:

Resolving dataset…
optiontype / valuesdefaultmeaning
camerasfield namesrequiredname the depth columns explicitly — a bare * would ask every tensor for a depth map
overlays[{ field, as, on? }]—a depth camera is a camera too
colormapturbo | grayturbothe color mapping
min / maxnumber (raw units)per-framepin the color range; by default each frame maps its own min/max over valid readings (>0)
columnsnumber3tile grid columns
tileAspectnumbereach frame's ownforce one aspect ratio on every tile (the frame letterboxes inside)

pointCloud

Per-frame 3D point clouds as an orbitable scene — per-point color when the data carries rgb, camera auto-fit from the first frame, playback follows the shared cursor:

Resolving dataset…
optiontype / valuesdefaultmeaning
cloudone field namerequiredthe [N,3] / [N,6] column — the author says it is a cloud, the name never does
upx | y | z | [x,y,z]zthe data's up axis (robot-lab clouds are z-up)

lineChart

Time series with a synced cursor — one series entry per trace, [feature, dim] drills into one dimension. Each chart draws a labelled axis frame: five y ticks in the series' own units, mm:ss x ticks, and a light grid, so a value and a moment are readable without hovering:

Resolving dataset…
optiontype / valuesdefaultmeaning
seriesfield names or { field, …style }requiredone entry per trace or per family; a [n] feature expands to one trace per named dim; * globs work in both halves of [feature, dim]
entry stylinglabel color dash width opacity linecap readout ghost—the full table — dash for command-vs-actual, ghost for reference traces
unitstringderivedy-axis unit, shown once as (°C) above the ticks. Derived from the traces' own value formatting when omitted; unit: '' suppresses it
title / captionstring—panel heading / footnote

A .dreamrc is data, so it cannot hand the chart a formatting function — the y ticks read in the raw stored units, and unit is how you say what those units are. formatTick is rejected by the validator rather than passed through, since a string arriving where the chart calls a function would fail at the first tick.

trajectory2d

Planar series as a top-down xy path — for 2-dim positions a spatial path reads far better than two line charts. Hover snaps the cursor to the nearest sample:

Resolving dataset…
optiontype / valuesdefaultmeaning
seriesfield names or { field, label?, color? }requiredone entry per path; x/y are the columns named x/y (case-insensitive) or the first two
invertYbooleantrueimage convention (top-left origin); false flips to math convention
window{ ahead?, behind? }full pathdraw only the seconds around the cursor (defaults 1 / 0 when given)

timeline

Labelled blocks on a ruler. Anything bound here is read as spans — a .vtt file, a string column, an int column with its label table — and nothing in an inventory says a column holds spans, so the binding says it with as: segments. A timeline with no tracks at all (or none that match) still renders the bare ruler whenever the episode's duration is known — the scrubbable time axis stands on its own:

Resolving dataset…
optiontype / valuesdefaultmeaning
tracksfield names or { field, as: segments }requiredone row of blocks per track; equal consecutive values merge into one span, an int column joins its label table

bandTrack

Discrete signals (gripper open/close, stage indices, success flags) as categorical color bands — one row per column, one rect per contiguous equal-value run, a value→color legend below:

Resolving dataset…
optiontype / valuesdefaultmeaning
seriesfield names or { field, label? }requiredsame addressing as lineChart; each resolved column is one band row
maxLevelsnumber12a column is "discrete" when its unique values fit; busier columns get a one-line "use lineChart" note
bandHeightnumber18per-band height in px

metaPanel

The episode header — name, duration, frame count, fps, the dataset's task strings:

Resolving dataset…
optiontype / valuesdefaultmeaning
notestring—a free-text line — provenance, caveats, what the dataset is
showTasksbooleantruefalse hides the task strings (single-task datasets repeat one sentence per episode)

fields

The episode's inventory as a table — every field's address plus the dtype, shape and names the container reported, nothing concluded from them. The exploration view: ship it first when you don't know what a dataset holds, read the listing, write the real bindings, then replace it:

Resolving dataset…
optiontype / valuesdefaultmeaning
titlestringFieldsthe table heading

recon3d

The animated 3D scene, bound through two slots: geometry is the static scene (a glTF whose node names are the join keys), tracks is the per-frame motion that moves it. All three track kinds are tensors of numbers, so every entry names its as. The motion trail is the future — the next second of each path, gone exactly when the clip ends:

Resolving dataset…
optiontype / valuesdefaultmeaning
geometryfield names[]the glTF/GLB/OBJ file(s); empty for point-set-only scenes (hands without meshes)
tracks[{ field, as }]requiredas: transform3d (pose → same-named node) · vertices3d (deforming mesh → same-named node) · pose3d (point sets); a grouped poses parquet binds one track per object: poses[ruler]
upx | y | z | [x,y,z][0, -1, 0]the data frame's up vector — the default is the OpenCV camera frame's (y points down there)
trail{ ahead?, behind? } | false{ ahead: 1, behind: 0 }motion-trail seconds around the playhead — pure future by default; behind opts into a dim past tail