Helpin's launch films, product videos and social stills, written as web pages. Each video is one HTML page where every frame is a pure function of time, so the live preview and the rendered MP4 always match and every render is byte-identical. There's no video editor in the loop: a change is a code edit and a re-render.
- Picture: Playwright seeks the page frame by frame, and ffmpeg (bundled) encodes the frames, up to a 4K master.
- Product UI: real, animated helpin.ai previews run inside the video on a virtual clock (
lib/site.js). - Sound: ElevenLabs makes the music, sound effects and voiceover. Every clip is cached, and the mix lands at −14 LUFS.
- Footage and people: Higgsfield generates live-action plates and lip-synced talking heads, each priced before it's paid for and logged in a ledger.
Agents: start with AGENTS.md, then the skills in .agents/skills/.
export PATH=$HOME/.nvm/versions/node/v24.21.0/bin:$PATH # Node 20+ (nvm isn't on the default PATH here)
npm install
cp .env.example .env # ELEVENLABS_API_KEY for sound; HIGGSFIELD_API_KEY (id:secret) for footage
npm run new -- my-video # copy videos/_template to videos/my-video
npm run preview -- my-video # http://127.0.0.1:8090/videos/my-video/
npm run sheet -- my-video # 12-frame contact sheet to review
npm run render -- my-video # out/my-video/my-video.mp4
npm run audio -- videos/my-video/audio.json # soundtrack, mixed and muxed onto the render| Command | What it does |
|---|---|
npm run new -- <name> |
Scaffolds a video from videos/_template. |
npm run preview -- <name> |
Live preview. Space plays or pauses, ←/→ steps a frame, Shift+←/→ a second, 1–9 jump to a scene, #12.5 opens at 12.5 s. |
npm run render -- <name> |
Renders the MP4. Options: --stills 2,7.5, --sheet 12, --from 19 --to 26, --size 1080x1920, --scale 2 (4K) or 0.5 (draft), --audio file, --workers, --fps, --crf, --out. |
npm run audio -- <audio.json> |
Music beds, sound effects and voice, mixed to −14 LUFS and muxed. --video, --out, --prefetch (generate clips only), --no-music, --no-voice, --regen. Prints an energy strip, since nobody can listen from a terminal. |
npm run inspect -- <file.mp4> |
Contact sheets of any MP4: --times 5,9, --frames 935-940, --every 0.9, --crop x,y,w,h, --boost. |
npm run splice -- --base a.mp4 --at N --insert b.mp4 --out c.mp4 |
Replaces part of a finished MP4 on exact frames, e.g. a new ending. |
node --env-file=.env bin/vo.mjs <script.json> |
Voiceover with word timings. Writes vo.json, which the page and the mix both read, so the picture follows the voice. |
node bin/beats.mjs <bed.mp3> --bpm 120 [--json out.json] |
Tempo, first beat and per-beat energy of a music bed, for cutting the picture to the music. |
node --env-file=.env bin/genvideo.mjs <plates.json> [--dry] |
Generated footage (Seedance) as frame sequences. --dry prices the run first. |
node --env-file=.env bin/cast.mjs <cast.json> [--dry] |
A talking-head cast: portrait, line, lip-synced clip and voice, plus word timings for captions. |
node bin/deliver.mjs <4k-master.mp4> [--card 48.5] |
Delivery set: 4K and 1080p MP4, 1440p WebM, poster and card stills. |
- Storyboard. Brief, story, copy and a claims check in
videos/<name>/STORYBOARD.md. The storyboard doc in Helpin is the source of truth when there is one. Every product claim needs a source. - Music, voice and people first when they lead:
- Generate two or three music candidates with
audio.mjs --prefetch, measure them withbin/beats.mjs, and name the chosen take's beats intimeline.js. - Narration comes from
bin/vo.mjs, each line pinned to a beat. - People talking to camera come from
bin/cast.mjs.
- Generate two or three music candidates with
- Build the page: one
<section class="scene">per storyboard row, with timing from the shared beat grid or the voice's word timings. Reuselib/(see below) and the live helpin.ai previews for product UI. - Review without watching: contact sheets, stills either side of every cut, speech-to-text on the final mix, and the loudness report.
- Sound:
cues.mjswritesaudio.jsonfrom the same names the page uses, so every effect lands on its picture event. - Deliver:
npm run render -- <name> --scale 2 --crf 14 --out out/<name>/<name>-4k.mp4 npm run audio -- videos/<name>/audio.json --video out/<name>/<name>-4k.mp4 --out out/<name>/helpin-<name>-4k-master.mp4 node bin/deliver.mjs out/<name>/helpin-<name>-4k-master.mp4
Stills (video thumbnails, profile banners) are pages too: render them with --stills 0.5 --scale 2.
AGENTS.md rules, commands and brand for agents working here
.agents/skills/ helpin-video, video-sound, video-edit (linked from .claude/skills/)
lib/
runtime.js defineVideo(): the scene clock, preview transport, the renderer's hooks
motion.js pure timing: P, L, keys, envelope, stagger, typed, rand, eases
components.js helpinSymbol, kineticLines, lineBundles, terminal, rise/leave, counter, cursor, …
kit.js use-case helpers: word rises, pop, push, bigScreen, the shared end card
film.js narrated films: voice-timed anchors, cameras, paths, generated-footage frames
site.js, site-clock.js live helpin.ai previews inside a video, frame-exact
brand.css Helpin tokens, fonts (Instrument Sans, JetBrains Mono) and base styles
bin/ render, preview, audio, inspect, splice, new-video, server, vo, beats, genvideo, cast, deliver
assets/ Helpin symbol, palette, avatars, agent icons, product screenshots, product logos
videos/<name>/ one video per folder: index.html, STORYBOARD.md, timeline.js, cues.mjs, audio.json, …
reference/ third-party reference videos and analysis frames (gitignored)
out/ renders, stills, caches and ledgers (gitignored)
| Skill | Use it for |
|---|---|
| helpin-video | A new video or changes to one: concept, storyboard, scenes, review, render, stills. |
| video-sound | Music, sound effects, voiceover, talking-head audio, levels. |
| video-edit | Changing a finished MP4 whose source we don't have. |
References in .agents/skills/helpin-video/references/:
taste.md: what the user has approved and rejected. Read it before proposing anything.scene-recipes.md: the API, patterns and live-preview selectors.motion-ideas.md: motion techniques from studied references.competitors.md: how competitors and other companies' logos may appear.
- Frames are pure functions of time. No CSS transitions, timers,
Date.now()orMath.random()in scene code. - Look before you claim. Nobody here can watch the output. Check stills, sheets, transcripts and levels, and say what couldn't be checked.
- Claims have sources: the Helpin README, helpin.ai or the committed roadmap, recorded in each
STORYBOARD.md. - Competitors:
- In a comparison video, the competitor is named in text with the compare page's monogram chip, and its facts come
from the website's
compare-data.tswith its checked date. Never its logo, colours or UI. - Real logos appear only in tool-sprawl moments.
- In a comparison video, the competitor is named in text with the compare page's monogram chip, and its facts come
from the website's
- Every video gets its own concept and its own music. Consistency comes from the brand, not a template.
- Credits cost money. ElevenLabs and Higgsfield calls are cached by request; price footage with
--dryfirst. - Nothing is published without the user's say-so. No GitHub repo URL on screen until the repo is public.
- Never print
.envvalues. Check key names withcut -d= -f1 .env.
Launch films
launch: the open-source launch reel. The final picture is the original cut pluslaunch-ending, spliced at frame 937.launch-film: "The story", a narrated film with one camera move through the product and footage of the people in it.launch-everywhere: "Everywhere", a narrated launch film where one emerald thread runs through the agents and the team's other products.launch-voices: "Launch voices", in YC launch style. Four people say the problem to camera (a lip-synced cast), and a narrator answers each of them with a live helpin.ai demo.one-prompt: "One prompt", an agent-native pitch led by music. Headlines stream behind an emerald caret, followed by real Helpin MCP tool calls.film-one-day: "One day", a narrated workday that follows the sky.film-crew: "The crew", the agents introduced one by one, each in its own colour.
Product Hunt
ph-launch: a music-first motion reel, where an emerald dot lands every word on the beat.ph-story: "The story block", a narrated film at CircleCI-level density, ending on the tool logos converging into Helpin.
Comparison videos (for helpin.ai/compare)
cmp-zendesk: "Solved. Still broken."cmp-intercom: "The meter"cmp-help-scout: "Past Send"cmp-chatwoot: "Open all the way"cmp-linear: "The customer attached"cmp-jira: "Out of the backlog"cmp-plane: "Every request lands"
Use-case videos
bug-to-fix-energy: "Ticket limbo", the approved benchmark for energy and craft.bug-to-fix,bug-to-fix-thread: earlier cuts of the same story.support-say-it-once(Echo),docs-caught-up,docs-rotanddocs-board(Quill),crm-up-to-speed,meeting-someone-owns-it,agents-keep-the-keys,mcp-ask-where-you-work,selfhost-your-server.
Stills
launch-thumbnailandph-story-thumb: video thumbnails.x-headerandlinkedin-banner: profile banners.
Tools
_template: the starter page.example: a tour of every component.concepts: style frames for concept options.site-probeandprobe-docs: probes for timing website previews.
Renders stay on this server. Download one with
scp azhar@144.76.106.220:~/projects/helpin/helpin-video-framework/out/<name>/<file>.mp4 .or tunnel the preview with ssh -L 8090:localhost:8090 azhar@144.76.106.220 and open
http://127.0.0.1:8090/videos//.