create-image-fal
Generate or edit an image via any FAL image model (nano-banana edit, gpt-image, flux, ...), ROUTED THROUGH THE fal-proxy so it bills the Ads agent. image_urls…
Assemble a glossy 3D-character animated-explainer video ad (~77s, 9:16) built on an "N types of X" listicle spine — a recurring human protagonist plus a locked cast of N persona characters, one per list item. Given the per-scene i2v clips + a per-scene target-duration table + a
$ npx -y skills add gooseworks-ai/goose-skills --skill render-3d-character-explainer --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/render-3d-character-explainerContext preview
The summary Claude sees to decide when to auto-load this skill.
Assemble a glossy 3D-character animated-explainer video ad (~77s, 9:16) built on an "N types of X" listicle spine — a recurring human protagonist plus a locked cast of N persona characters, one per list item. Given the per-scene i2v clips + a per-scene target-duration table + a
name: render-3d-character-explainer description: Assemble a glossy 3D-character animated-explainer video ad (~77s, 9:16) built on an "N types of X" listicle spine — a recurring human protagonist plus a locked cast of N persona characters, one per list item. Given the per-scene i2v clips + a per-scene target-duration table + a narration track, it trims each clip to its scene window, re-encodes every segment to identical 1080x1920/30fps/libx264/yuv420p (decrease+pad, never crop) so the concat demuxer never drops frames, concats, and muxes audio — in RESTYLE mode the source ad's VO+music mix is reused verbatim, in ORIGINAL mode fresh per-scene VO (loudnorm I=-14) is mixed under an optional music bed (loudnorm I=-26). A static-still fallback loops a scene's keyframe when its clip is missing/failed, so the master always assembles; libass captions are burned last. FREE deterministic assembly (Python + ffmpeg, no bash, no paid calls); the recipe supplies the clips, keyframes, VO or source audio, and caption table and gates the paid cast-anchor/keyframe/Kling-i2v/VO/music calls to their own capabilities. Use for the 3d-character-explainer listicle format. status: active
The free, deterministic renderer for the **3d-character-explainer** video ad format — the glossy Pixar-style 3D spot built on an **"N types of X" listicle** spine, where a recurring human protagonist plus a locked cast of **N persona characters (one per list item)** carry a hook → "deeper story" → cast-reveal → one beat per list item → kicker → product test → relieved payoff. This capability is the **FREE assembly stage only**. All generative work (Nano-Banana cast anchors + per-scene keyframes, Kling-V3 i2v clips, ElevenLabs VO + music, or a source ad's audio reused verbatim) happens upstream in the recipe and is handed to this capability as files.
It ports the validated compose recipe from the Bristle "Six Types" restyle run (`_render_full.sh` — per-scene trim → normalize 1080×1920/fps30 → concat -c copy → mux the source audio, with a static-still fallback on any failed clip). The assembly is deterministic — iterate the cut for free, re-roll only the offending paid beat.
ad, beat for beat, as 3D character comedy. The source ad's **audio mix (VO + music bed) is reused VERBATIM** (`source_audio`), and the per-scene `target_sec` table is inherited from the source's scene timing. No new VO or music is rendered. The trims must sum to the source audio length.
carries a measured VO cue (`scenes[].vo`, `target_sec` = the ffprobe'd VO duration) which is concatenated into a VO track (loudnorm I=-14) and optionally mixed under a `music_bed` (loudnorm I=-26 then `volume`, `amix normalize=0`).
1. **Per-scene retime.** Each i2v clip is trimmed to its scene `target_sec` and normalized to identical dims/fps/SAR (`scale=W:H:force_original_aspect_ratio=decrease,pad=W:H:(ow-iw)/2:(oh-ih)/2:color=<pad>,fps=30,setsar=1`). A clip **shorter** than its window is extended with `tpad=stop_mode=clone`; a longer one is `-t` trimmed. Decrease+pad (never crop) preserves the full 9:16 keyframe framing. 2. **Static-still fallback.** For any scene whose `clip` is missing or failed to render, the scene's `keyframe` PNG is looped (`-loop 1`) for `target_sec`, so the master always assembles. Fallback scenes are printed at the end. 3. **Identical re-encode + concat.** Every segment is re-encoded `libx264 -crf 18 -pix_fmt yuv420p -r 30` even if already correct — a dims/framerate mismatch makes the concat demuxer silently drop frames — then concatenated via the concat demuxer (`-c copy`). 4. **Audio.** Restyle: `source_audio` muxed verbatim (`-map 0:v -map 1:a`), clamped to the video length. Original: per-scene VO track (optional `atempo`, `apad`, `-t` clamp) → loudnorm → optionally mixed under the music bed. 5. **Captions last.** `make_captions.py` emits a libass `.ass` (one cue per scene, `start = scene_start + 0.08s`, suppressed on any scene with no caption — e.g. a product/end-card beat carrying its own typeset copy). `compose.py` burns it as the final filter so captions sit on top. Word-level energy-pop captions (Whisper on the narration) are the recipe's upstream option — produce that `.ass` externally and point `captions_ass` at it; compose burns whatever `.ass` it's handed.
compose reads, so caption windows stay in lockstep with the cut. Run before `compose.py` (or leave `captions_ass` unset / pointing at nothing to skip captions).
(static-still fallback on missing clips) → concat → audio (restyle verbatim / original mix) → burn captions → master mp4.
brand-neutralised "Six Types" restyle values as a worked reference).
`config.json` carries: `audio_mode` (`restyle` | `original`), `scenes[]` (each `{id, clip, keyframe, target_sec, caption?, vo?, atempo?}` where `target_sec` is the source-inherited window in restyle mode or the **measured** VO window in original mode, and `keyframe` is the static-still fallback source), `source_audio` (restyle), `music_bed` + `music_volume` + `atempo` (original), `width`/`height` (default 1080×1920), `pad_color` (letterbox colour), `captions_ass`, and `caption_style`. See `config.example.json`.
Put your AI agent on the growth team. Research customers and competitors, analyze what is working, create the next campaign, and learn from the result.
Repo: gooseworks-ai/goose-skills
Generate or edit an image via any FAL image model (nano-banana edit, gpt-image, flux, ...), ROUTED THROUGH THE fal-proxy so it bills the Ads agent. image_urls…
Generate a single photoreal or designed image with OpenAI gpt-image via fal.ai. Supports gpt-image-1 (default, fixed sizes — the FAL fallback for Higgsfield's…
Generate an instrumental music bed via ElevenLabs Music, ROUTED THROUGH THE elevenlabs-proxy so it bills the Ads agent. Trims any sparse intro, loudnorm, fades…
Image-to-video (or text-to-video) via any FAL video model (Kling, Seedance, Veo), ROUTED THROUGH THE GooseWorks fal-proxy so the call bills the Ads agent. The…
Generate a voiceover (VO) clip via ElevenLabs text-to-speech, ROUTED THROUGH THE elevenlabs-proxy so it bills the Ads agent. Voice id + script text come from…
Scrape competitor ads from Google Ads by domain. Returns ad creatives, formats, and campaign details. Use for competitive ad research and messaging analysis.