Render a designed 'value prop' video from a config — 3-5 noun-phrase benefit claims (<=4 words each) revealed sequentially over per-SKU product visuals, one crisp editorial frame per claim (hook sticker -> N claim beats -> brand end card). Deterministic PIL/HTML beat renderer frame-stepped via Playwright and encoded with FFmpeg, sound-off legible, hard cuts, uniform pacing. FREE (no paid calls); music is added separately (create-music-elevenlabs). Use for the value-prop format.
60
75%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Low
Low-risk findings worth noting
Fix and improve this skill with Tessl
tessl review fix ./skills/ads/capabilities/render-value-prop/SKILL.mdRender a designed 'value prop' video from a config: a hook sticker, then one beat per short noun-phrase benefit claim (<=4 words each — "Drug-Free", "Zero Sugar", "NSF Certified"), each pairing the claim headline with a per-SKU product visual (the hero SKU rotates beat to beat so the eye anchor shifts), then a brand-wordmark end card. Text + product carry the spot — no narration, no talking head — and it is built to be legible sound-off. Every beat is a pure function of beat-local time t (deterministic PIL start frames + Playwright hyperframes + FFmpeg); no CSS keyframes, no setTimeout. FREE (no paid calls); music is a separate capability (create-music-elevenlabs), or ship silent for $0.
render_master.py --config config.json --project <dir> -> <dir>/finals/master-clean.mp4 (silent),
1080x1920, deterministic, $0. The renderer is fully config-driven — palette, copy, SKUs,
pacing, hook, logo and end card all come from config.json (schema = ad_sample.recipe.config;
see config.example.json). Nothing is hardcoded to one brand. build_storyboard_preview.py is an
optional free preview gallery for the gate; build_text_overlays.py is optional (transparent
text-zone PNGs for compositing claims over a motion clip). Both preview scripts take their ink,
background, brand name and logo from shot-list.yml project: or the project's config.json
(neutral fallbacks otherwise). shared/beat-templates/ are reference layouts with placeholder copy;
the renderer does not read them.
The value-prop recipe asks these of the user; this capability renders whatever the config says.
music — the bed under the claims, or silent (sets music_brief, consumed by
create-music-elevenlabs, not this renderer). Asked of the user; the demo used calm ambient
sleep music.background — what the claims sit on (sets palette.bg). Asked of the user; the demo used
white with a navy headline. palette.ink comes from the brand kit.Environment: run with a Python that has Playwright (override the frame-render interpreter with
RENDER_PYTHON); ffmpeg is auto-discovered (FFMPEG env > PATH > common prefixes). The frame
renderer render_hyperframe.py is bundled in scripts/ — no external atom to fetch.
palette.ink color on palette.bg;
the per-beat accent color (from value_props[].accent — a SKU-accent slug or a hex) is the
accent rule, not the headline.palette.bg to the product image's
background color for seamless compositing (free — avoids a paid background-removal step).config.logo; otherwise it
falls back to a typographic brand_name wordmark (many brands ship only a favicon).cc3e518
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.