$ npm i -g filmless
Record a real session in your web app once. filmless captures the DOM, not pixels — so you can retime the boring parts, zoom the camera on clicks, and re-render a crisp README GIF from the same take, forever.
It's the recorded DOM session replaying live in your browser — the same data the GIF is rendered from. Drag the sliders: you're editing the reel in real time.
Every knob here is a number in reel.json. Change it,
re-render, get the exact same take with new direction.
One JSON file is the whole edit: what to speed up, where the camera looks.
reel.json declares retiming and camera
keyframes. filmless suggest drafts it for you from your
clicks and idle gaps.
{
"session": "session.json",
"retime": [
{ "from": 4200, "to": 9800, "speed": 4 },
{ "from": 12000, "to": 15000, "cut": true }
],
"camera": [
[0, 960, 540, 1.0 ],
[1200, 960, 540, 1.0 ], // hold wide
[1700, 640, 380, 1.5 ], // zoom to the click
[3500, 640, 380, 1.5 ] // hold
],
"cursor": { "smooth": 120, "clickRipples": true }
} | reproducible | editable after the take | works on | |
|---|---|---|---|
| vhs | yes — scripted | yes — it's a script | terminal apps |
| screen recorders | no — re-shoot every change | video editing only | anything |
| Screen Studio | no — still a pixel recording | zoom/cursor, in-app | macOS |
| filmless | yes — DOM replay, deterministic | yes — JSON, versionable | web apps |
filmless replays the DOM, so anything that never enters the DOM never renders:
<video> pixel content — playback events replay, the pixels don't--canvas at record time and costs session size