| name | goose-vs-tool-comparison-video |
| description | Produce a premium, viral 9:16 "Goose vs [tool]" head-to-head for the @goose.ai.tools account, in the agency / done-for-you angle. A warm cream editorial canvas (Fraunces type, film grain, depth) with a BIG floating circular "Loom-bubble" of the real felt Goose lip-syncing as the presenter. The spine: a tool gives you one PART (a clip, a timeline, a template) + a to-do list; Goose makes the WHOLE ad end-to-end (script → footage → voice → edit → captions → on-brand → delivered), shown as a transformation into a finished phone-mockup ad. Hard cuts with progressive reveals, pop/whoosh/ding SFX, loud VO, no karaoke captions (headlines carry it). Parameterized by {competitor, competitor_artifact, brief, why_line}; copy the project, edit the deck + VO, run. |
goose-vs-tool-comparison-video
Purpose
The repeatable production line for the @goose.ai.tools "Goose vs [X]" series, on the brand's agency / done-for-you positioning ("Goose handles 80% of our ad work" — an AI creative team, not a chatbot). One durable spine, swap the competitor per episode:
HOOK ("[Tool] gives you a [part]. Goose makes the whole ad.") → THE TOOL (a beautiful but partial artifact — a clip / a blank timeline / a template) → THE TO-DO LIST (everything you still have to do yourself) → GOOSE BUILDS IT (progressive reveal: script ✓ footage ✓ voice ✓ edit+captions ✓) → PAYOFF (the finished, on-brand ad playing in a phone mockup, "delivered ✓ / on-brand ✓") → THE WHY ("[Tool] gives you a [part]. Goose gives you the campaign.") → CTA (gooseworks.ai · your AI creative team).
Honest + non-disparaging: the tool is genuinely great at its one thing; Goose's edge is doing the whole job. Use vs Runway / Sora / Pika / Veo / Kling (clip generators), CapCut / Canva (DIY editors/templates), Arcads / Captions (point UGC tools).
NOT for: list-style explainers (use [[talking-goose-creator-video]]), or a "competitor visibly fails" angle (that was v1 — fine for ChatGPT, wrong for capable creative tools; this v2 spine is "great-but-partial vs whole").
Inputs
<competitor> — required. {name, artifact_type}. e.g. Runway (artifact clip), CapCut (artifact timeline), Canva (artifact template). Pick a recognized tool whose honest limit is "it stops at one part."
<competitor_artifact> — the partial thing it gives you, rendered as a designed mockup: a cinematic clip frame, a timeline/editor mockup, a template grid. (See hyperframes/v2.html v2-runway-clip frame — swap its body per artifact.)
<brief> — the shared job: "make me a finished ad." The contrast is end-to-end, not a trick task.
<why_line> — the thesis. "[Tool] gives you a [part]. Goose gives you the campaign."
<voice> — the approved Goose character voice QzTKubutNn9TjrB7Xb2Q (VOICES.md), eleven_v3 + energetic tags. Fallback Arlo RckSZHfvva0yOVRPzRfv.
<character> — the real felt Goose. Reuse the locked generated/character-lock/anchor-portrait.png (a forward-facing felt-goose still, e.g. the brand's goose-avatar-6). If unavailable, generate from the descriptor in [[talking-goose-creator-video]]'s references/character-descriptors.md.
<output_dir> — gooseworks-ads/goose-vs-<competitor>-NN/.
Composed Atoms
atoms/voiceover/create-voiceover-elevenlabs — eleven_v3 + with-timestamps (Goose voice). Wrapper audio/_generate_vo.sh.
- ElevenLabs sound-generation — the SFX kit (pop / whoosh / ding),
audio/_generate_sfx.sh.
atoms/lipsync/create-lipsync-veed-fal — veed/fabric-1.0 @ 720p, sequential with sleep 3, one call per scene segment; the goose talks the whole VO (it becomes the floating bubble).
atoms/image-generation/create-image-gpt-image-fal — only if no real felt-goose still is available (anchor fallback).
- Playwright editorial deck —
hyperframes/v2.html (cream/Fraunces/grain frames, progressive-reveal via ?n=), hyperframes/v2_render.js (renders each frame/variant to a full 1080×1920 PNG), hyperframes/bubble-ring.html + _bubble_render.js (the cream ring + shadow PNG).
ffmpeg composite — edits/_composite_v2.py: per beat = designed frame + a circular-masked goose bubble (mask440) that floats (y=base+amp*sin(2*PI*t/period)) + the ring on top; audio = VO at full level (amix normalize=0) + per-beat SFX, loudnorm I=-13.
Workflow
COPY recipe → EDIT (VO + deck + paths) → VO+SLICE → LIPSYNC(6, seq, bg) → STITCH → RENDER deck → COMPOSITE(float bubble) → DELIVER
- Copy the recipe — duplicate a reference project's scripts + reusable assets (anchor,
mask440.png, ring440.png, sfx, goose refs) into <output_dir>. The python scripts (_slice_segments.py, _composite_v2.py) resolve their project via Path(__file__).parents[1] — portable. Edit the hardcoded paths in audio/_generate_vo.sh + edits/_finish_v2.sh, and the FINAL filename in _composite_v2.py.
- Script + VO — write the spine into
_generate_vo.sh's VO (Goose voice, ~70-80 words ≈ 35-41s); keep each scene's first words a unique sequential anchor. Set those anchors in _slice_segments.py SCENES. Run both → voiceover.mp3 + 6 segments/scene-0N.mp3 + scene_timing.json.
- Lipsync — 6 sequential Veed Fabric calls (anchor + segment →
clips/scene-0N.mp4), sleep 3, abort if scene-01 fails. $0.15/s ($5-6). Background.
- Stitch — concat clips →
edits/talking-head-master.mp4 (1080×1920, the continuous goose on the VO timeline). (_finish_v2.sh does stitch + composite.)
- Deck — edit
hyperframes/v2.html for this competitor (hook, the artifact frame, the to-do list, the why line). node v2_render.js → frames in generated/overlays/_v2/ (incl. v2-goose-build-{2,3,4} and v2-why-{1,2} progressive-reveal cuts). Ensure all content sits above the bubble zone (top ≤ ~1180px).
- Composite — set
production/overlay-plan-v2.json (10 beats: start/end from scene_timing.json, sfx per cut, bubble {cx,cy,d,float}). bash edits/_finish_v2.sh → finals/goose-vs-<competitor>-NN.mp4.
- Deliver — frame-extract QC (goose big + floating; badges clear of faces; clean CTA), confirm loudness ~-14 LUFS, print the absolute path.
Decision Rules
- Great-but-partial, not "fails." Frame the tool respectfully (it's excellent at its one part); Goose's win is the whole pipeline. Honest = shareable.
- The goose is the star. Big floating circular bubble (~40% frame width), bottom-center, gentle sin float + lip-sync = "presenter," never a small static PIP. Reuse ONE locked real-goose anchor across all scenes (zero drift).
- Headlines carry it, not karaoke captions. Editorial Fraunces headlines are the sound-off message; skip word-captions (cleaner/premium). Add only if explicitly wanted.
- Cut for energy. 10+ hard cuts per ~35-40s; split the "build" into progressive chip reveals and the "why" into two line-reveals; whoosh on scene changes, pop on reveals, one ding on the payoff hold.
- On-brand or it reads cheap. Warm cream canvas + film grain + depth + generous negative space (match the brand banners). No mustard cards / terminals / clutter. Place every element deliberately (motion + shadow), never "plastered."
- Loud. VO at full level (
amix normalize=0) then loudnorm I=-13 — never let amix divide the VO down.
Output
<output_dir>/
├── audio/{voiceover.mp3, voiceover_timestamps.json, scene_timing.json, sfx-{pop,whoosh,ding}.mp3, segments/scene-0N.mp3, _generate_vo.sh, _generate_sfx.sh, _slice_segments.py}
├── generated/{character-lock/{anchor-portrait.png, LOCKED.json}, overlays/_v2/{v2-*.png, mask440.png, ring440.png}}
├── hyperframes/{v2.html, v2_render.js, bubble-ring.html, _bubble_render.js}
├── clips/scene-0N.mp4
├── edits/{talking-head-master.mp4, _composite_v2.py, _finish_v2.sh, segments_v2/, master-final.mp4}
├── production/overlay-plan-v2.json
└── finals/goose-vs-<competitor>-NN.mp4
Primary deliverable: finals/goose-vs-<competitor>-NN.mp4 (1080×1920, h264+AAC, ~35-41s, ~-14 LUFS).
Quality Checks
- VO uses an approved voice; duration 33-42s; final loudness ~-13 to -15 LUFS, true-peak ≤ -1 dB.
- 6 lipsync clips exist; each within ±10% of its segment; one locked anchor reused (no drift).
- Goose bubble is large (d ≈ 440), floats (position differs frame-to-frame), and is never cut off; ring + shadow clean.
- No graphic/badge covers a face (goose bubble or the ad-in-phone); content sits above the bubble zone.
- 10+ hard cuts incl. progressive build/why reveals; whoosh/pop on cuts, ding on the payoff.
- Cream editorial look matches the brand; CTA is clean (wordmark + tag + pill).
- Frame-extract QC pass: every visual matches the VO at that timestamp.
Failure Modes
| Symptom | Likely cause | Fix |
|---|
| Goose looks small / static | default PIP size, no motion | bump bubble.d to ~440 + float (amp 18-26) in overlay-plan-v2.json |
| Bubble ring/shadow renders as a gray square | ffmpeg blur of a hard circle | render the ring via CSS box-shadow (bubble-ring.html); mask via supersampled mask440.png |
bubble-frame/ring PNG is opaque black | page body had an explicit bg | set html,body{background:transparent}; omitBackground:true only removes the default backdrop |
| Badge sits on the goose's eyes | badges placed inside the phone over the face | flank badges OUTSIDE the phone (cream margins) |
| Veed Fabric 403 on storage auth | parallel calls | sequential + sleep 3 |
| Audio too quiet | amix normalized the VO down by N | amix=...:normalize=0 then loudnorm I=-13 |
Playwright MODULE_NOT_FOUND | not global | renderers glob ~/.npm/_npx/*/node_modules/playwright |
for f in $var runs once | shell is zsh | inline the list, or ${=var} |
| Anchor is an LFS pointer in a fresh clone | binary never pushed | use a real felt-goose still (e.g. brand goose-avatar-6) or generate from the descriptor |
Reference runs
gooseworks-ads/goose-vs-runway-01/ — Goose vs Runway ("Runway makes a clip. Goose makes the whole ad."). Canonical v2 build: big floating felt-goose Loom-bubble, cream editorial deck, phone-mockup payoff, progressive build/why reveals, loudnorm.
gooseworks-ads/goose-vs-capcut-01/ — Goose vs CapCut ("CapCut hands you a timeline. Goose makes the whole ad."), built by copying the recipe and swapping only the VO + the artifact frame (clip → editor timeline mockup) + the why line. Demonstrates the one-shot repeatability.
Invocation prompt (copy-paste — swap the brackets)
Make a viral 9:16 "[BRAND] vs [TOOL]" talking-mascot ad using the goose-vs-tool-comparison-video recipe.
Brand: [BRAND] — forward-facing mascot image at [path], brand accent [#hex].
Angle (agency / end-to-end): [TOOL] only gives you [one part — a clip / a template / a timeline]; [BRAND] delivers the whole finished thing.
Spine: hook → [TOOL]'s partial output + the to-do list it leaves you → [BRAND] builds the whole thing (progressive, voiceover-synced reveal) → the finished result playing in a phone mockup → the "why" line → CTA.
Look: mascot as a big floating circular Loom-bubble presenter on a [brand-color] editorial canvas (Fraunces display type, film grain, depth); tick-marks that check off as the VO names each item; per-cut whoosh/pop/ding; loudness-normalized audio; no karaoke captions (headlines carry it).
Voice: an approved ElevenLabs voice.
Build: copy gooseworks-ads/goose-vs-runway-01/ as the template, swap the VO (audio/_generate_vo.sh) + scene anchors (_slice_segments.py) + the artifact frame + colors + mascot anchor, re-time production/overlay-plan-v2.json with audio/_word_times.py, then run edits/_finish_v2.sh.