$npx -y skills add gooseworks-ai/goose-skills --skill render-3d-product-showcaseAssemble a premium 3D product-showcase ad from a config — four beat clips (an orbiting hero rotation, a macro push-in, a physics reveal, a typographic close) normalized to the brand-color canvas, hard-concatenated in order, closed on a deterministic Playwright brand end card, and
| 1 | # render-3d-product-showcase |
| 2 | |
| 3 | Assemble a premium **3D product-showcase** ad from a config: one real product floats centered |
| 4 | on a clean seamless brand-color backdrop and sells itself across four beats — an orbiting hero |
| 5 | rotation, a macro push-in on the surface detail, a physics reveal (`exploded_view` / |
| 6 | `particle_disintegration` / `liquid_splash`, or `rotation_only`), then a typographic brand |
| 7 | close. This capability is the **FREE, deterministic assembly** that stitches the delivered |
| 8 | beats into the master; it spends nothing. |
| 9 | |
| 10 | `scripts/config.example.json` is the worked example (DIBS Beauty "Desert Island Duo", ~15s |
| 11 | 720×1280 9:16); `scripts/build_endcard.py` + `scripts/build_masters.py` are the runnable free |
| 12 | assembly; `scripts/PIPELINE.md` maps every config block to its source step; `scripts/README.md` |
| 13 | documents the assembly. |
| 14 | |
| 15 | ## Run |
| 16 | |
| 17 | This is the **FREE, deterministic** assembly stage — it spends nothing. The paid inputs are |
| 18 | separate capabilities: Beats 1 & 2 (hero rotation + macro push-in) are **`create-video-fal` |
| 19 | image-to-video seeded on a `create-image-fal` styled hero** — a nano-banana restyle of the |
| 20 | brand's REAL product photo onto the seamless studio set, so the product geometry is real and |
| 21 | never AI-invented; Beat 3 (the physics reveal) is a Veo3 image-to-video seeded on Beat 1's last |
| 22 | frame (also `create-video-fal`); the one instrumental bed is `create-music-elevenlabs`. **There |
| 23 | is no Higgsfield / Marketing Studio in this format** — everything paid runs through the |
| 24 | fal-proxy / elevenlabs-proxy so it bills the Ads agent. |
| 25 | |
| 26 | Given those beats + the brand wordmark, this capability: |
| 27 | |
| 28 | 1. `build_endcard.py --bg beat1_last_frame.png --headline "…" --wordmark <wordmark> --out endcard.png` |
| 29 | — the deterministic Beat-4 hyperframe (Playwright 1080×1920 → ffmpeg-scale to 720×1280). |
| 30 | 2. `build_masters.py --config config.json --clips working/clips --endcard endcard.png --music music.mp3 --out master.mp4` |
| 31 | — trims each beat to its window, normalizes to the brand canvas, hard-concats, mixes the bed. |
| 32 | |
| 33 | Re-cuts reuse the existing beats and cost **$0**. |
| 34 | |
| 35 | ## Contract (the free assembly) |
| 36 | |
| 37 | - **Music-only, no VO.** One ElevenLabs instrumental bed carries the film; nobody speaks. Do |
| 38 | not add a spoken voiceover or a second bed. |
| 39 | - **Beat 1's last frame is the shared anchor.** Extract it (`ffmpeg -sseof -0.1 … -frames:v 1`) |
| 40 | once — it seeds the Veo3 Beat 3 AND backs the Beat 4 end-card hyperframe, so the product + |
| 41 | lighting carry across all four beats and the geometry never AI-drifts. |
| 42 | - **End card via Playwright from the real wordmark — never AI-render brand text.** The brand |
| 43 | close is a deterministic hyperframe (Beat 1 last frame + scrim + Playfair headline + the real |
| 44 | wordmark, recolored for contrast). `build_endcard.py` auto-picks a legible headline color from |
| 45 | the bg luminance and renders 1080×1920 then scales to 720×1280. Playfair is loaded from Google |
| 46 | Fonts; bundle the .ttf if determinism offline matters. If the resolvable Playwright wants an |
| 47 | uninstalled browser build, export `PW_CHROME=<installed Chromium binary>` (shoot.js honours it). |
| 48 | - **Normalize each beat to the brand canvas, hard-concat.** Per beat: trim to the window, strip |
| 49 | the i2v model's auto-audio (`-an`), scale + pad to 720×1280 with the brand `bg` pad color, |
| 50 | 24fps, yuv420p, crf 18 → concat demuxer. No dissolves. |
| 51 | - **FFmpeg mix, deterministic, FREE.** Mix one instrumental bed (`afade` in/out + |
| 52 | `loudnorm I=-16 TP=-1.5 LRA=11`, apad + atrimmed to master duration) over the concatenated |
| 53 | beats → a 720×1280 h264+aac master. No paid calls, no keys. |