Skip to main content
Demo · In the standard

Interactive worlds.
The sink makes every frame.

What arrived over the wire is not video. It is a wai.world.* payload: a tick-0 world plus Ed25519-signed operations. The HUD shows its size in bytes. The sink is a computer, so it re-derives every frame locally, in WebGPU, with the same Rust engine native sinks run. In the playground, this tab is a signed actor: click to shove the tower, open the page in a second tab and shove from both — the tabs converge on the identical BLAKE3 state hash because the math does, not because a server says so. The sealed replay vectors are the conformance corpus files in the standard; each ends by checking its state hash against the publisher's signed seal.

sim — tick 0 / 0 nodes 0 state hash — payload 0 B actors — sync — receipt — assets —

One engine, every sink

This is not a JavaScript port. The wai reference crate compiles to wasm32 with the codec chain off; the browser binds the identical simulation code that generated the conformance corpus. State is exact Q32.32 fixed-point — f32 exists only on the way to the GPU.

Replay-equivalence, observed

Conformance for interactive cargo is the temporal generalization of bit-exact decode: same world + same ops → the identical BLAKE3 state hash at every checkpoint, with no tolerance parameter. The vectors here are the corpus files, and each replay ends by checking its state hash against the hash a native build sealed into it, so the browser build and the native build agree byte for byte.

Stress is computed, not animated

In truss_fracture, two actors pull the same member in opposite directions at the same tick. Both impulses act — the SUM conflict rule feeds the solver — the member's strain exceeds its yield, and it snaps. Structural failure as a position-based-dynamics consequence, identical on every machine that ever replays it.

Presentation is the sink's choice. The same scene carries two content-addressed, hash-verified assets: gallery renders a wai.mesh.glb as a solid PBR cube; gallery (splats) decodes a real wai.splat.spz file (SPZ, an open-source Gaussian-splat format), gunzipped and unpacked in-tab (positions, scales, smallest-three quaternions) into sorted, alpha-blended anisotropic Gaussians. Neither rendering touches the state hash; a Gaussian splat is presentation bound to a node the sim moves, exactly where glTF sits.
Energy, with its class. A sealed session carries an exact, signed work_steps count and a separately carried energy figure. A native sink reads on-chip energy counters where the platform exposes them and labels the figure with its class as a signed label inside the world receipt; where no counter is available the receipt is sealed unmetered. This browser tab cannot read an energy counter, so it seals the session unmetered and shows the energy as not metered.
Who seals. Seal & download replay signs the session with a key this tab makes for that seal and never stores. The receipt names the key by a label, did:key:wai- followed by the first 16 hex digits of its public key, which names no web origin and is not an identity of this site: the seal shows the session is intact, not who made it.
Without WebGPU. A browser without WebGPU sees a notice in place of the world.
Read the sub-spec: extensions / interactive-worlds  ·  capabilities wai.world.scene / replay / live + asset media wai.mesh.glb  ·  the reference engine, the relay behind the playground and the conformance corpus are in the open-standards repo, Apache-2.0.