Skip to content
cccskills
FreePublished on GitHub

render-offer-ad

Create a short vertical offer ad from copy, a real product photo, brand colors, fonts, and timing settings. It renders four animated beats with readable, engine-typeset text, then can produce a square crop for social placements.

OriginalShow the original description

Render a punchy ~12s vertical (9:16) music-only direct-response OFFER ad as a 4-beat kinetic-typography film — HEADLINE slam → real PRODUCT drop → CLAIM/proof → CTA pill — from one config of copy slots, a real product photo, a brand palette, fonts, bpm, and beat split. DETERMINISTIC + FREE (a bundled Remotion project; springs + interpolate, no AI-gen for visuals). Backgrounds are engine gradient divs off the palette, props are inline SVG, the ONLY composited bitmap is the REAL product photo (objectFit:contain, never stretched), and ALL headline/claim/CTA/URL/wordmark text is typeset in the engine — never AI-rendered (the format's credibility guard). A driver binds the config to Remotion input props, renders the 9:16 master, and derives a 1:1 center-crop with ffmpeg. Two gating checks run before render (claim verbs must match the product's physical format; the claim beat needs an edge-entry mechanism prop). Use for the motion-graphics-offer-ad format.

gooseworks-ai/goose-skills1,272 stars(GitHub 1,272 + cccskills 0)
Works withElevenLabs

Run score Not tested

See how to install

Good for

  • Making a vertical product offer ad
  • Creating a square crop from the rendered master
  • Iterating on ad copy and timing from a config

Files included (20)

  • SKILL.md9.7 KB
  • project/.gitignore143 B
  • project/package.json503 B
  • project/public/.gitkeep0 B
  • project/remotion.config.ts116 B
  • project/src/fonts.ts1.4 KB
  • project/src/index.ts108 B
  • project/src/lib/anim.ts4.8 KB
  • project/src/Main.tsx1.5 KB
  • project/src/props.ts4.2 KB
  • project/src/Root.tsx1.0 KB
  • project/src/scenes/Scene01.tsx5.0 KB
  • project/src/scenes/Scene02.tsx4.9 KB
  • project/src/scenes/Scene03.tsx6.5 KB
  • project/src/scenes/Scene04.tsx3.5 KB
  • project/tsconfig.json293 B
  • scripts/config.example.json2.7 KB
  • scripts/render.py11.8 KB
  • skill.meta.json210 B
  • tests/smoke-test.md4.8 KB

SKILL.md (original)

Review the instructions the agent will receive before you install.

render-offer-ad

The free, deterministic renderer for the motion-graphics-offer-ad format — the punchy ~12s vertical, music-only, direct-response offer ad built as a 4-beat kinetic -typography film: a HEADLINE slams in word-by-word → the real PRODUCT drops in → the CLAIM/proof lands → a CTA pill resolves. No character, no VO, no captions — the on-screen typeset text IS the message.

This is a bundled Remotion project (project/) driven by a thin Python driver. The shipping master is 100% engine-rendered (springs + interpolate): backgrounds are gradient divs off the brand_palette, props are inline SVG, and the ONLY composited bitmap is the REAL product photo (objectFit:contain, never stretched). ALL headline/claim/CTA/URL/wordmark text is typeset in the engine — never AI-rendered; that is the format's credibility guard. Rendering is free (no paid calls); the only paid step is an optional music bed, gated upstream in the recipe to create-music-elevenlabs.

The whole ad is data: copy strings, product photo, palette, fonts, bpm, and beat split all arrive as config.json and are bound to Remotion input props — nothing is hardcoded in the scenes (the first build's brand strings are generalised into project/src/props.ts). Deterministic → iterate the cut for free.

Choices

The creative calls are the user's, asked by the format recipe before any paid step; this renderer typesets whatever the config holds.

  • headline_angle — category-killer ("[old way] IS DEAD. the new way ↓"), a straight offer, a bold benefit, a pain-point question, or a before → after → copy.headline_words, copy.subline, copy.motif_chip. The demo used the category-killer angle.
  • music — the bed's mood (lo-fi pop, electronic, hip-hop, indie pop, minimal percussion) → music.prompt for create-music-elevenlabs; the rendered music.bed file is what this renderer mixes. The demo used punchy lo-fi pop at 115 BPM.

The 4-beat structure, palette roles, fonts and gates are the format; palette, product photo, claims and CTA are brand facts.

The 4 beats (the spine)

  1. HEADLINE — primary-color radial ground; headline_words slam in WORD-BY-WORD (slamIn, ~7-frame stagger, scale-overshoot + motion-blur smear, settling on the downbeat); subline + an animated bobbing down-arrow drop in.
  2. PRODUCT — light radial ground; the REAL product photo drops in (dropIn) and idle-bobs (bob), objectFit:contain (never stretch); the motif_chip pops in (popIn); optional GENERIC competitor shape + strike-through (wipe) — never a named competitor.
  3. CLAIM — light radial ground; the mechanism_prop slides in from a frame edge (flyIn overshoot, ~20% from the bottom) to add motion AND show the mechanism; the 3-line claim drops in staggered; product held bottom-right.
  4. CTA — primary-color radial ground; the wordmark slams (slamIn); the CTA pill pops in as the motif-chip handoff resolving (popIn) with an arrow nudge; the cta_url fades up.

Scene boundaries are derived from beat_split_sec (default [3.0, 3.5, 3.0, 2.5]s → cuts at frames 0/90/195/285/360 @30fps) so the hard cuts land on the beat downbeats. The motion kit — slamIn / dropIn / bob / flyIn / popIn / wipe — lives in project/src/lib/anim.ts and is kept intact from the first build.

Two gating checks (run before any render — from the recipe)

  • (a) CLAIM-MATCHES-FORMAT — the claim/proof verbs MUST match the product's physical format: liquid → spoon / sip / drink / 0 mess; powder → scoop / mix / no clumps; capsule → 1 a day; gummy → chew. render.py rejects foreign-format vocabulary (e.g. a liquid product must not borrow powder grammar like scoop / no clumps). Set product_format in the config to arm this gate.
  • (b) CLAIM-BEAT MECHANISM PROP — the claim beat must include an edge-entry mechanism_prop (spoon for drinkable liquids, or accent for a neutral edge-entry accent bar) that supplies motion AND shows the mechanism. A text-only claim beat is too static — render.py rejects an unsupported/missing prop.

Run

# Bind config → Remotion input props, render the 9:16 master, derive the 1:1 crop.
python3 scripts/render.py \
  --config path/to/config.json \
  --work-dir <work> \
  --out <work>/master
# → <work>/master-9x16.mp4  (1080x1920)  and  <work>/master-1x1.mp4  (1080x1080 crop)

render.py copies the config's product_hero_image (+ optional music.bed) into project/public/, maps every config key onto the OfferAdProps shape props.ts reads, writes the input props to <work>/props.json, runs npx remotion render offer-ad --props <work>/props.json, then center-crops the 9:16 master to 1:1 with ffmpeg (no 2nd composition). NO hardcoded /Users or clients paths — every asset arrives via the config and a runtime --work-dir.

Scripts

  • scripts/render.py — the driver: gating checks → stage assets into project/public/ → bind config to Remotion input props → npx remotion render (9:16) → ffmpeg 1:1 center-crop.
  • scripts/config.example.json — the shape of the config the recipe binds (brand-neutral worked defaults from the first build; replace every /abs/... placeholder).
  • project/ — the bundled Remotion project. src/props.ts (the input-props schema + beat-layout math + safe defaults), src/lib/anim.ts (the slamIn/dropIn/bob/flyIn/ popIn/wipe motion kit — kept intact), src/scenes/Scene01–04.tsx (the four beats, all copy/palette/fonts from props), src/Main.tsx (the beat spine + audio bed), src/Root.tsx (the offer-ad composition; duration derived from beat_split_sec).

Config → props mapping (what binds to what)

config keyRemotion prop (props.ts)scene that reads it
product_hero_imageproduct_image (staged to public/)Scene02 (drop), Scene03 (anchor)
brand_palette{primary_ground,light_ground,ink,highlight_chip} (dict OR ≥4-hex list)paletteall 4 (grounds/type/chip)
fonts{display,body}fonts (resolved in fonts.ts)all 4
copy.headline_words[] / copy.sublinecopy.headline_words / copy.sublineScene01
copy.motif_chipcopy.motif_chipScene02
copy.claim_lines[]{big,small}copy.claim_linesScene03
copy.cta_label / copy.cta_url / copy.wordmarksameScene04
mechanism_prop (spoon|accent)mechanism_propScene03 (inline-SVG prop)
bpmbpmbeat grid
beat_split_sec [4]beat_split_secderives cut frames + total duration
music.bed / music.fade_out_framesmusic.src (staged) / music.fade_out_framesMain audio bed
show_competitor_strikeshow_competitor_strikeScene02
aspects(driver)9:16 always; 1:1 = ffmpeg crop

Craft rules (load-bearing — faithful to the first build)

  • The composited bitmap is the REAL product photo — never an AI packshot. Clean / transparent bg; objectFit:contain, never stretched.
  • Never AI-render text. Headline, claim, CTA, URL, wordmark — all typeset in the engine. AI never draws a letter in this format.
  • Never Ken-Burns/zoompan over stills — the engine springs carry the motion; a static/zoompan cut was rejected as "too static" on the first build.
  • Music-only, beat-locked — the cuts + big slams land on the 0.0/3.0/6.5/9.5s downbeats; the bed volume ramps to 0 over the last music.fade_out_frames inside the render. No VO, no captions.
  • Never name/jab a competitor — any comparison shape on the product beat is a GENERIC silhouette (show_competitor_strike), not a named brand.
  • The two gating checks are non-optional — a liquid product must not borrow powder grammar; the claim beat must have real prop motion, not a static text stack.

Requires

  • Node.js (≥18) + Remotion (@remotion/cli ≥4.0, pinned in the bundled project/package.json; the kit provides them, and render.py sets up project/ on first use). This capability legitimately needs a node runtime — the renderer IS a Remotion project.
  • ffmpeg on PATH (for the 1:1 center-crop).
  • watch (QC the final master — confirm the headline slams WORD-BY-WORD on the beat, the real product photo drops in + idle-bobs and is NOT stretched, the mechanism prop enters from a frame edge on the claim beat, the claim lines drop in staggered, the CTA label + URL are readable at 1080×1920, the hard cuts land on the downbeats, and the music ramps out; re-confirm both gating checks visually). The recipe gates the only optional paid step (music bed → create-music-elevenlabs) — this capability itself makes NO paid calls.

Reviews

No reviews yet. Tell others what you thought.

Comments

No login needed. Share how it worked for you, ask a question, or note where it did not run.

No comments yet. Be the first to write one.

Comments are published right away. Do not include personal information such as email addresses or phone numbers. Up to 2 URLs.

0 / 1,000 characters

This form is protected by reCAPTCHA, and the Google Privacy Policy and Terms of Service apply.

More skills from this repository

<slug>

FreeSummary

The supplied material contains only placeholder text for the skill’s purpose, inputs, steps, and completion criteria. It does not provide enough information to describe a task or result reliably.

  • No use case can be identified from the supplied material
  • Purpose is unspecified
  • Inputs and expected results are unspecified
gooseworks-ai/goose-skills1.3KUpdated Oct 27, 2026

ad-angle-miner

FreeSummary

Research supported advertising angles using buyer context, current product facts, customer language, and observed ads. Turn the evidence into static ad, video, or copy ideas, matching video concepts to available recipes. Scores rank ideas for testing; they do not predict results.

  • Finding evidence-backed angles for a product campaign
  • Developing static ad or video concepts from customer research
  • Writing headline and primary-text options for ads
gooseworks-ai/goose-skills1.3KUpdated Oct 27, 2026

Analyze campaign data from Google, Meta, and LinkedIn to find strong and wasteful spend. The skill checks funnel performance and test results, then recommends which campaigns to pause, scale, or test and how to shift budget across channels.

  • Finding campaigns and ads that waste budget
  • Comparing performance across Google, Meta, and LinkedIn
  • Planning specific budget shifts and follow-up tests
gooseworks-ai/goose-skills1.3KUpdated Oct 27, 2026

Compare ad spend and signups with downstream outcomes to calculate the cost of each qualified lead. The skill checks tracking coverage, accounts for how long leads need to mature, and groups creatives into actionable categories with confidence notes.

  • Compare true qualified-lead costs across creatives
  • Find low-CPA ads that bring poor-quality leads
  • Check whether signups can be linked to downstream outcomes
gooseworks-ai/goose-skills1.3KUpdated Oct 27, 2026

Prepare the intake for a Meta ad campaign by reviewing available brand information first, stating reasonable assumptions, and asking only questions whose answers could affect budget, claims, or legal exposure. It records stable brand facts, a campaign brief, and what was asked versus assumed.

  • Prepare a Meta ad campaign when brand facts are missing
  • Clarify budget and timing before campaign planning
  • Record approved claims and audience restrictions
gooseworks-ai/goose-skills1.3KUpdated Oct 27, 2026

ad-policy-check

FreeSummary

Review ad copy, image text, visuals, and people against platform and brand category rules. It suggests honest fixes and needed disclosures, then flags issues requiring human or legal review, with a separate result for each ad and platform.

  • Checking ad copy and visuals before launch
  • Reviewing creator ads for required disclosures
  • Fixing a platform disapproval and recording the issue
gooseworks-ai/goose-skills1.3KUpdated Oct 27, 2026

See all skills by gooseworks-ai

Report a problem with this skill