Product explainer: voiceover, kinetic type and the real app
The person points at their product: its code repo, its website, or a folder of screenshots. You deliver a ~35 s marketing explainer (9:16 1080×1920 or 16:9 1920×1080, 30 fps): a narrator over big type in the brand's colours, the product's own screens in a phone frame, a light music bed, ending on the logo and where to get it. No presenter, no generated footage: everything on screen is type, shapes and the product's own images, so the only paid parts are the voice and the music.
How it differs from its siblings: recipe-product-ui-video puts a lip-synced presenter
in front of the product and rebuilds its UI as live layers under a pushing camera
(dollars, a day). recipe-slide-deck-presenter walks through real slides. Here the
screenshots are shown as they are, in a device frame, and the motion is all in the
type around them: the cheapest, fastest marketing piece hn4a makes.
Job notes (brief, approved script, sources, picks) go in the job's AGENTS.md; rounds
and deliverables follow the core skill.
Steps
- Mine the source for copy, facts and images. From a repo, look where marketing
lives: the brand or app config (name, tagline, description, "how it works" steps,
trust reasons, ratings, user counts), the homepage and landing-page templates, the
marketing images folder, and any screenshot tooling (a job that renders store
screenshots often leaves device-framed PNGs and an empty phone frame). From a
site, follow
recipe-product-ui-videostep 1. Copy every image intosource/(never edited), make a contact sheet with Pillow and look at all of it. Every number in the script (users, rating, review count) must come from the source; round down, never up. - Script and shape (
guide-make-a-script-from-source): one beat per line, in this order: the pain (the customer's mess, shown, not described), the brand and its own tagline, three steps in the product's own words (Create / Invite / Share), one feature worth paying for, social proof with the real number, the end card with platforms. ~85 words reads in 32–37 s. Write the narration with audio tags for the direction ([warm, conversational],[brightening],[upbeat]on the last line). Gate, as one question set: the script word for word, the aspect (9:16 for Reels, TikTok and store previews; 16:9 for the site and YouTube), and the job folder. - The first scene, the voices and the music, all at once. Start the auditions
and beds without waiting on them (
guide-cast-a-voice,elevenlabs-voice-search,elevenlabs-tts-v4,elevenlabs-generate-music): each shortlisted narrator on the whole script (it is short, and the read's length drives the layout), with the TTS variant that returns character timings, and two beds of the comp's length in contrasting styles (warm acoustic, light electronic), instrumental, "sits under a voiceover", ending on a clean button. While they run, build the pain scene alone in two or three looks on word times estimated from the script (hn4a-compositor-motion-graphics,references/first-scene-preview.md), with the build script of step 5 and the look as data in it, so the pick carries straight over. One still per look, one fix, no more. - One review page, as soon as the looks are built (core skill, review pages): the
looks as live
{"compose": ...}candidates, the narrators and the beds as audio candidates if they have landed (otherwise a second page for them when they do). Gate: a look, a voice, and a bed if they can pick one. This is the first thing the person sees move: minutes after the script, not after everything is made. - Build the whole layout in the picked look, cued to the picked take. One Python
build script takes
<alignment> <voice> <music> <out spec>and writes the whole spec, finding every cue by phrase in that take's words, so a different voice is one re-run. Pattern, scene list and the layout traps:references/build-spec.md. Render a still inside every scene, tile them into one sheet, look once and fix what's broken (clipped pills, bad line breaks, a scene sitting high). Transcribe the take withwhisper-cliand compare it with the script; no tag may be spoken aloud. If the music was left unpicked, build the spec once per bed on the picked voice. Gate: the whole spec live on a review page (one per bed if unpicked), the sheet as refs: the music and the final look. - Notes go into the build script and back to the live page; nothing renders until the person says yes.
- Render and deliver. Voice to −16 LUFS (
ffmpeg-normalize-loudness), the bed under it at about 0.16 volume with a fade into the end card, thenhn4a-compositor render. Check it, then deliver per the core skill (When it's done): the video in its folder, no review page.
Choices this recipe makes
- The real product, never a generated one. Screenshots go behind an empty phone frame from the source, at the screen inset you measure (scan out from the frame's centre for transparent or white pixels to get the screen box and corner radius). Swapping the screen image on each step keeps one phone on screen for all three steps.
- Cue from the take's own character timings, not a separate speech-to-text pass: the timings come free with the audition, and whisper is used only to check the words. Entrances land 0.12 s before their word.
- Show the pain as the customer's own mess (chat bubbles piling up, then blurring out on "buried") rather than a headline about it. The hook is the beat people remember; the person called this one "awesome".
- Type says the gist, not the narration. "A list for anything" over "Create a list for anything: the weekly shop, a camping trip…"; the examples pop in as pills on their own words.
- Vertical by default for marketing: the person chose 9:16 over the 16:9 offered.
Dead ends
- The whole layout built, checked and fixed before the person saw anything move: they waited through every audition and every self-check, then saw one look they hadn't chosen. Show the first scene in a few looks first.
- Pill and bubble widths guessed from character counts: a long chip clipped, short
ones stretched, one ran off the frame, and snugging them broke the line wrapping.
Let the browser size them (
references/build-spec.md). - Text centred by padding alone: the person saw the text sitting off-centre in the bubbles. Centre with flexbox in a fixed height, padding on the sides only.
- A music estimate without
duration: refused; seeelevenlabs-generate-music. - Picking music on its own: the person skipped the music pick on the first page, where it played without the picked voice; under the chosen read it was easy.
Worked example
Acme Co.'s household app, Acme Lists (shared shopping lists and errands), from its web
repo. 9:16 1080×1920, 30 fps. Script 8 lines, 86 words, approved as drafted. Sources: 6
app screenshots, the empty iPhone frame (3939×8022, screen inset x 201, y 177, 3537×7668,
corner ≈ 520 px), 5 product photos for the feature beat, logo and icon. Brand blue
#1F8BEA, Brand Sans 600–800. Spec: 8 scenes, 49 layers.
| Beat | Picture | Cue |
|---|---|---|
| Pain | 7 chat bubbles pop in, tilt, then blur to 35% on "buried"; red last word | 0 s |
| Brand | white wipe, icon spins in, name, tagline pill | "Acme Lists is" |
| Create / Invite / Share | one phone rises; screen swaps per step; numbered step titles; example pills; a "Household only" badge | "Create a list" |
| Feature | pink wipe, two product photos zoom and rise | "And when" |
| Proof | a photo slowly pushes in under a navy gradient, "2 million+", stars and rating | "Over two million" |
| End card | blue wipe, icon, name, tagline, platforms pill | the last "Acme Lists" |
Four narrator auditions of the whole script: 32.1–36.6 s on the same text, $0.06 each; Voice C picked (33.1 s, 86/86 words, no tags spoken), comp 34.5 s. Two 36 s beds, $0.10 each. About $0.44 in all; stills and renders are free.
| Round | Note (paraphrased) | Fix |
|---|---|---|
| self-check | A long example pill clipped, a bad line break, the brand scene too high | Wider box, explicit \n, moved down |
| self-check | Short pills too wide, one off the frame | Width from the text; later, sized by the browser |
| review 1 | Love the look; text not vertically centred in some bubbles | Flex-centred, fixed height |
| review 1 | Voice C; no music pick | Re-cued to C; one spec per bed as live candidates |


