MATTER
One body of particles, no cuts. Every transition is a morph, and the cut lands on the beat because the beat is a function of t.
- Length
- 46.55 s
- Rate
- 60 fps
- Placements
- 16:9 · 9:16 from one render(t)
- Drawn with
- WebGPU compute, 2M particles
A
A function from
A function from time
A function from time to a
A function from time to a frame.
You draw with whatever you like. Shaderera asks one thing of the code: the same t always gives the same frame. Everything else in production follows from that.
async render(t, options) { const f = frameAt(t, audio, W / H) const color = matter.render(f, options.frame) drawType(typeCtx, W, H, t, { form: f.pops[0][1].form, particles: PARTICLES, frame: options.frame }) // Two layers, composited by the host: the matter, and the type over it. return [ { color, alpha: 'opaque', name: 'matter' }, { color: typeCanvas, name: 'type' }, ]},shaderera check✓ deterministic: 50 timestamps, two orders, inspect + pixelsshaderera still 21 --sheetout/stills/main-21.000.pngout/stills/main-sheet.pngshaderera render9402 frames in 88.6 s on 4 host(s), nvenchost: node v24.14.1 · nvidia blackwell D3D12
No timeline file, no project format: the film is source code. An agent can read every line, change one, and look at the frame it makes.
Three films, made the way a client project is made: an empty project, a brief, an agent and render(t).






One body of particles, no cuts. Every transition is a morph, and the cut lands on the beat because the beat is a function of t.






A brand film for the end of the world. Swiss type on paper, words that assemble from particles and leave as dust, every word set on the voice.






A frame-swap configurator rebuilt in code as a film, as real as the product: pictures, mats, moulding and shadow, one order after another.
// The scenes: one typographic set-piece per sung line, drawn by the kit in type.ts. Each scene shows// what its line says as a cold technical figure — a loss curve, an org chart, a status page, a spec// sheet, a memo — with the sung words set into it word by word, and the brand's small print beside// it. Scenes return what they ask of the GPU (ink.ts) and how they leave./** A slow push-in about a point, so nothing is ever still. */const drift = (f: F, k = 0.04, x = W / 2, y = H / 2) => { const s = 1 + k * (f.u / Math.max(0.5, f.dur)) move(f, x, y, s) move(f, -x, -y)}Describe the film in your own words. The agent writes render(t): every frame becomes code it can read, reason about and change.
YouA 15-second 9:16 teaser. The shoe turns once on a dark set, the line lands on the beat, the logo holds at the end.
AgentWritten. 900 frames, every one of them drawn by code you can open.
No scene format.
No timeline file.
No house style.
Code is the source of truth.
Bring any dependency: a font parser, a physics library, a model. Shaderera core measures everything and fails a film only on errors, or on what you declared in requirements.json.
shaderera deliver makes one job per variant × locale, renders and reviews each, and checks every file against its placement as ffprobe reads it.
The easiest way in: copy one prompt into your agent. It checks your machine, installs what is missing, starts a film project and gives the agent eyes.
Or by hand
“Make a 15-second 9:16 teaser for our running shoe: the shoe turns once on a dark set, the line Built for the last mile lands on the beat, and the logo holds for the last 2 seconds. Run check, show me a contact sheet, then render.”