Assemble an iMessage chat-reveal video ad from a thread JSON — one continuous Playwright recording of the conversation animating in (typing dots, composer typing, bubble pops, auto-scroll) crossfaded into a designed end card, with iMessage send/receive SFX and an optional ducked music bed. FREE assembly (Playwright + ffmpeg); the recipe supplies the per-brand thread + product + end-card config and gates the paid product-image/music calls to their own capabilities. Use for the imessage-chat format.
npx gooseworks install --all # then, in Claude Code, Cursor, or Codex: /gooseworks use the render-imessage-chat skill
The free renderer for the imessage-chat video ad format — a texting-thread reveal where a two-person conversation animates in on a phone (typing indicators, composer typing, bubble pops, smooth auto-scroll) and lands on a designed brand end card. Deterministic Playwright + ffmpeg assembly; no generative video of the UI, so bubble text and the wordmark stay pixel-crisp.
This capability is the generic assembler — the template recipe (DB) supplies the
per-brand thread, product image, and end_card config, and gates the paid
calls (product image → create-image-fal, music bed → create-music-elevenlabs) to
their own capabilities. It bundles the iMessage-mockup HTML generator + the
send/receive SFX so a chat render is self-contained and $0.
The calling recipe asks the user these before any paid step; this capability only renders
the config it is given. The Wonderbly values in config.example.json are a worked example,
never defaults.
thread.participants + the voice of thread.messages.thread.messages.thread.messages.theme (renderer falls back to dark if unset).stitch.sh --music (optional).End-card colours, wordmark, proof, trust trio and CTA are brand facts (brand kit, approved copy only). Missing end-card colours fall back to a neutral white/black card.
.attachment-meta).
The fix is baked into record-chat.js's injected style, theme-aware.spec
lines in config.example.json). The renderer honors the thread it's given.render-end-card.js + end-card.template.html), not a bare logo.cd scripts && npm install # once — installs Playwright for the recorders
node record-chat.js --config config.json --out-dir <work> # → master-chat.mp4 + .sfx.json
node render-end-card.js --config config.json --out-dir <work> # → scene-end-endcard.mp4
bash stitch.sh --chat <work>/master-chat.mp4 --end <work>/scene-end-endcard.mp4 \
--sfx <work>/master-chat.sfx.json --out <work>/master-final.mp4 \
[--music <work>/music-bed.mp3] [--also-1x1]record-chat.js — reads config.json (thread + theme + geometry +
optional background_image), derives a believable per-message timeline
(received bubbles pop after an optional …; sent bubbles are typed out in the
composer then popped + Delivered; attachments dwell so a rich link lands),
records it as one continuous MP4, and emits a deterministic SFX cue list.render-end-card.js — fills end-card.template.html from config.end_card
(wordmark/logo_svg, stars, proof text, trust trio, CTA, colors) → still MP4.stitch.sh — crossfades chat → end card, layers the send/receive SFX (from
the cue list), optionally ducks a music bed under it, and optionally derives a
1:1 variant. All FREE ffmpeg. A limiter keeps the mix below -1 dBTP, so
back-to-back or overlapping chimes never clip.The two real iMessage sounds ship twice: as mp3s in assets/sfx and as base64 text
in scripts/sfx-embedded.json. A catalog fetch delivers text files only, so a
fetched copy has no assets/ folder. stitch.sh handles that by itself, in this order:
--sfx-dir <dir> if passed (must hold imessage-send.mp3 + imessage-receive.mp3).assets/sfx, if both mp3s are real audio (not git-LFS pointers).scripts/sfx-embedded.json (sha256-checked) into a temp dir.If none is there it stops and names what it looked for. Never substitute
made-up pops — keep sfx-embedded.json byte for byte when saving fetched files:
write it with a program from the fetch output (e.g. a short Python loop over the
fetched files), never by re-typing it. A damaged copy stops the render with a
"re-fetch" message.
After changing an mp3, run python3 tests/test_stitch.py --write-embedded.
thread (kept short — split
long lines), the product image bound into the attachment, the end_card
(prefer a real logo_svg wordmark), theme (the user's choice; dark if unset), and an optional
background_image (a flat-lay behind the phone) + optional music bed.create-image-fal /
create-music-elevenlabs (paid, proxy-routed, billed to the Ads agent). Pass
the resulting files into the config / stitch.sh --music.create-image-fal and point background_image
at it.npx playwright install chromium) — gooseworks doctor checks both.thread.messages.thread.messages.theme (renderer falls back to dark if unset).stitch.sh --music (optional).Full video production sequence with script review, actual ingredient choices, controlled generation, editing, evidence-based quality review, polish, captions and delivery. A host binding supplies project storage, authentic approvals, provider access and billing.
Build a vox-pop street interview video ad. An interviewer with a handheld mic asks passers-by one question about the brand's product, they give blunt wrong guesses, one gives the real answer, and the cut lands on a branded end card. Generates the takes through the GooseWorks fal proxy (Seedance 2.0 with native voice), then grades, re-cuts, captions and gates them locally. Use for the street-interview format.
Write the words of a short-form video ad (voiceover, dialogue, chat bubbles, on-screen lines) the way performance creative teams do instead of from a blank page. Builds the script from the buyers' own words, the beat sheet of an ad that already works and three deliberately different angles, filters them with a rule check and a second non-Claude model, and takes the strongest into the review with the other two as one-line swaps. Use it in every video ad run before any paid step, and whenever the user asks to write, rewrite or improve a video ad script or says a script sounds generic or AI-written.
An iMessage video ad shows a text conversation on an iPhone screen. Here is how a single skill teaches Claude to build one, with sound and an end card.