brutalist-product-promo
Installation
SKILL.md
Brutalist product promo
This template produces a 22.64 s, 25 fps, 720×1280 promo made of 21 hard-cut scenes. It is driven entirely by a JSON brief: copy, colours, image prompts and scene timing. Every frame is a pure function of time, so you can review any single frame before rendering the full video.
Preview: examples/arc/contact_sheet.png. A second example, examples/prismor/, applies the style to software (Prismor, electric violet, a key, a padlock sprite and a server rack instead of a robot) and shows the brand's real logo beside the wordmark via meta.logo. The storyboard with per-scene timing and purpose is in references/storyboard.md.
Requirements
- Python 3.9+ with
numpyandPillow, plusffmpegon PATH. Fonts are bundled. - Optional:
OPENAI_API_KEYfor generating the six product images with gpt-image-2. Without it, placeholders are used so the pipeline still runs.
Workflow
- Brief. Copy
examples/arc/brief.jsonto a new working folder asbrief.json, then rewrite thecopy,themeandassetsprompts for the user's product. Keep copy short: these are labels, not sentences. Field rules are inreferences/brief.md. Ask the user only for things you can't infer (brand name, product, accent colour). Invent plausible spec lines if none are given, and say that you did. - Validate. Run
python3 scripts/promo.py check --brief path/to/brief.json. It reports missing copy keys, missing assets and weak contrast. - Images. Run
python3 scripts/promo.py assets --brief path/to/brief.json. This generates any missing slots into<brief dir>/assets/with gpt-image-2. Keepqualityatlowormedium: frames are 720 px and heavily processed, sohighis wasted spend. Regenerate one slot withassets <name> --force. - Review stills. Run
python3 scripts/promo.py still --brief … 3.4 7.9 11.3 16.9and look at the PNGs in<brief dir>/out/. For the whole cut, usesheet. Check the hero targeting box: adjustmeta.hero_target(fractions of the hero image) so it sits on the product's key detail. - Render. Run
python3 scripts/promo.py render --brief … [--audio track.mp3]to produce<brief dir>/out/promo.mp4. A render takes about 1 min on 2 cores.