reel
Direct and shoot a short film of a live web page with livereel — story first, then a storyboard, then the film as steps, checked frame by frame
Install / Use
npx skills add vrppaul/livereel --skill reelInstalls into whichever agent you are using.
SKILL.md
Installable skill definition
Quality Score
Category
Development & EngineeringSupported Platforms
Tags
Our assessment of reel
reel scores 67/100 on our quality scale, 3873rd of 4,611 Development & Engineering skills we index.
Its SKILL.md is 15 KB long, split into 7 sections with 2 code examples: a thorough specification that gives an agent plenty to work with.
It has no GitHub stars yet, so there is no community track record; judge it on its content.
Maintenance, license and trust
- We could not determine when the repository was last updated.
- No license is declared. By default that means all rights are reserved: you can read it, but reusing or redistributing it is not clearly permitted. Ask the author before building on it commercially.
- Its trust signals score 68/100, with 3 cautions from licensing, adoption, age or documentation. These come from repository metadata, not a code audit — read the skill file before letting an agent act on it.
reel compared with similar skills
All 4 of these similar skills score higher than reel; compare them before choosing.
| Skill | Score | Stars | Updated | Format |
|---|---|---|---|---|
| reel (this skill)by vrppaul | 67 | 0 | — | SKILL.md |
| taste-skillby Leonxlnx | 100 | 103.6k | today | CLAUDE.md |
| ai-job-searchby ai-job-search-dev | 100 | 66.7k | today | CLAUDE.md |
| claude-howtoby luongnv89 | 100 | 45.6k | today | CLAUDE.md |
| algorithmic-artby anthropics | 100 | 177.9k | 35d ago | SKILL.md |
Frequently asked questions
- How do I install reel?
- Run
npx skills add vrppaul/livereel --skill reel. The install tabs above show the steps for each supported agent. - Which AI agents does reel work with?
- It is written for Cursor, as a SKILL.md file. Other agents that read the same format can often use it too.
- Is reel safe to use?
- It declares no license and scores 68/100 on trust signals. Skills are instructions an agent will follow, so read the file before installing it and do not approve commands you do not understand.
- Is reel still maintained?
- We could not determine when the repository was last updated.
Skill content
View source on GitHubname: reel description: Direct and shoot a short film of a live web page with livereel — story first, then a storyboard, then the film as steps, checked frame by frame. Use when the user asks for a promo, a demo or an explainer video of a web app or of a feature.
Make a film of a real web page: the page runs live, livereel moves a camera, a light, a cursor and captions over it, and shoots it frame by frame on a clock of the film's own. What the page does is real — clicks, typing, its server's answers — and a wait costs the film nothing.
Work in this order and show the user each stage before the next. A film built before its story is agreed gets rebuilt.
1. The story, in words
Answer these, in a few lines, and get the user's word on them:
- Who watches, and where: a README, a feed, a talk. It sets the length and the frame: 16:9 for a page or a talk, square for a feed, 9:16 for stories. A film shown in several places names a format for each.
- The problem the viewer knows from their own work, shown before any answer. A viewer who has not felt the problem does not care for the fix.
- The turn: the one moment the product answers it.
- What the viewer should be able to say after, in one sentence.
Let speed carry meaning: what is hard can rush past or tilt away; what the product makes clear stands face-on and still enough to read.
2. The storyboard
A table, one row a shot: seconds, what is on the screen, what moves, the caption. Speak in the director's words, which are the tool's:
| Word | In livereel |
|---|---|
| framing | camera.onto(selector, { air }) — what the frame holds |
| angle | camera.to(pose), camera.onto(…, { tilt, turn }) — the screen leans back or swings |
| camera move | a play({ seconds, moves, ease }) |
| light | light.on, light.to, light.off — one block lit, the rest dimmed |
| cast | what the page shows, opened and closed by act |
| action | what the page does for real: a click (cursor.click), keys typed into it (typing(page.type(strokes))), anything else in an act |
| caption | caption.show(text), caption.hide() |
| entrance | cut(screen.lower()), then screen.rise() in a play; ending.show(card) |
| tempo | how long each play and hold({ seconds }) lasts |
What reads as made with care:
- One motion at a time. The camera leads, settles, then holds long enough to read: about a second for every four words on the screen.
- The camera does the transitions: it travels from one block to the next rather than cutting.
- Captions of three to six words, addressed to the viewer as "you", and about what is lit at that moment, never about something else.
- Real UI the whole time, cropped close to the part that matters. A phone shows a whole page too small to read.
- People type unevenly:
keystrokes(text, { seed, slipAt })with a slip now and then; an agent works for a second or two before it answers.
What reads as generated: a zoom on every click, a window floating on a gradient wallpaper, a glow behind the product, springy overshoot, ripples on clicks. Leave them out.
3. The film
livereel is installed in the project the film lives in, and needs Node 22.20
or later and ffmpeg on the path. If node is missing, tell the user to
install Node and stop; do not install it yourself. Otherwise:
npm i -D livereel # or pnpm add -D livereel
npx livereel setup # the browser films are shot in; it says if ffmpeg is missing
If ffmpeg is missing, tell the user to install it and stop. If the browser
will not start for a system library it lacks, on Linux, tell the user that
npx playwright-core install-deps chromium installs them. A film is an ES
module: the project's package.json says "type": "module", or the film's
file is named .mts.
Shoot a film with --renderer gpu: its frames are drawn on the graphics
card, and it needs no screen. On Linux, where it was tried, a full shoot
took about half as long as in software (the promo, blurred: 271 s against
495 s); on macOS and Windows it is not tried yet. Where it reaches no
graphics card, it draws the frames in software all the same and warns
"--renderer gpu reached no graphics card"; a page that draws with WebGL may
then draw nothing. Where it warns and a canvas on the contact sheet is
empty, shoot the film again without the flag.
A film is a TypeScript file whose default export is defineFilm({ formats, serve, ready, steps }) from livereel: its formats by name, each a frame
and the screen its page is laid out on ({ square: { frame, screen } }),
how the page is served (atAddress(url) for a page someone else serves, or
a server the film starts and stops), when the page is ready, and its steps.
steps(served, whole, formatName) is handed the whole screen's pose and
the name of the format it is shot in. Read
node_modules/livereel/examples/example-com.ts first: it is a whole film.
node_modules/livereel/examples/livereel-promo.ts serves an app of its own
and clicks it for real; its server is
node_modules/livereel/examples/livereel-promo/server.ts.
- Split the steps into acts, a function each; name every selector at the top, by test id or role where the page has them.
- Write a step's timing, framing and rhythm as numbers in place, each the
value of its keyword (
seconds,start,end,air,zoomAtMost,every,tilt,turn,dim,thinkingShare,seed,slipAt,pace,pixels,top); any other number is a constant at the top. - Two moves of one part — a prop, or the page — share a step only one after
the other:
playandcutrefuse them at once. - Frame by selector, so one script fits every format. A pose given in
numbers is given once per format, in a record of the film's format names
(
Record<keyof typeof FORMATS, Pose>), picked by theformatNamethatstepsis handed: the type checker refuses a format left out. livereel runs a film with its types stripped, and refuses a value of the wrong kind where it stands, as the film is defined and its steps as it is served; the type checker finds more, so check the types in the editor or with the project's type checker before shooting. - Prefer the page's own states to anything drawn over it: open a panel with its own button, not by hiding parts of the page.
- An app whose page refuses frames, which livereel refuses naming the
refusal ("refuses to be framed (X-Frame-Options: DENY)"): write
stage: 'inside'indefineFilm, where livereel takes the refusal off. - An app that signs in: write
stage: 'inside'indefineFilm, and sign in inreadyor in an act, as a person does, with an account the user gives for the film. The stage then stands on the app's own address. Read what each stage costs innode_modules/livereel/README.md, "Where the stage stands", and tell the user before shooting.
Sound
A film is heard as well as seen: a click as the cursor presses, a key for
every stroke typed, a soft chime as the ending comes up, each on its own
frame. These are livereel's own, quiet and CC0, the keys recorded on real
keyboards. defineFilm takes, beside the rest:
sounds: { keyboard }, the keyboard the keys are heard on:membranewhere none is named,mechanical,mechanical-bright,butterfly,laptoporclicky;sounds: { click, key, ending }, any of them: a file of the film's own in its place, a path from the film's file, any kind ffmpeg reads, or{ enabled: false }to turn it off, assounds: { key: { enabled: false } }. The click and the ending may stand beside a keyboard; a key given so takes the keyboard's place, and is never named beside it;sounds: { enabled: false }for none of livereel's;music: { file, volume }, a track under the whole film,volume1 as loud as the file, cut to the film's length and faded out at its end.
How to use them:
- Sounds are few and quiet: a click, the keys, the ending. Never a whoosh on a camera move or a sound on every caption: that reads as generated.
- Leave the keyboard as livereel sets it unless the user asks for another,
and pick it by what the user says:
membraneis an office keyboard (Cherry KC 1000),mechanicala mechanical one (WhiteFox), andmechanical-brighta brighter, sharper one;butterflyis a MacBook Pro's of 2018,laptopanother laptop's,clickya loud click with its release. - Music only where the user asks for it, and quiet under the clicks
(
volumeabout 0.3). sound.play(file)in aplayor acutis a sound of the film's own at a moment, the start of its share; keep it for what the page itself would make sound.
What a film is written with
Every move that runs over time takes its timing as its last argument:
within: { start, end }, the share of its step it runs over (0 to 1, the
whole step if left out), and ease, its own curve where it does not take
its step's.
cursor.hide(), screen.lower() and terminal.submit() are made at once
and take none: write them in a cut. Any other move in a cut is set at
its end at once.
| Steps | |
|---|---|
| play({ seconds, moves, ease }) | so many seconds of frames, each move eased over its share |
| hold({ seconds }) | so many seconds with nothing moving |
| cut(...moves) | moves made at once, between two frames |
| act(action) | action(context) acts on the page for real: context.page is Playwright's Frame, context.motion.release() and .still() let the page's own animations run and still them again |
| typing(move) | as long as the keys of terminal.type or page.type take, and a beat after |
| Moves | |
|---|---|
| camera.to(pose, { tilt, turn }) | to a pose: whole from steps, or lookingAt(pose, focusX, focusY, zoom) |
| camera.onto(selector, { every, air, zoomAtMost, tilt, turn }) | frames the first every blocks a selector matches, air pixels round them |
| screen.rise(), screen.lower() | the screen up out of the ground; down in it, in a cut |
| light.on(selector, { dim }), light.to(selector), light.off() | one block lit, the rest dimmed by dim; carried; put out |
| cursor.to(selector, { entering, bow }) | along an arc to a block, from entering if not yet on the screen |
| cursor.press({ sound }), cursor.release(), cursor.hide() | pressed in with a click (sound, a file of the film's in its place), let go, taken off the screen |
| cursor.click(action, { sound }) | pressed with its click, act(action), let go: the steps of a click |
| caption.show(text), caption.hide() | words coming up one after another, in place of any shown; going |
| terminal.open(title) | an agent's terminal coming up over the frame; in a cut, there at once |
| terminal.type(strokes), terminal.submit() | keys typed into it; Enter |
| terminal.works(lines, thinking, { thinkingShare }) | the agent thinking, its spinner beside the words thinking, then its lines written one after another; a line is { kind, text }, its kind work (a tool and what it is used on), said or done |
| terminal.leave() | the terminal giving way |
| ending.show(card) | the last card: { name, line, command } |
| page.scrollBy(selector, { pixels }) | a block's own scroll moved so many pixels |
| page.scrollTo(selector, { top }) | the page scrolled until a block stands top pixels below the top of what scrolls it |
| page.type(strokes) | real keys typed into whatever holds the page's keyboard |
| sound.play(file) | a file of the film's heard as its share begins; it moves nothing, so it shares a step with anything |
cursor.click and typing give several steps: spread them among the
others, ...cursor.click(action), ...typing(page.type(strokes)).
The rest: keystrokes(text, { seed, slipAt, pace }) makes the strokes a
person types; the curves are linear, easeInOutSine (a step's own),
easeInOutCubic, easeOutCubic and `ease
Truncated for display — read the full file on GitHub.
Related Skills
taste-skill
103.6kAgent skills that give coding agents taste: art direction, reference images and a browser check instead of generic AI pages
ai-job-search
66.7kThe job search that runs on your machine. AI job application framework built on Claude Code: evaluate postings, tailor CVs, write cover letters, prep interviews. Fork it and own it.
claude-howto
45.6kA visual, example-driven guide to Claude Code — from basic concepts to advanced agents, with copy-paste templates that bring immediate value.
algorithmic-art
177.9kCreating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems.
Trust signals
From repository metadata: license, adoption, age and documentation. Not a code audit — see the Safety scan above for what the skill file itself contains.
