{"id":"render-3d-product-showcase","name":"render-3d-product-showcase","summary":"構成からプレミアム3D製品ショーケース広告を組み立てます — 4つのビートクリップ(軌道ヒーローの回転、マクロの押し込み、物理演算の公開、タイポグラフィのクローズ)をブランドカラーキャンバスに正規化し、順番に硬く連結し、決定論的なPlaywrightブランドのエンドカードで閉じ、1つで混ぜ合わせます...","body":"# render-3d-product-showcase\n\nAssemble a premium **3D product-showcase** ad from a config: one real product floats centered\non a clean seamless brand-color backdrop and sells itself across four beats — an orbiting hero\nrotation, a macro push-in on the surface detail, a physics reveal (`exploded_view` /\n`particle_disintegration` / `liquid_splash`, or `rotation_only`), then a typographic brand\nclose. This capability is the **FREE, deterministic assembly** that stitches the delivered\nbeats into the master; it spends nothing.\n\n`scripts/config.example.json` is the worked example (DIBS Beauty \"Desert Island Duo\", ~15s\n720×1280 9:16); `scripts/build_endcard.py` + `scripts/build_masters.py` are the runnable free\nassembly; `scripts/PIPELINE.md` maps every config block to its source step; `scripts/README.md`\ndocuments the assembly.\n\n## Run\n\nThis is the **FREE, deterministic** assembly stage — it spends nothing. The paid inputs are\nseparate capabilities: Beats 1 & 2 (hero rotation + macro push-in) are **`create-video-fal`\nimage-to-video seeded on a `create-image-fal` styled hero** — a nano-banana restyle of the\nbrand's REAL product photo onto the seamless studio set, so the product geometry is real and\nnever AI-invented; Beat 3 (the physics reveal) is a Veo3 image-to-video seeded on Beat 1's last\nframe (also `create-video-fal`); the one instrumental bed is `create-music-elevenlabs`. **There\nis no Higgsfield / Marketing Studio in this format** — everything paid runs through the\nfal-proxy / elevenlabs-proxy so it bills the Ads agent.\n\nGiven those beats + the brand wordmark, this capability:\n\n1. `build_endcard.py --bg beat1_last_frame.png --headline \"…\" --wordmark <wordmark> --out endcard.png`\n   — the deterministic Beat-4 hyperframe (Playwright 1080×1920 → ffmpeg-scale to 720×1280).\n2. `build_masters.py --config config.json --clips working/clips --endcard endcard.png --music music.mp3 --out master.mp4`\n   — trims each beat to its window, normalizes to the brand canvas, hard-concats, mixes the bed.\n\nRe-cuts reuse the existing beats and cost **$0**.\n\n## Contract (the free assembly)\n\n- **Music-only, no VO.** One ElevenLabs instrumental bed carries the film; nobody speaks. Do\n  not add a spoken voiceover or a second bed.\n- **Beat 1's last frame is the shared anchor.** Extract it (`ffmpeg -sseof -0.1 … -frames:v 1`)\n  once — it seeds the Veo3 Beat 3 AND backs the Beat 4 end-card hyperframe, so the product +\n  lighting carry across all four beats and the geometry never AI-drifts.\n- **End card via Playwright from the real wordmark — never AI-render brand text.** The brand\n  close is a deterministic hyperframe (Beat 1 last frame + scrim + Playfair headline + the real\n  wordmark, recolored for contrast). `build_endcard.py` auto-picks a legible headline color from\n  the bg luminance and renders 1080×1920 then scales to 720×1280. Playfair is loaded from Google\n  Fonts; bundle the .ttf if determinism offline matters. If the resolvable Playwright wants an\n  uninstalled browser build, export `PW_CHROME=<installed Chromium binary>` (shoot.js honours it).\n- **Normalize each beat to the brand canvas, hard-concat.** Per beat: trim to the window, strip\n  the i2v model's auto-audio (`-an`), scale + pad to 720×1280 with the brand `bg` pad color,\n  24fps, yuv420p, crf 18 → concat demuxer. No dissolves.\n- **FFmpeg mix, deterministic, FREE.** Mix one instrumental bed (`afade` in/out +\n  `loudnorm I=-16 TP=-1.5 LRA=11`, apad + atrimmed to master duration) over the concatenated\n  beats → a 720×1280 h264+aac master. No paid calls, no keys.","author":"@gooseworks-ai","ownerProfile":null,"authorContacts":null,"sourceUrl":"https://github.com/gooseworks-ai/goose-skills/tree/main/skills/ads/capabilities/render-3d-product-showcase","license":"MIT","category":"devops","lang":"en","tokens":952,"stars":0,"calls30d":2,"claimed":false,"visibility":"public","origin":"crawler","version":"0.1.0","createdAt":"2026-08-22","updatedAt":"2026-08-22","files":[{"path":"scripts/build_endcard.py","size":5663,"sha256":"a1f68a04441dc50a748f4feb7e9a3dc031f81ec44fc4fc3278bd26e5c2edaecb"},{"path":"scripts/build_masters.py","size":4875,"sha256":"fbb90f71d83b8368fc165cf837b80c2e9b497994d00856adf0990f02b13543fa"},{"path":"scripts/config.example.json","size":10335,"sha256":"34af700d1bbd65033c42a4c88d42f2a9789d11e96dac5812f09384916acd6081"},{"path":"scripts/PIPELINE.md","size":5073,"sha256":"f31288d4c6dffa86a806756423dcf020ead0142ca69c9813da2a76412f3cbec4"},{"path":"scripts/README.md","size":3836,"sha256":"4fabddbf517a025a5ae897619811031aa3e37071324213a93a61fde81681b85c"},{"path":"scripts/shoot.js","size":1189,"sha256":"0b95525208b04335a2b9c0b6ff604273fbd81bfeb34085c48cfc314b79dec330"},{"path":"skill.meta.json","size":329,"sha256":"0ef14e556db41ccda467104682647968416bca7c385053ffb3c404c9278079c5"},{"path":"tests/smoke-test.md","size":1112,"sha256":"b0fdfa75435f02c12cc7ed6c91607b4d9d5f6bfe797c3f41213522638f184880"}],"requires":{"mcp":[],"tools":[]},"safety":{"flags":[{"code":"net.endpoints","kind":"exfiltration","excerpt":"www.dibsbeauty.com","message":"bundled scripts reach 1 external host(s)","severity":"warn"}],"scannedAt":"2026-08-22","hasScripts":true,"networkEndpoints":["www.dibsbeauty.com"]}}