Install in seconds
Install this skill
Copy the command and run it in your terminal. You can review the source before installing.
terminal
git clone https://github.com/gooseworks-ai/goose-skills

Works with Git. The repository opens in your current directory.

🎬
AutomationPython

Render AirDrop Carousel

by gooseworks-ai

Assembles a viral iOS AirDrop notification-carousel video ad from a brand line and real product photos using deterministic rendering (DOM to PNG, chroma-key, FFmpeg animation). Ideal for creating crisp, realistic AirDrop-style ads without AI-generated visuals.

1.1K stars194 forksAdded 2026/07/20
claudeclaude-skillsclaudecodeclaudecode-skillscodexcursorgtmskills

Documentation

README

The free, deterministic renderer for the airdrop-notification-carousel video ad format β€” the viral iOS "AirDrop" trend where a native share-sheet card ("Brand would like to share a candle Β· Decline / Accept") springs up on the phone and its preview window flips through a carousel of real product photos, landing on a range/lineup payoff with an Accept tap.

This is a DETERMINISTIC composite β€” no generative video, no AI-rendered product. A real-DOM AirDrop card is rendered once to PNG (headless Chrome), chroma-keyed, and its preview window is refilled per-product in PIL, then animated + audio-synthed with FFmpeg. The whole point of the format is crisp system-UI text and real product photography, both of which a video model would smear. This capability makes no paid calls; the recipe gates the only optional paid step β€” generating a hero product shot when the brand has NO usable photo at all (β†’ create-image-fal).

Default output β‰ˆ 6–8s, 1080Γ—1920, h264 + aac. Duration is DERIVED, not trimmed β€” first_hold + (N-1)Β·per + final_hold. Add images or raise per to lengthen.

Scripts (free)

  • scripts/build_card.py β€” brand params β†’ chrome.html + chrome-pressed.html: the AirDrop card on a green page (#00e000) with a magenta preview window (#ff00ff) and a solid brand band (wordmark SVG or text + tagline). Real DOM text β€” AirDrop, Decline, Accept, and the brand line are DOM/SVG, never AI-rendered.
  • scripts/one_shot.py β€” glue: build_card β†’ headless-Chrome (Playwright) fullPage screenshot of both card states β†’ compose_carousel. One --config, one MP4.
  • scripts/compose_carousel.py β€” the render engine: green-key the card β†’ detect the magenta window β†’ fill it per-product (cover-crop) β†’ blurred per-product backdrop + push-in β†’ card spring-up (iOS ease-out-back) + carousel + Accept tap β†’ synth audio (whoosh on entry, chime on land, a tick per swap, a pop on the tap) β†’ encode h264+aac.
  • scripts/config.example.json β€” the shape of the brand config the recipe binds (brand-neutral worked defaults; replace every /abs/path/... placeholder).

Chroma contract (load-bearing β€” build_card.py and compose_carousel.py MUST share it)

#00e000 green = page background, keyed to the card's alpha. #ff00ff magenta = preview window, replaced per product. Neither color may appear in the card art or any product photo β€” a product image containing near-pure green or magenta gets keyed/misread. Swap the image or tighten the window_mask thresholds if it bleeds.

Craft rules (faithful to the source molecule)

  • Real product photos only. The format's credibility is that these look like real AirDropped items β€” no AI-generated products in the carousel.
  • Never AI-render text β€” the card UI, wordmark, and band are DOM/SVG composited so they stay pixel-crisp. Cover-crop the window; white-bg PDP shots reading as "product in a white tile" is on-brand and fine.
  • 6–16 images, ordered; end on the range β€” the payoff (final_image) should read as "the whole line" (lineup / family / all-shades).
  • Hard cuts on rhythm, a tick per swap β€” do NOT crossfade.
  • Never invent proof β€” a 1M+ sold tagline must be the brand's OWN stated figure, not filled from a brand-kit proof section.
  • Duration is derived, not trimmed β€” add images or raise per; never cut the audio.

Requires

  • Python 3 with numpy + Pillow, and ffmpeg/ffprobe on PATH.
  • Playwright chromium for the screenshot step (pip install playwright && playwright install chromium). If Playwright is unavailable, run build_card.py, screenshot chrome.html / chrome-pressed.html (fullPage) β†’ chrome-green.png / chrome-green-pressed.png via the chrome-devtools MCP, then call compose_carousel.py directly.
  • watch (QC the final master). The recipe gates create-image-fal (optional hero shot when the brand has NO usable product photo) β€” the only paid, proxy-routed step.

More from gooseworks-ai

Other Claude Code skills by this author in the directory.