Claude Skill

render-glassy-matte-grwm

Assemble 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

LLM Mart · 0 points · 7 views 0 listing impressions 0 install-command copies
Virus-scanned Reviewed automatically before listing.

Full trust report

Download gooseworks-ai-goose-skills-skills_ads_capabilities_render-glassy-matte-grwm-e1592ee.zip · 12 KB
Part of gooseworks-ai/goose-skills — 44 skills

Install

skills CLI npx skills add https://github.com/gooseworks-ai/goose-skills/tree/main/skills/ads/capabilities/render-glassy-matte-grwm
Claude Code claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install gooseworks-ai-goose-skills@llmmart
Git git clone https://github.com/gooseworks-ai/goose-skills.git

The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole gooseworks-ai/goose-skills collection as a plugin from our marketplace. Git is the plain clone.

Skill manifest

render-glassy-matte-grwm

Assemble a multi-scene GRWM beauty-demo ad from a config — a locked-identity creator applies ~5 makeup/skincare products step by step at a vanity, a separate ElevenLabs voiceover narrates the routine, and every scene cut is snapped to the VO's product-name word-starts, with ~5 Playwright product overlay cards on the product-name beats, a ducked music bed, burned captions, and a flat-lay end card. This capability is the FREE, deterministic assembly — the Whisper-driven re-cut + hard-concat, the Playwright card render + card composite, the VO + music mix, the caption burn, and the flat-lay end card.

This is the multi-scene beauty demo, distinct from the single-take apparel outfit-reveal (ugc-grwm, one Seedance reference-to-video call with native lip-sync and minimal post). Here the timeline is driven by a SEPARATE VO and the scenes are re-cut to its word-starts.

scripts/config.example.json is the worked example (DIBS Beauty "5-Step Glassy Matte Routine", ~32s 1080×1920 9:16, 12 VO-snapped cuts + 5 product cards); scripts/PIPELINE.md maps every config block to its source step and scripts/README.md documents the free assembly.

Run

This is the FREE, deterministic assembly stage — it spends nothing. The paid inputs are separate capabilities — the SEPARATE narration VO (create-music-elevenlabs, or a user-supplied mp3; word-level Whisper timestamps set the timeline), ~7 Seedance scene clips one per product step (create-video-fal), the ~5 white-bg product cutouts + the flat-lay end-card still (create-image-gpt-image-fal), and the ducked music bed. Given the VO + .words.json + one clip per step + the ~5 product cutouts + the music bed, render-glassy-matte-grwm re-cuts each clip to its VO word-start window, hard-concats on the cut, renders + composites the product cards on the product-name beats, mixes the VO over the ducked music, burns the captions, and appends the flat-lay end card → the master. Re-cuts reuse the existing VO / clips / cutouts and cost $0.

Contract (the free assembly)

  • The SEPARATE VO drives the timeline — Whisper it first. The narration is a separate track (not a native take). Its word-level timestamps set every cut; the atempo'd VO ends shorter than the plan expects (a 1.15× VO landed ~27.5s), so time every window to the word-starts, never to a pre-planned grid.
  • Scene cuts snap to the "step N" word-start; cards snap to the product-NAME word-start. Cut to the next product when its step is announced; the card animates in ~1s later when the NAME is spoken. Both happen. ~12 cuts over ~32s (cuts/10s ≈ 3.75).
  • Hard-concat with a re-encode. Hard cuts on the VO word-starts, no dissolves; re-encode the concat -c:v libx264 -crf 20 — -c copy corrupts the duration when zoompan/PNG clips are in the chain.
  • Product cards — Playwright, real cutout, PDP-verified tagline. Playwright renders the card template at 2× scale (real white-bg cutout thumb + name + PDP tagline). The cutout must match the REAL product, not the Seedance scene's hallucinated barrel; the tagline is verified against the brand PDP (AI flat-lays hallucinate sublines). Composite each card onto the master snapped to its product-NAME word-start, 1s fade-in, held until the next product is named. PNG overlay inputs need -loop 1 -t <dur> — without it the PNG emits one frame at t=0 and the fade/enable filters silently no-op (cards go invisible).
  • VO leads the ducked music bed. Mix the SEPARATE VO on top of the ducked music (the VO is the lead), loudnorm I=-14. If the host ffmpeg lacks a filter, apad/atrim to length before the mix.
  • Captions — clean-white, override the preset. Clean-white captions from the VO's Whisper words, overridden to 3 words/cue, ~3.0% font, ~20% margin, NO pill, NO shadow (the default 5-words/4.5%/18% reads too dense). Burn last. If the host ffmpeg lacks libass, render the cues as timed PIL PNG overlays composited with ffmpeg overlay=…:enable='between(t,st,en)' at the same placement.
  • Flat-lay end card. Append the flat-lay still (ken-burns hold ~4s) — a gpt-image-2 flat-lay of the ~5 products; do NOT trust its AI-rendered sublines for the card taglines.
  • FFmpeg composite, deterministic, FREE. Re-cut, hard-concat, render + composite the cards, mix the VO over the ducked music, burn the captions, append the end card → a 1080×1920 30fps h264+aac master (~32s). No paid calls, no keys.
Files (goose-skills)
  • scripts
    • config.example.json 12 KB
      {
        "_comment": "DIBS Beauty '5-Step Glassy Matte Routine' — THE WORKED EXAMPLE. Copy to config.json and edit. A ~32s 9:16 (1080x1920, 30fps) MULTI-SCENE GRWM beauty demo where a locked-identity creator applies 5 DIBS products step-by-step at a sage vanity, a SEPARATE locked ElevenLabs Karri VO narrates the routine, and every scene cut is snapped to the VO's 'step N' / product-name word-starts (Whisper), with 5 Playwright product overlay cards (real PDP taglines) on the product-name beats, a warm acoustic music bed ducked under the VO, clean-white 3-words/cue captions, closing on a gpt-image-2 flat-lay end card. Pipeline: (1) lock creator anchor + sage-vanity world + hook keyframe + Karri VO (atempo 1.15x -> ~27.5s); (2) 7 Seedance 2.0 scene clips (720p, --no-audio) + the flat-lay still; (3) Groq whisper-large-v3 word-level on the VO; (4) re-cut + hard-concat to the 12 VO cuts (build_v4.py, -crf 20 re-encode); (5) 5 white-bg gpt-image-2 product cutouts (PDP-verified taglines) + Playwright cards (render_cards.py); (6) composite cards on the product-name beats (composite_cards.py, -loop 1 -t) + mix VO/music + burn captions + flat-lay end card (build_master.py). Master 1080x1920 h264+aac, ~32s. See scripts/PIPELINE.md for the source scripts.",
        "brand_name": "DIBS Beauty",
        "campaign": "5-Step Glassy Matte Routine",
        "title": "5 products, one finish",
        "width": 1080,
        "height": 1920,
        "fps": 30,
        "duration_sec": 32.0,
        "aspect_ratio": "9:16",
        "palette": {
          "card_bg": "#F8EEDE",
          "accent": "#E879A6"
        },
        "assets": {
          "creator_anchor": "assets/characters/grwm-creator.png",
          "_note_creator": "26yo brunette w/ caramel highlights, black satin headband, white ribbed tank, in a sage-green bathroom. Identity + wardrobe + setting held across every scene clip.",
          "vanity_world": "assets/worlds/sage-vanity.png",
          "hook_keyframe": "assets/keyframes/five-pink-barrels.png",
          "_note_hook": "Creator holding 5 pink DIBS barrels fanned near her face. Doubles as the payoff-smile beat (s07a)."
        },
        "vo": {
          "_comment": "SEPARATE locked ElevenLabs Karri VO — NOT a native Seedance take. Whispered FIRST; the word-starts set the timeline. atempo 1.15x makes it end at ~27.5s (NOT 45s). Script written clean (no eleven_v3 audio tags).",
          "source": "user_supplied",
          "provider": "elevenlabs",
          "model": "eleven_v3",
          "voice_id": "3mip1Cv2rZYeio9MCzfr",
          "voice_name": "Karri",
          "stability": 0.40,
          "similarity_boost": 0.75,
          "style": 0.25,
          "atempo": 1.15,
          "script": "okay, my five-step glassy matte routine. step one, Love Beam Perfector. it's basically skincare you put on first. step two, Desert Island Duo. blush and bronzer in one stick. step three, Glow Tour for contour. step four, Love Beam Powder. it brightens and blurs. step five, Setting Mist. that's the lock. five products, one finish. about three minutes.",
          "actual_duration_s": 27.5,
          "outputs": {
            "audio": "working/voiceovers/locked/karri-full-atempo115.mp3",
            "word_timings": "working/voiceovers/locked/karri-full-atempo115.words.json"
          },
          "_word_starts": {
            "_comment": "Whisper-verified word-starts for this exact atempo'd mp3. Scene cuts snap to the 'step N' starts; cards snap to the product-NAME starts.",
            "step_one": 3.32, "Love Beam Perfector": 4.34,
            "step_two": 8.64, "Desert Island Duo": 9.56,
            "step_three": 13.82, "Glow Tour": 14.86,
            "step_four": 17.00, "Love Beam Powder": 17.94,
            "step_five": 21.48, "Setting Mist": 22.42,
            "five_products_one_finish": 24.62, "about_three_minutes": 26.50
          }
        },
        "scene_clips": {
          "_comment": "7 Seedance 2.0 clips (create-video-seedance-fal, Fal direct, 720p, 9:16, --no-audio) off the locked anchor + world. Softer verbs — s05 powder used 'swirls'/'dusts' after a 422 on 'press'/'brush her face'. ~$12.60 total.",
          "provider": "fal",
          "model": "seedance_2_0",
          "resolution": "720p",
          "aspect_ratio": "9:16",
          "audio": false,
          "clips": [
            { "id": "s01-hook",      "role": "HOOK",   "duration_sec": 4, "ref": ["hook_keyframe"],               "beat": "holds five glossy pink DIBS cream-sticks fanned near her face, eye contact with selfie camera, playful smile" },
            { "id": "s02-perfector", "role": "STEP_1", "duration_sec": 7, "ref": ["creator_anchor", "vanity_world"], "beat": "dabs a few pearls of pink LoveBeam Perfector onto cheekbones + forehead with fingertips, taps them in" },
            { "id": "s03-did",       "role": "STEP_2", "duration_sec": 8, "ref": ["creator_anchor"],              "beat": "swipes the Desert Island Duo cream-stick on cheeks/nose/forehead, presses in with a dense face brush" },
            { "id": "s04-glowtour",  "role": "STEP_3", "duration_sec": 7, "ref": ["creator_anchor"],              "beat": "stripes the Glow Tour contour stick along cheekbone hollow + jawline, blends down with fingertips" },
            { "id": "s05-powder",    "role": "STEP_4", "duration_sec": 6, "ref": ["creator_anchor"], "tier": "fast", "beat": "swirls a soft brush in the pink compact, taps it, dusts across her T-zone (softer verbs — 'press'/'brush her face' 422'd)" },
            { "id": "s06-mist",      "role": "STEP_5", "duration_sec": 6, "ref": ["creator_anchor"],              "beat": "holds the LoveBeam Setting Mist ~8in from her face and sprays a fine even mist; skin gains a glassy glow" },
            { "id": "s07a-payoff",   "role": "PAYOFF", "duration_sec": 4, "ref": ["hook_keyframe"],               "beat": "smiles fully into the selfie camera, fresh glassy-matte makeup on, warm confident expression" }
          ]
        },
        "cuts": {
          "_comment": "12 cuts derived from the VO word-starts (build_v4.py). Scene cuts land on 'step N' starts; s02 + s03 + s05 sub-cut for pacing. Hard-concat, re-encode -c:v libx264 -crf 20. cuts/10s = 12/32*10 = 3.75.",
          "hard_concat": true,
          "reencode": "-c:v libx264 -crf 20",
          "count": 12,
          "cuts_per_10s": 3.75,
          "windows": [
            { "t_start": 0.00,  "t_end": 3.00,  "clip": "s01-hook",      "src_in": 0.0, "dur": 3.00, "why": "hook ends as 'step one' begins" },
            { "t_start": 3.00,  "t_end": 6.00,  "clip": "s02-perfector", "src_in": 0.0, "dur": 3.00, "why": "perfector first half" },
            { "t_start": 6.00,  "t_end": 9.56,  "clip": "s02-perfector", "src_in": 3.0, "dur": 3.56, "why": "perfector second half — ends as 'Desert Island Duo' begins" },
            { "t_start": 9.56,  "t_end": 12.00, "clip": "s03-did",       "src_in": 0.0, "dur": 2.44, "why": "DID swipe begin" },
            { "t_start": 12.00, "t_end": 13.82, "clip": "s03-did",       "src_in": 2.5, "dur": 1.82, "why": "DID continuation — ends as 'step three' begins" },
            { "t_start": 13.82, "t_end": 17.00, "clip": "s04-glowtour",  "src_in": 0.0, "dur": 3.18, "why": "glowtour — ends as 'step four' begins" },
            { "t_start": 17.00, "t_end": 19.22, "clip": "s05-powder",    "src_in": 0.0, "dur": 2.22, "why": "powder swirl" },
            { "t_start": 19.22, "t_end": 21.48, "clip": "s05-powder",    "src_in": 2.3, "dur": 2.26, "why": "powder application — ends as 'step five' begins" },
            { "t_start": 21.48, "t_end": 24.52, "clip": "s06-mist",      "src_in": 0.0, "dur": 3.04, "why": "mist — ends as 'five products' payoff begins" },
            { "t_start": 24.52, "t_end": 27.80, "clip": "s07a-payoff",   "src_in": 0.0, "dur": 3.28, "why": "payoff smile during 'five products, one finish'" },
            { "t_start": 27.80, "t_end": 32.00, "clip": "FLAT_LAY",      "src_in": 0.0, "dur": 4.20, "why": "end-card ken-burns on the flat-lay still" }
          ]
        },
        "products": {
          "_comment": "5 white-bg standalone gpt-image-2 cutouts (gen-product-cutouts.sh). Taglines VERIFIED against dibsbeauty.com PDPs — the gpt-image-2 flat-lay renders WRONG sublines ('SCULPT + GLOW' on DID, 'BLUSH + HIGHLIGHT' on GlowTour). LoveBeam Perfector is a slim liquid bottle, NOT a wide cream stick (even though the Seedance s02 clip shows a wide barrel — the card shows the REAL product).",
          "cutouts": [
            { "id": "perfector", "name": "LoveBeam Perfector",   "tagline": "GLOW SERUM",       "cutout": "working/products/perfector.png", "vo_name_start_s": 4.34 },
            { "id": "did",       "name": "Desert Island Duo",    "tagline": "BLUSH + BRONZER",  "cutout": "working/products/did.png",       "vo_name_start_s": 9.56 },
            { "id": "glowtour",  "name": "Glow Tour Duo",        "tagline": "CONTOUR + BLUSH",  "cutout": "working/products/glowtour.png",  "vo_name_start_s": 14.86 },
            { "id": "powder",    "name": "LoveBeam Powder",      "tagline": "BRIGHTEN + BLUR",  "cutout": "working/products/powder.png",    "vo_name_start_s": 17.94 },
            { "id": "mist",      "name": "Setting Mist",         "tagline": "LOCK IT IN",       "cutout": "working/products/mist.png",      "vo_name_start_s": 22.42 }
          ],
          "_note_taglines": "Taglines above are the card lines used in the worked example; ALWAYS re-verify against the live PDP before shipping a new brand — do not carry these forward."
        },
        "cards": {
          "_comment": "5 Playwright cards from working/product-card.html.tmpl at 2x scale (render_cards.py): warm cream card (#F8EEDE gradient) + pink accent bar (#E879A6) + cutout thumb + Georgia name + uppercase pink tagline. Composited (composite_cards.py) snapped to the product-NAME word-start (~1s after the scene cut), 1s fade-in. PNG overlays NEED -loop 1 -t <dur>.",
          "template": "working/product-card.html.tmpl",
          "playwright_scale": 2,
          "fade_in_s": 1.0,
          "loop_flag_required": true,
          "timing": [
            { "card": "perfector", "start": 4.34,  "end": 9.56,  "matches": "'Love Beam Perfector' -> 'Desert Island Duo'" },
            { "card": "did",       "start": 9.56,  "end": 13.82, "matches": "'Desert Island Duo' -> 'step three'" },
            { "card": "glowtour",  "start": 14.86, "end": 17.94, "matches": "'Glow Tour for contour' -> 'Love Beam Powder'" },
            { "card": "powder",    "start": 17.94, "end": 22.42, "matches": "'Love Beam Powder' -> 'Setting Mist'" },
            { "card": "mist",      "start": 22.42, "end": 27.80, "matches": "'Setting Mist' -> payoff" }
          ]
        },
        "music": {
          "_comment": "Warm acoustic instrumental bed (ElevenLabs Music, 45s — only ~32s consumed), ducked under the VO. No artist names in the prompt (ElevenLabs ToS filter).",
          "provider": "elevenlabs",
          "prompt": "Warm acoustic instrumental, soft nylon guitar + light percussion, gentle and aspirational, easygoing morning-routine energy, no vocals.",
          "source": "working/music/music.mp3",
          "duration_s": 45,
          "force_instrumental": true
        },
        "audio_mix": {
          "_comment": "The SEPARATE Karri VO is the lead; the music sits well under it. loudnorm I=-14.",
          "loudness_lufs": -14,
          "vo_lead": true,
          "music_duck": true
        },
        "captions": {
          "_comment": "Clean-white captions from the VO's Whisper words. OVERRIDE the clean-white preset: 3 words/cue, 3.0% font, 20% from the bottom, NO pill, NO shadow (default 5-words/4.5%/18% is too dense). Built in cue_builder.py within build_master.py.",
          "source": "working/voiceovers/locked/karri-full-atempo115.words.json",
          "style": "clean_white",
          "chunk_words": 3,
          "font_size_pct": 3.0,
          "margin_bottom_pct": 20,
          "no_pill": true,
          "no_shadow": true,
          "base_color": "#FFFFFF"
        },
        "end_card": {
          "_comment": "gpt-image-2 9:16 flat-lay still of the 5 products on cream linen, ken-burns held ~4.2s at the tail (27.80 -> 32.00). Do NOT trust the flat-lay's AI sublines for taglines — PDP-verify (see products[]).",
          "engine": "gpt-image-2",
          "flat_lay": "assets/keyframes/grwm-flat-lay.png",
          "hold_sec": 4.2,
          "effect": "ken-burns"
        },
        "post_production": {
          "vo": { "default": "on", "note": "the SEPARATE locked ElevenLabs VO (atempo 1.15x) narrates the routine and drives every cut" },
          "product_cards": { "default": "on", "note": "5 Playwright cards (real cutout + PDP tagline), each on its product-NAME word-start" },
          "music": { "default": "on", "note": "warm instrumental bed ducked under the VO, loudnorm I=-14" },
          "captions": { "default": "on", "note": "clean-white, 3 words/cue, 3.0% font, 20% margin, no pill/shadow" },
          "end_card": { "default": "on", "note": "gpt-image-2 flat-lay still of the 5 products, ken-burns held ~4s" }
        }
      }
      
    • PIPELINE.md 6.3 KB
      # Pipeline — glassy-matte GRWM (multi-scene beauty demo)
      
      How `config.example.json` maps to the real production steps. This capability ships a
      **config + this map**, not a bundled runner: the worked example (DIBS Beauty "5-Step Glassy
      Matte Routine") was produced by the video-orchestrator's per-state steps plus three per-project
      drivers (`build_v4.py`, `render_cards.py`, `composite_cards.py` + `build_master.py`). The four
      paid stages (the SEPARATE VO, the ~7 Seedance scene clips, the ~5 gpt-image-2 product cutouts +
      the flat-lay) are separate capabilities; this cap owns the FREE assembly at the end.
      
      The steps run **in order** because each depends on the last: the SEPARATE VO sets the timeline
      (via its Whisper word-starts), the word-starts drive the scene cuts, the scenes are re-cut +
      concatenated, the product cutouts + PDP taglines drive the cards, the cards are composited on the
      product-name beats, and the mix + captions + end card finish the master.
      
      ## Field → source-step map
      
      | Config field | Phase | Source step / script | Paid? |
      |---|---|---|---|
      | `vo.script`, `vo.voice_id`, `vo.atempo` | 1 Lock | ElevenLabs `eleven_v3` TTS + ffmpeg `atempo 1.15` (or ingest an mp3) | **PAID** (or supplied) |
      | `scene_clips.clips[]` | 2 Scenes | `create-video-fal` (Seedance 2.0, Fal direct, 720p, ~6s, `--no-audio`) | **PAID** (~$0.30/s @ 720p) |
      | `end_card.flat_lay` | 2 Scenes | `create-image-gpt-image-fal` (gpt-image-2, 9:16) | **PAID** (~$0.07) |
      | `vo.outputs.word_timings` | 3 Whisper | Groq `whisper-large-v3` word-level → `<vo>.words.json` | ~$0.04 |
      | `cuts.windows[]` | 4 Re-cut | scene cuts derived from the "step N" word-starts, re-cut + hard-concat + `-crf 20` | `build_v4.py` (free) |
      | `products.cutouts[]` | 5 Products | `create-image-gpt-image-fal` (gpt-image-2 white-bg standalone); taglines PDP-verified | **PAID** (~$0.35) |
      | `cards.template`, `.playwright_scale` | 5 Cards | Playwright renders `product-card.html.tmpl` at 2× | `render_cards.py` (free) |
      | `cards.timing[]` | 6 Composite | cards composited onto the master, snapped to product-name word-starts (`-loop 1 -t`) | `composite_cards.py` (free) |
      | `music`, `audio_mix` | 6 Mix | ElevenLabs Music bed ducked under the VO, loudnorm I=-14 | `build_master.py` (**PAID** music; mix free) |
      | `captions` | 6 Captions | clean-white captions from the Whisper words (3 words/cue override) burned | `build_master.py` (free) |
      | `end_card.hold_sec`, `.effect` | 6 End card | flat-lay ken-burns hold appended | `build_master.py` (free) |
      
      ## 1. Lock the assets + VO  (config: `assets`, `vo`)  [PAID-or-supplied VO]
      
      Lock the creator anchor (identity + wardrobe + setting), the vanity world plate, and the hook
      keyframe (creator holding the ~5 products fanned; doubles as the payoff). Render the VO on
      ElevenLabs `eleven_v3` (`stability 0.40`, `style 0.25`), then `ffmpeg atempo=1.15` to hit a
      ~27.5s pace, or ingest a supplied mp3. **The VO is a SEPARATE track — not a native take.** Write
      the script clean (no audio tags).
      
      ## 2. Scene clips → Seedance 2.0  (config: `scene_clips`, `end_card.flat_lay`)  [PAID]
      
      `create-video-fal` (Seedance 2.0, Fal direct) fires ~7 scene clips: a hook, one clip per product
      step (its application beat), and a payoff smile — 720p / 9:16 / `--no-audio`, off the locked anchor
      + world refs. **Softer application verbs** ("dabs", "swirls", "dusts") — hard verbs ("press",
      "brush her face") 422 on content policy; retry `--tier fast`. Also generate the gpt-image-2 flat-lay
      end-card still. Verify each clip's duration; Seedance drifts on the back ~2s of longer clips, so
      trim to the clean window in Phase 4.
      
      ## 3. Whisper the VO → Groq word timestamps  (config: `vo.outputs.word_timings`)  [~$0.04]
      
      Groq `whisper-large-v3` word-level on the atempo'd VO → `<vo>.words.json`. **The VO's actual
      duration + word-starts set the timeline** — a 1.15× VO ends ~27.5s, not the 45s the plan assumed
      (the back half would play silent). Record the word-start of each "step N" and each product name.
      
      ## 4. Re-cut + concat → `build_v4.py`  (config: `cuts`)  [free]
      
      Derive the cut points: **scene cuts land on the "step N" word-starts** (cut to the next product
      when its step is announced, not when the previous application beat ends); a scene may sub-cut for
      pacing. Re-cut each clip to its VO window and **hard-concat** (no dissolves) → a silent master. 12
      cuts over 32s (cuts/10s = 3.75). **Re-encode `-c:v libx264 -crf 20`** — `-c copy` corrupts the
      duration when zoompan/PNG clips are in the chain.
      
      ## 5. Product cutouts + cards → `gen-product-cutouts.sh` + `render_cards.py`  (config: `products`, `cards`)  [PAID cutouts]
      
      `create-image-gpt-image-fal` (gpt-image-2, white-bg) → ~5 **standalone** product cutouts (NOT
      on-body, NOT an AI flat-lay). **PDP-verify every tagline** — the gpt-image-2 flat-lay renders
      hallucinated sublines ("SCULPT + GLOW"), which are WRONG. The cutout must match the REAL product,
      not the Seedance scene's hallucinated barrel. Playwright renders `product-card.html.tmpl` at **2×
      scale** → one card PNG per product (warm cream card, pink accent bar, cutout thumb, name, PDP
      tagline).
      
      ## 6. Composite + mix + captions + end card → `composite_cards.py` + `build_master.py`  (config: `cards.timing`, `music`, `audio_mix`, `captions`, `end_card`)  [free assembly]
      
      - **Cards** (`composite_cards.py`): composite each card onto the silent master, **snapped to the
        product-NAME word-start** (~1s after its scene cut), fading in over ~1s, held until the next
        product is named. **PNG overlay inputs NEED `-loop 1 -t <dur>`** — else the PNG emits one frame at
        t=0 and the fade/enable filters silently no-op (cards go invisible).
      - **Mix** (`build_master.py`): mix the SEPARATE VO on top of the ducked ElevenLabs Music bed (VO is
        the lead), `loudnorm I=-14`.
      - **Captions**: clean-white captions from the VO's Whisper words, **overridden to 3 words/cue,
        ~3.0% font, ~20% margin, no pill, no shadow** (the default 5-words/4.5%/18% preset reads too
        dense). If the host ffmpeg lacks libass, render the cues as timed PIL PNG overlays instead.
      - **End card**: append the gpt-image-2 flat-lay still, ken-burns held ~4s → `finals/<brand>-glassy-matte-grwm-v4.mp4`
        (1080×1920, 30fps, h264+aac, ~32s).
      
      Re-cuts (new cut windows, re-timed cards, caption chunking, a swapped end card) reuse the existing
      clips / VO / cutouts / music and cost **$0** — only steps 1–2 and 5's cutouts spend.
      
    • README.md 3.1 KB
      # render-glassy-matte-grwm scripts — the FREE assembly
      
      `render-glassy-matte-grwm` is the **deterministic, $0 assembly stage** of the multi-scene GRWM
      beauty-demo format. The paid stages (the SEPARATE narration VO, the ~7 Seedance scene clips, the
      ~5 gpt-image-2 product cutouts + the flat-lay end-card still, the music bed) are separate
      capabilities — `create-music-elevenlabs`, `create-video-fal`, `create-image-gpt-image-fal`. This
      capability spends nothing — it takes the VO + `<vo>.words.json` + one clip per product step + the
      ~5 product cutouts + the music bed and stitches the finished master. Re-cuts (new cut windows,
      re-timed cards, a swapped end card, caption chunking) reuse the existing VO / clips / cutouts and
      cost **$0**.
      
      `config.example.json` is the worked example (DIBS Beauty "5-Step Glassy Matte Routine", ~32s
      1080×1920). `PIPELINE.md` maps every config block to its source step. This README documents the
      FREE assembly pieces that `render-glassy-matte-grwm` owns.
      
      ## 1. Re-cut to the VO word-starts + hard-concat on the cut
      
      The SEPARATE VO drives the timeline. Groq `whisper-large-v3` word-level gives the word-start of
      each "step N" and each product name; **scene cuts land on the "step N" word-starts** (cut to the
      next product when its step is announced), and a scene may sub-cut for pacing. Re-cut each clip to
      its VO window and **hard-concat on the cut** — no dissolves. **Re-encode `-c:v libx264 -crf 20`**
      — `-c copy` corrupts the duration when zoompan/PNG clips are in the chain. ~12 cuts over ~32s.
      
      ## 2. Product cards — Playwright render + composite on the product-name beats
      
      Playwright renders the card template (`product-card.html.tmpl`) at **2× scale** → one PNG per
      product — a warm cream card, a pink accent bar, the real white-bg cutout thumb, the product name,
      and the PDP-verified tagline. The cutout must match the REAL product (not the Seedance scene's
      hallucinated barrel), and the tagline is verified against the brand PDP (AI flat-lays hallucinate
      sublines). Each card is composited onto the master **snapped to its product-NAME word-start** (~1s
      after the scene cut), fading in over ~1s, held until the next product is named. **PNG overlay
      inputs NEED `-loop 1 -t <dur>`** — without it the PNG emits one frame at t=0 and the fade/enable
      filters silently no-op (the card is invisible).
      
      ## 3. Captions — clean-white, override the preset
      
      Clean-white captions from the VO's Whisper words, **overridden to 3 words/cue, ~3.0% font, ~20%
      margin, NO pill, NO shadow** (the default 5-words/4.5%/18% preset reads too dense for this format).
      Burned last. If the host ffmpeg lacks libass (no `subtitles`/`ass` filter), render the cues as
      timed PIL PNG overlays composited with ffmpeg `overlay=…:enable='between(t,st,en)'` at the same
      placement.
      
      ## 4. FFmpeg mix + end card
      
      Mix the SEPARATE VO on top of the ducked ElevenLabs Music bed (the VO is the lead — the music sits
      well under it), `loudnorm I=-14`. Append the gpt-image-2 flat-lay still (ken-burns hold ~4s) — do
      NOT trust its AI-rendered sublines for the card taglines. Output is a 1080×1920 30fps h264+aac
      master (~32s). Deterministic, no paid calls, no keys.
      
  • tests
    • smoke-test.md 1.4 KB
      # Smoke Test
      
      Given the SEPARATE narration VO (mp3 + `.words.json`), ~7 Seedance scene clips (one per product
      step + a hook + a payoff, one locked creator across all), ~5 white-bg product cutouts with
      PDP-verified taglines, a music bed, and a flat-lay end-card still, `render-glassy-matte-grwm`
      assembles the master — re-cut each clip to its VO word-start window, hard-concat on the cut,
      Playwright-render + composite the ~5 product cards on the product-name beats, mix the VO over the
      ducked music, burn clean-white captions, close on the flat-lay end card → 1080×1920 h264+aac
      (~32s).
      
      Pass when the assembly runs to a valid MP4 and:
      - ~12 scene segments, each hard-cut on its "step N" word-start (no crossfades); the ONE locked
        creator + vanity hold across every scene;
      - ~5 product cards, each animating in on its product-NAME word-start (~1s after the scene cut) with
        the RIGHT white-bg cutout + a PDP-verified tagline; every PNG overlay used `-loop 1 -t <dur>`;
      - captions are clean-white 3-words/cue (no pill, no shadow); the flat-lay end card holds ~4s on the
        final window;
      - the SEPARATE VO clearly leads the ducked music bed at loudnorm I=-14 — no VO baked into the
        clips, no music on top of the VO;
      - **no paid call is made** — the VO, scene clips, product cutouts, and music come from the paid
        capabilities (create-music-elevenlabs / create-video-fal / create-image-gpt-image-fal); this
        assembly is $0 and a re-cut reuses the existing assets.
      
  • SKILL.md 5.4 KB
    ---
    name: render-glassy-matte-grwm
    description: Assemble 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 Playwright product overlay cards (real PDP-verified taglines) are composited onto the master each on its product-NAME word-start, the SEPARATE VO is mixed on top of a ducked music bed at loudnorm I=-14, clean-white 3-words/cue captions are burned, and the video closes on a flat-lay end card. This is the FREE deterministic assembly stage (re-cut to the VO word-starts, hard-concat, Playwright card render + card composite, VO plus music mix, caption burn, flat-lay end card); the VO, scene clips, product cutouts, and music come from create-music-elevenlabs / create-image-gpt-image-fal / create-video-fal. Use for the glassy-matte-grwm format.
    status: active
    ---
    
    # render-glassy-matte-grwm
    
    Assemble a **multi-scene GRWM beauty-demo** ad from a config — a locked-identity creator applies
    ~5 makeup/skincare products step by step at a vanity, a **separate** ElevenLabs voiceover
    narrates the routine, and every scene cut is snapped to the VO's product-name word-starts, with
    ~5 Playwright product overlay cards on the product-name beats, a ducked music bed, burned
    captions, and a flat-lay end card. This capability is the **FREE, deterministic assembly** —
    the Whisper-driven re-cut + hard-concat, the Playwright card render + card composite, the VO +
    music mix, the caption burn, and the flat-lay end card.
    
    This is the **multi-scene beauty demo**, distinct from the single-take apparel outfit-reveal
    (`ugc-grwm`, one Seedance reference-to-video call with native lip-sync and minimal post). Here the
    timeline is driven by a SEPARATE VO and the scenes are re-cut to its word-starts.
    
    `scripts/config.example.json` is the worked example (DIBS Beauty "5-Step Glassy Matte Routine",
    ~32s 1080×1920 9:16, 12 VO-snapped cuts + 5 product cards); `scripts/PIPELINE.md` maps every
    config block to its source step and `scripts/README.md` documents the free assembly.
    
    ## Run
    
    This is the **FREE, deterministic** assembly stage — it spends nothing. The paid inputs are
    separate capabilities — the SEPARATE narration VO (`create-music-elevenlabs`, or a user-supplied
    mp3; word-level Whisper timestamps set the timeline), ~7 Seedance scene clips one per product step
    (`create-video-fal`), the ~5 white-bg product cutouts + the flat-lay end-card still
    (`create-image-gpt-image-fal`), and the ducked music bed. Given the VO + `.words.json` + one clip
    per step + the ~5 product cutouts + the music bed, `render-glassy-matte-grwm` re-cuts each clip to
    its VO word-start window, hard-concats on the cut, renders + composites the product cards on the
    product-name beats, mixes the VO over the ducked music, burns the captions, and appends the
    flat-lay end card → the master. Re-cuts reuse the existing VO / clips / cutouts and cost **$0**.
    
    ## Contract (the free assembly)
    
    - **The SEPARATE VO drives the timeline — Whisper it first.** The narration is a separate track
      (not a native take). Its word-level timestamps set every cut; the atempo'd VO ends shorter than
      the plan expects (a 1.15× VO landed ~27.5s), so time every window to the word-starts, never to a
      pre-planned grid.
    - **Scene cuts snap to the "step N" word-start; cards snap to the product-NAME word-start.** Cut to
      the next product when its step is announced; the card animates in ~1s later when the NAME is
      spoken. Both happen. ~12 cuts over ~32s (cuts/10s ≈ 3.75).
    - **Hard-concat with a re-encode.** Hard cuts on the VO word-starts, no dissolves; re-encode the
      concat `-c:v libx264 -crf 20` — `-c copy` corrupts the duration when zoompan/PNG clips are in the
      chain.
    - **Product cards — Playwright, real cutout, PDP-verified tagline.** Playwright renders the card
      template at 2× scale (real white-bg cutout thumb + name + PDP tagline). The cutout must match the
      REAL product, not the Seedance scene's hallucinated barrel; the tagline is verified against the
      brand PDP (AI flat-lays hallucinate sublines). Composite each card onto the master snapped to its
      product-NAME word-start, 1s fade-in, held until the next product is named. **PNG overlay inputs
      need `-loop 1 -t <dur>`** — without it the PNG emits one frame at t=0 and the fade/enable filters
      silently no-op (cards go invisible).
    - **VO leads the ducked music bed.** Mix the SEPARATE VO on top of the ducked music (the VO is the
      lead), `loudnorm I=-14`. If the host ffmpeg lacks a filter, apad/atrim to length before the mix.
    - **Captions — clean-white, override the preset.** Clean-white captions from the VO's Whisper
      words, overridden to 3 words/cue, ~3.0% font, ~20% margin, NO pill, NO shadow (the default
      5-words/4.5%/18% reads too dense). Burn last. If the host ffmpeg lacks libass, render the cues as
      timed PIL PNG overlays composited with ffmpeg `overlay=…:enable='between(t,st,en)'` at the same
      placement.
    - **Flat-lay end card.** Append the flat-lay still (ken-burns hold ~4s) — a gpt-image-2 flat-lay of
      the ~5 products; do NOT trust its AI-rendered sublines for the card taglines.
    - **FFmpeg composite, deterministic, FREE.** Re-cut, hard-concat, render + composite the cards, mix
      the VO over the ducked music, burn the captions, append the end card → a 1080×1920 30fps h264+aac
      master (~32s). No paid calls, no keys.
    
  • skill.meta.json 325 B
    {
      "slug": "render-glassy-matte-grwm",
      "category": "capabilities",
      "domain": "ads",
      "tags": [
        "ads"
      ],
      "installation": {
        "base_command": "npx goose-skills install render-glassy-matte-grwm",
        "supports": [
          "claude",
          "cursor",
          "codex"
        ]
      },
      "requires_skills": [
        "watch"
      ]
    }
    

Comments (0)

Sign in to join the conversation.

No comments yet.

Reviews (0)

No reviews yet.

Related