Video as code, for the live web
Prompt a film
of your live product.
Tell your AI agent what the film should say. playreel gives it a camera that is exact to the frame, and the vocabulary of human gestures — scroll, swipe, hover, type, tap — played on your real, live site. What comes back is a script: change anything with a sentence, and every render is identical.
Made by playreel, about playreel — the film is code, so it re-renders itself.
The problem
Every demo video starts dying
the day it’s made.
Your product ships weekly; the film of it doesn’t. A screen recording can’t be edited — only redone, by hand, every release. And handing the mouse to raw automation looks like exactly that. playreel’s answer is a script instead of a recording — the agent brings the reasoning, playreel brings the hands and the camera:
A live site
No mock-ups, no rebuilt clone. The camera points at your real product, wherever it runs — including pages only you can reach.
Frame-exact
A virtual clock advances the page one frame at a time. The same script gives the same film, every time, on any machine — which is why edits stay surgical and re-renders never surprise you.
Human gestures
Films made from raw automation look like automation. The vocabulary moves like a person: momentum, hesitation, a visible cursor, typing with cadence.
The solution
Brief. Build. Direct.
-
Brief it
“A 45-second promo of my site, warm, for my LinkedIn feed.” As short or as detailed as you like — the brief is the only thing you have to write.
-
playreel makes it
Your agent researches the product, writes the storyboard, and renders the film — with a score composed for its exact length and frame-by-frame verification, if you want them.
-
You direct
Watch it, then say what should change — “hold the hero longer”, “open on the problem”. Because the film is a script, the change is surgical: everything else stays exactly as it was.
The vocabulary
Gestures, camera and post —
the playreel vocabulary, for the agent to use.
Tap a word to see it as the agent writes it.
scrollmomentum on a real decay curve, never a jump
decayScroll(2400, { flicks: 1 })swiperelease velocity handed to the page’s own physics
swipeActs(from, dx, v) // inertiahoverthe page’s genuine :hover — it really reacts
hoverTour(t, pts, ['Pricing', 'Docs'])tapa visible cursor glides, presses, and the press lands
tap(page, t, at('#signup'))typehuman cadence, deterministic to the frame
typeActs(text, { cps: 11, seed: 7 })zoompunch-in emphasis, keyed to timing marks
zoomTo({ z: 1.35, at: mark })device stageyour app inside drawn phones — two screens, one capture
deviceStage({ phones: [parent, kid] })media syncpage videos advance in lockstep with the film
t.cap(n) // <video> seeked per tickcardstitles typeset by the browser, in your product’s own fonts
cardScene(page, t, 'title.html')scoremusic composed for the film’s length, resolving on its last frame
mix({ video, cue, mode: 'end-align' })Templates
Every film starts from an archetype.
The agent auto-picks — from your prompt and its research.
The first storyboard decision is what role your site plays in the film:
Made with playreel
Real films, real sites.
Two ways in
Developers install locally.
Everyone else runs it in the cloud.
Advanced — local installyour CLI agent, e.g. Claude Code, plus npm and Node
A storyboard is a small JavaScript file. This one is a complete film:
import { record, assemble, decayScroll } from 'playreel';
const scenes = {
hero: async (page, t) => {
await page.goto('https://your-site.example');
await t.start(); // the clock is yours now
const ys = decayScroll(1400, { flicks: 1 });
await t.cap(ys.length, { act: (i) => ({ scrollY: ys[i] }) });
},
};
await record({ scenes, format: 'desktop' });
await assemble({ dir: 'out', timeline: [{ scene: 'hero' }] });
In practice you rarely write this yourself: point your coding agent at the package and the brief — the full vocabulary is documented where the agent will look, in the package README.
Everyone else — cloud sandboxyour LLM’s own sandbox, e.g. Claude Cowork — no terminal, no install
Once: in Claude’s settings, under Capabilities → Code execution, set Allow network egress to All domains — then start a new Cowork session (the setting takes effect when a session begins).
Then paste this:
Validated on Claude Cowork (desktop app, local mode) in August 2026. Sandboxes evolve — if a step fails, ask the agent for the exact error and to find the way around; that is what it is for.