render-mosaic-grid-reveal
Render the mosaic-grid-reveal format from a config. The signature of this format is a
full-bleed N×N mosaic (default 3×3) of the brand's real product stills that pops in
one tile at a time (scatter order, ease-out-back "pop"), building the whole grid; the grid
then clears (scale-up + fade) and a clean end card builds line-by-line — the brand's
real wordmark, then a small sub-label, then the tagline, then a CTA. Silent by design (a
light music bed is muxed separately via create-music-elevenlabs). The hook is RANGE — nine
maximally-distinct variants show how much choice the brand offers.
Everything is a real-DOM HTML scene frame-stepped to PNG via Playwright and encoded with
FFmpeg, so the wordmark, tile captions, and CTA stay pixel-crisp (a video model would
smear them). No generative video, no i2v, no AI-rendered text. This capability is FREE and
deterministic — the only paid step of the format (the music bed) is a separate media cap.
Inputs (config.json)
width, height, fps — canvas + frame rate (default 1080×1920, 30).
wordmark — brand logo SVG (full <svg> or bare <path> markup) or PNG path. Real DOM,
recolored via palette.ink. Never AI-render it. wordmark_viewbox, wordmark_width tune it.
palette — bg (warm off-white), accent + accent_deep (brand color), ink, cap.
grid — cols/rows (default 3×3), inset (outer margin), gap.
tiles — one per cell (length must equal cols*rows): image (real variant still),
name (caption), bg (soft pastel echoing the variant), ink (deep caption color).
pop_order — scatter order across cells (default corners → center → edges).
timing — grid_in0, cadence, pop, hold, clear (seconds).
end_card — sub, tagline_top, tagline_bottom (bold), cta, url. Brand's own approved copy only.
eyebrow — optional top kicker held during the grid.
scripts/config.example.json is a filled example (the Pair Eyewear "RANGE" worked example);
the tile image/wordmark paths are brand inputs bound by the orchestrator at remix time.
Run
python3 scripts/build_html.py --config config.json --out hyperframe.html # emits scene, writes duration_sec back
python3 scripts/render.py --config config.json --html hyperframe.html --out master-silent.mp4
build_html.py computes the full timeline and writes duration_sec back into the config so
render.py (which reads dims/fps/duration from the config) frame-steps window.renderAt(t)
at fps and FFmpeg-encodes the silent master. Then mux the create-music-elevenlabs bed:
ffmpeg -i master-silent.mp4 -i bed.wav -map 0:v:0 -map 1:a:0 -c:v copy -c:a aac -shortest out.mp4.
Rules
- FILL the frame — tiles are full-bleed and edge-to-edge, NOT small cards floating in an
empty margin. Tiles pop in one at a time (scatter order), never all-at-once or static.
- Real wordmark + real product stills only. Never AI-render the logo or text.
- Copy slots are the brand's own approved lines — never invent claims, customers, results,
prices, or shipping speed.
- Pick the 9 most DISTINCT variants (color-wheel spread) — that IS the RANGE hook.
1---
2name: render-mosaic-grid-reveal
3description: Render a 'mosaic-grid-reveal' video from a config — a real-DOM FULL-BLEED N×N mosaic of real product tiles that pops in one tile at a time (scatter order, ease-out-back overshoot), the grid clears, then the brand wordmark builds line-by-line followed by a sub-label, tagline, and CTA; frame-stepped via Playwright and encoded with FFmpeg — deterministic assembly, FREE (the music bed comes from create-music-elevenlabs), so the wordmark, tile captions, and CTA stay pixel-crisp. Use for the mosaic-grid-reveal format.
4status: active
5---
6
7# render-mosaic-grid-reveal
8
9Render the `mosaic-grid-reveal` format from a config. The signature of this format is a
10**full-bleed N×N mosaic** (default 3×3) of the brand's real product stills that **pops in
11one tile at a time** (scatter order, ease-out-back "pop"), building the whole grid; the grid
12then **clears** (scale-up + fade) and a clean end card **builds line-by-line** — the brand's
13real wordmark, then a small sub-label, then the tagline, then a CTA. Silent by design (a
14light music bed is muxed separately via `create-music-elevenlabs`). The hook is RANGE — nine
15maximally-distinct variants show how much choice the brand offers.
16
17Everything is a real-DOM HTML scene **frame-stepped** to PNG via Playwright and encoded with
18FFmpeg, so the wordmark, tile captions, and CTA stay **pixel-crisp** (a video model would
19smear them). No generative video, no i2v, no AI-rendered text. This capability is **FREE and
20deterministic** — the only paid step of the format (the music bed) is a separate media cap.
21
22## Inputs (`config.json`)
23
24- `width`, `height`, `fps` — canvas + frame rate (default 1080×1920, 30).
25- `wordmark` — brand logo SVG (full `<svg>` or bare `<path>` markup) or PNG path. Real DOM,
26 recolored via `palette.ink`. Never AI-render it. `wordmark_viewbox`, `wordmark_width` tune it.
27- `palette` — `bg` (warm off-white), `accent` + `accent_deep` (brand color), `ink`, `cap`.
28- `grid` — `cols`/`rows` (default 3×3), `inset` (outer margin), `gap`.
29- `tiles` — one per cell (length must equal `cols*rows`): `image` (real variant still),
30 `name` (caption), `bg` (soft pastel echoing the variant), `ink` (deep caption color).
31- `pop_order` — scatter order across cells (default corners → center → edges).
32- `timing` — `grid_in0`, `cadence`, `pop`, `hold`, `clear` (seconds).
33- `end_card` — `sub`, `tagline_top`, `tagline_bottom` (bold), `cta`, `url`. Brand's own approved copy only.
34- `eyebrow` — optional top kicker held during the grid.
35
36`scripts/config.example.json` is a filled example (the Pair Eyewear "RANGE" worked example);
37the tile `image`/`wordmark` paths are brand inputs bound by the orchestrator at remix time.
38
39## Run
40
41```bash
42python3 scripts/build_html.py --config config.json --out hyperframe.html # emits scene, writes duration_sec back
43python3 scripts/render.py --config config.json --html hyperframe.html --out master-silent.mp4
44```
45
46`build_html.py` computes the full timeline and writes `duration_sec` back into the config so
47`render.py` (which reads dims/fps/duration from the config) frame-steps `window.renderAt(t)`
48at `fps` and FFmpeg-encodes the silent master. Then mux the `create-music-elevenlabs` bed:
49`ffmpeg -i master-silent.mp4 -i bed.wav -map 0:v:0 -map 1:a:0 -c:v copy -c:a aac -shortest out.mp4`.
50
51## Rules
52
53- FILL the frame — tiles are full-bleed and edge-to-edge, NOT small cards floating in an
54 empty margin. Tiles pop in one at a time (scatter order), never all-at-once or static.
55- Real wordmark + real product stills only. Never AI-render the logo or text.
56- Copy slots are the brand's own approved lines — never invent claims, customers, results,
57 prices, or shipping speed.
58- Pick the 9 most DISTINCT variants (color-wheel spread) — that IS the RANGE hook.