A film.
Ship the world that makes it, not the pixels.
A film generated from a world travels as the world that makes it, a camera track and a frame
schedule, together with the assets it references. Every conforming sink re-derives the same
per-frame state and camera identity; the pixels are the sink's own render. A
wai.film.linear carries an embedded wai.world.replay, a
keyframed camera track and a frame schedule. Your browser runs the reference
implementation's world engine, compiled to WebAssembly, reads the moving world at each frame
tick, projects it through the interpolated camera, and re-derives every frame's identity
— BLAKE3(world state hash || camera pose): film-equivalence.
Scrub the frame slider: the camera moves along its rails and the world moves under it. The
readout shows the size of the selected film file.
The film is instructions
The wire carries the world that generates the imagery and the camera that frames it, not a rendered pixel stream. The render you see, projecting the world through the camera, is the sink's presentation, as it is for the worlds renderer.
Film-equivalence
It composes two guarantees: the embedded world's replay-equivalence (every sink
agrees on the state hash at every tick) and the wai.det.fixed64 camera track.
Each frame's identity is one BLAKE3 hash on every machine, with no tolerance parameter.
Scope
This applies to films generated from a world: animation, CGI, motion graphics.
Live-action capture is sampled content and travels as wai.video.*. This is a
way to carry the synthesizable part of film, not a video codec.
wai.film.linear capability is in the standard.
Each film is a complete WFLM file: a sealed kinematic world plus a camera track.
The points are the world's moving subjects; the grid is the ground plane, projected through the
same camera. The verified object is the per-frame hash, re-derived in this tab; the projection is
the sink's render.