$npx -y skills add gooseworks-ai/goose-skills --skill render-creator-pip-listicleAssemble a creator picture-in-picture product-listicle ad from a config — the creator stays FULL-FRAME the whole beat (voice plus lips generated together per beat, no separate VO, no cut to a full-frame product shot), and on each product beat three persistent overlays ride on top
| 1 | # render-creator-pip-listicle |
| 2 | |
| 3 | Assemble a **creator picture-in-picture product listicle** ad from a config: an AI creator counts |
| 4 | down N products in the brand's own voice, and **the creator stays FULL-FRAME the whole time — there |
| 5 | is NO cut to a full-frame product shot, ever.** On each product beat, three persistent overlays ride |
| 6 | on top of the full-frame creator for the WHOLE beat: (1) a **title pill** top-center (persistent, it |
| 7 | carries the listicle title), (2) the **DEMO** in a rounded **PiP window top-right** — the brand's |
| 8 | real UGC clip (MUTED), or for a no-UGC brand the product's own demo (a real screen-recording, or an |
| 9 | autocropped high-res product-UI/dashboard still sized to fill the window), and (3) a **product card** |
| 10 | pinned bottom (rounded thumbnail left + "N · CATEGORY" small-caps + product NAME in a serif face like |
| 11 | Georgia). Hook + CTA beats are the creator full-frame with the **title pill only** (no PiP/card). The |
| 12 | creator's voice + lips are generated **together, natively** per beat — there is no separate voiceover. |
| 13 | This capability is the **FREE, deterministic assembly** — build the per-beat overlay PNG, cover-scale |
| 14 | the creator clip + composite the overlay, concat all beats, and burn the captions. |
| 15 | |
| 16 | `scripts/config.example.json` is the worked example (DIBS Beauty "5 products that replaced my whole |
| 17 | makeup bag", ~46s 1080×1920 9:16, a hook + 5 product beats + a CTA); `scripts/PIPELINE.md` maps |
| 18 | every config block to its source step and `scripts/README.md` documents the free assembly. |
| 19 | |
| 20 | ## Run |
| 21 | |
| 22 | This is the **FREE, deterministic** assembly stage — it spends nothing beyond the caption burn. The |
| 23 | paid inputs are separate capabilities — the creator anchor (`create-image-fal`, **Seedream v5 Pro**, |
| 24 | model `bytedance/seedream/v5/pro/text-to-image` with **no `fal-ai/` prefix**) and one native Seedance |
| 25 | talking clip per beat (`create-video-fal`, model `bytedance/seedance-2.0/reference-to-video`, |
| 26 | `generate_audio=ON`, the SAME seed across beats so the face holds, 720p default). Given those native |
| 27 | clips + the brand's real UGC demo clips (or the product's own autocropped UI stills / screen |
| 28 | recordings) + the real product photos + the brand palette + the title copy, |
| 29 | `render-creator-pip-listicle` builds ONE full-1080×1920 transparent overlay PNG per beat (title pill |
| 30 | always; + demo PiP top-right + bottom product card + rank number on product beats), cover-scales the |
| 31 | creator clip to 1080×1920 and overlays the beat's overlay PNG for the **whole beat** while keeping the |
| 32 | native audio, concats all beats, and burns the captions last → the master. Re-cuts reuse the existing |
| 33 | native clips + overlays and cost **$0**. |
| 34 | |
| 35 | **Anchor gotcha (Seedream v5 Pro, not gpt-image-2/Seedream-v4).** Seedance 2.0's partner-validation |
| 36 | gate REJECTS photoreal faces from **gpt-image-2 AND Seedream v4** ("may contain likenesses of real |
| 37 | people"); a **Seedream v5 Pro** face passes. Generate a **FRESH** anchor with `create-image-fal`, |
| 38 | model `bytedance/seedream/v5/pro/text-to-image` (no `fal-ai/` prefix) — reusing an existing photoreal |
| 39 | face from another project also trips the gate. |
| 40 | |
| 41 | **Clip gotchas (Seedance 2.0).** A **REJECTED submit STILL bills** via the fal-proxy — **pre-flight |
| 42 | ONE test clip (the hook)** and confirm it renders before firing the batch. Presigned anchor URLs |
| 43 | expire ~1h → re-host the anchor if a batch runs long (else "Failed to download the file" mid-batch). |
| 44 | The intermittent fal "User is locked: Exhausted balance" is the proxy's upstream fal account (not your |
| 45 | GooseWorks credits) → retry with backoff. |
| 46 | |
| 47 | ## Contract (the free assembly) |
| 48 | |
| 49 | - **Creator FULL-FRAME the whole beat — |