The person brings a company's website (a URL) or product screenshots, and says who should present. You deliver a ~30 s 1920×1080 ad: the presenter full frame to camera with one headline, then the product's own screens, rebuilt as HTML layers, with a camera pushing into each one on the words while the presenter talks from a face bubble, ending on the logo and the site's headline.
How it differs from its siblings: workflow-sales-video-from-pitch-deck and
workflow-slide-deck-presenter put a presenter beside real slides, shown as they are, for
a walkthrough of 1–3 min. Here nothing is a slide: the product's UI is rebuilt so its
rows, pills and charts move, a camera pushes into it, and it is cut as a 30 s ad. The
talking-head mechanics (the still, chunking, sync checks, the layouts) are
guide-present-with-an-avatar's; this workflow names them and adds only what differs.
The brand goes in refs/brand.md and the facts in source/facts.md; record the brief,
picks and each round's notes where you keep the job's notes. Rounds and deliverables
follow the core skill.
Steps
-
Capture the site: the brand, every image and the logo at a size that holds up (
guide-capture-a-brand, route A), and the copy with the value props in homepage order (guide-pull-product-highlights, website route). Screenshots of the product you can rebuild are the images that matter most. Then propose avatar options (a real person from the site, the brand's mascot, a stock-style presenter); a real person followsguide-depict-real-people-and-places, and a spec with a real employee stays private to the client. Gate: the person picks the avatar and the screens that matter (usually 1–2). -
Script (
llm-write-an-ad-script, the presenter ad; the opener perllm-write-a-hook): ~30 s is about 72 words, the customer's pain → one line per value prop in the site's order → the site's own headline, as a beat table plus a voice brief. The accent comes from the person, never from the face. Gate: the script word for word, and the brief. -
Storyboard: the gate before any paid render (
hn4a-compositor-storyboard). Right after the script, while casting runs: ~10 frames of the whole ad from cheap parts in the cut's own shape, the site's screenshots under the planned camera, the presenter at the planned size, the bubble at its real size, each push drawn as a target. The worked job had none, and every layout note came after both talking heads and both rebuilds. Gate: ad or slides? background? how big are the presenter and the bubble? how many camera moves? Nothing that costs money starts until the person says the direction is right. -
Voice (
guide-cast-a-voice,guide-voice-a-script): the top 6 auditioned on two of the script's own lines (the person picked the listener's 4th-ranked); a real employee as the avatar gets a cast library voice. The take checked against the script (whisper-cli-transcribe-with-word-times, Check it) and its cues read (python-read-word-timings,cues) intoaudio/cues.md. Gate: the track, listened to whole. -
Presenter stills (
guide-present-with-an-avatar, Process step 1, and One take, two framings): from one reference, nano banana Pro edit and 2.1 edit, 2 prompts × 2 models, 2K, "no text other than the chest logo" when the wardrobe is branded (the logo as a second reference). All four worked-job stills grew a sportswear logo on the sleeve: patch it locally (nano-banana-remove-small-objectwithpython-crop-and-paste-back). Then both framings from one 2K image: the picked 3:4 still on a grey 16:9 canvas where the presenter stands (worked job: x 1100, y 90, 920 px tall), the whole background replaced with a new set whose left two-thirds are open, calm and a little darker for a big white title (3 seeds), and the bubble's 3:4 still cropped from that same image around the face (x 1488..2640, 1152×1536). Gate: both stills locked. -
Two talking heads of the same take (
guide-present-with-an-avatar, Process step 4:python-plan-lipsync-chunks,h3-max-lipsync-a-still,python-assemble-lipsync-chunks): the 16:9 still for the full-frame opening and the 3:4 crop for the bubble, H3 Max 768P, about $0.08/s at list each (a 16:9 still comes back 1344×768:hn4a-compositor-motion-graphics,references/presenter-moves.md). A banned finger count can still appear; harmless where that span is in the bubble. Gate: both assembled heads, unmuted, with their sync plots. -
Rebuild the screens, one subagent per screen in parallel, each with the brief in
hn4a-compositor-rebuild-product-screen(references/subagent-brief.mdthere): the contractPOI+build(group_id, cues) -> layers, the cue keys, believable data in the client's market sharing one "today", and the checks. Move every value prop's beat onto the 1–2 screens that matter, rather than one screen per prop; the screens are the subject, so they move (guide-show-a-product-on-screen). Gate: areview_approveper screen, all in the same turn: its test spec (ui/<screen>_test.json, played live) and its side-by-side still as the subject. -
The cut: one build script,
scripts/build_cut.py --version vN, writescut/cut_vN.json(hn4a-compositor,references/build-script.md); this ad's layer order and its picks arereferences/cut.md. Gate: the live spec (hn4a-compositor, Live spec, then render), stills at the cue times and the last version the person saw asprevious. -
Rounds. Each note fixed in the build script and only the changed span re-rendered (
--into); a re-voiced line means new cues and the affected chunks of both heads.deliverthe 1920×1080 30 fps master and a 960×540 copy.
Choices this workflow makes
- An ad, not slides. The presenter full-bleed behind the type, never in a rounded window beside a kicker, headline and subhead. One headline at most; never print what's being said. A face bubble is right for the UI beats.
- Camera: one push per spoken beat, then hold (
hn4a-compositor-fast-ad-camera). Use that leaf's approved timing and scale defaults for this presenter-over-UI recipe. - This recipe rebuilds the UI because the scripted rows, counts and charts change
(
guide-show-a-product-on-screen, editable-state route). A reveal can use screenshot layers; an inspection beat can hold. Never use a video model to animate UI lettering. - One take, two framings (
guide-present-with-an-avatar, Layouts): the bubble head gets 265 source px in a 320 px bubble against 199 from the 16:9 take. - A new set rather than an outpainted one, with the title side planned into the prompt.
- Overlays aren't UI. A value prop that isn't a screen feature (syncing with three ERP names) is ad type over a frosted, blurred screen, not a small card in a corner.
Dead ends
- Outpainting around the original still: the background's geometry extended into nonsense, and nano banana 2.1's take had a seam. Replace the whole background instead.
- Image-to-video on a UI screenshot: the text warps.
- The small site PNG logo full screen: 444 px wide, it looked poor on a 1080 end card. Find a bigger copy or ask for a vector.
- A slides-and-bullets layout: a windowed presenter beside eyebrow, headline and subhead read as a deck; the person asked for an ad.
- No storyboard: every layout note came after the paid renders.
Worked example
Acme Co., a CRM for field-service firms: a 30 s spec ad from its site. Two screens rebuilt (an Activities table from a 1377×969 screenshot; a pipeline dashboard from a 1199×550 one plus a chart from a second image). A company salesperson as the avatar, with a cast library voice. Script 72 words; take 28.3 s, 72/72 words by transcript. Talking heads: 3 chunks each (13.3 / 8.1 / 6.9 s) at 768P, about $4.50 for both at $0.08/s list; the 16:9 chunk 00 was flagged (lag −789 to +597 ms) and its VEED re-sync passed (−69 to +154 ms), about $0.90 more. Delivered: 1920×1080, 30 fps, H.264 + AAC, 20 MB, and a 960×540 copy of 3 MB; the v3 cut was approved as rev1.
| Round | Note (paraphrased) | Fix |
|---|---|---|
| v1 | Feels like slides and bullets; make it an ad | Presenter full frame behind the titles, then the shrink into the bubble |
| v1 | Bubble bigger | 220 → 320 px |
| v1, v2 | Camera too fast (9 moves in 15 s), then sleepy (2 moves) | ~3 pushes per screen at 1.35–1.6× (hn4a-compositor-fast-ad-camera) |
| v2 | Background doesn't make sense (outpainted) | A new set, whole background replaced |
| v2 | Drop the eyebrow and subhead; the presenter says them | One headline; the prop graphic bigger and central |
| v2, rev1 | Bubble out of sync; 15 px strips at the sides | The presenter keys in hn4a-compositor-motion-graphics (trim, cover scale); −10 ms in v3 |
| all | The animated screens land well | Kept |


