$npx -y skills add gooseworks-ai/goose-skills --skill render-glassy-matte-grwmAssemble a multi-scene GRWM beauty-demo ad from a config — a locked-identity creator applies ~5 products step by step while a SEPARATE ElevenLabs voiceover narrates and every scene cut is snapped to the VO's product-name word-starts (Whisper word-level timestamps), then ~5 Playwr
| 1 | # render-glassy-matte-grwm |
| 2 | |
| 3 | Assemble a **multi-scene GRWM beauty-demo** ad from a config — a locked-identity creator applies |
| 4 | ~5 makeup/skincare products step by step at a vanity, a **separate** ElevenLabs voiceover |
| 5 | narrates the routine, and every scene cut is snapped to the VO's product-name word-starts, with |
| 6 | ~5 Playwright product overlay cards on the product-name beats, a ducked music bed, burned |
| 7 | captions, and a flat-lay end card. This capability is the **FREE, deterministic assembly** — |
| 8 | the Whisper-driven re-cut + hard-concat, the Playwright card render + card composite, the VO + |
| 9 | music mix, the caption burn, and the flat-lay end card. |
| 10 | |
| 11 | This is the **multi-scene beauty demo**, distinct from the single-take apparel outfit-reveal |
| 12 | (`ugc-grwm`, one Seedance reference-to-video call with native lip-sync and minimal post). Here the |
| 13 | timeline is driven by a SEPARATE VO and the scenes are re-cut to its word-starts. |
| 14 | |
| 15 | `scripts/config.example.json` is the worked example (DIBS Beauty "5-Step Glassy Matte Routine", |
| 16 | ~32s 1080×1920 9:16, 12 VO-snapped cuts + 5 product cards); `scripts/PIPELINE.md` maps every |
| 17 | config block to its source step and `scripts/README.md` documents the free assembly. |
| 18 | |
| 19 | ## Run |
| 20 | |
| 21 | This is the **FREE, deterministic** assembly stage — it spends nothing. The paid inputs are |
| 22 | separate capabilities — the SEPARATE narration VO (`create-music-elevenlabs`, or a user-supplied |
| 23 | mp3; word-level Whisper timestamps set the timeline), ~7 Seedance scene clips one per product step |
| 24 | (`create-video-fal`), the ~5 white-bg product cutouts + the flat-lay end-card still |
| 25 | (`create-image-gpt-image-fal`), and the ducked music bed. Given the VO + `.words.json` + one clip |
| 26 | per step + the ~5 product cutouts + the music bed, `render-glassy-matte-grwm` re-cuts each clip to |
| 27 | its VO word-start window, hard-concats on the cut, renders + composites the product cards on the |
| 28 | product-name beats, mixes the VO over the ducked music, burns the captions, and appends the |
| 29 | flat-lay end card → the master. Re-cuts reuse the existing VO / clips / cutouts and cost **$0**. |
| 30 | |
| 31 | ## Contract (the free assembly) |
| 32 | |
| 33 | - **The SEPARATE VO drives the timeline — Whisper it first.** The narration is a separate track |
| 34 | (not a native take). Its word-level timestamps set every cut; the atempo'd VO ends shorter than |
| 35 | the plan expects (a 1.15× VO landed ~27.5s), so time every window to the word-starts, never to a |
| 36 | pre-planned grid. |
| 37 | - **Scene cuts snap to the "step N" word-start; cards snap to the product-NAME word-start.** Cut to |
| 38 | the next product when its step is announced; the card animates in ~1s later when the NAME is |
| 39 | spoken. Both happen. ~12 cuts over ~32s (cuts/10s ≈ 3.75). |
| 40 | - **Hard-concat with a re-encode.** Hard cuts on the VO word-starts, no dissolves; re-encode the |
| 41 | concat `-c:v libx264 -crf 20` — `-c copy` corrupts the duration when zoompan/PNG clips are in the |
| 42 | chain. |
| 43 | - **Product cards — Playwright, real cutout, PDP-verified tagline.** Playwright renders the card |
| 44 | template at 2× scale (real white-bg cutout thumb + name + PDP tagline). The cutout must match the |
| 45 | REAL product, not the Seedance scene's hallucinated barrel; the tagline is verified against the |
| 46 | brand PDP (AI flat-lays hallucinate sublines). Composite each card onto the master snapped to its |
| 47 | product-NAME word-start, 1s fade-in, held until the next product is named. **PNG overlay inputs |
| 48 | need `-loop 1 -t <dur>`** — without it the PNG emits one frame at t=0 and the fade/enable filters |
| 49 | silently no-op (cards go invisible). |
| 50 | - **VO leads the ducked music bed.** Mix the SEPARATE VO on top of the ducked music (the VO is the |
| 51 | lead), `loudnorm I=-14`. If the host ffmpeg lacks a filter, apad/atrim to length before the mix. |
| 52 | - **Captions — clean-white, override the preset.** Clean-white captions from the VO's Whisper |
| 53 | words, overridden to 3 words/cue, ~3.0% font, ~20% margin, NO pill, NO shadow (the default |
| 54 | 5-words/4.5%/18% reads too dense). Burn last. If the host ffmpeg lacks libass, render the cues as |
| 55 | timed PIL PNG overlays co |