render-ig-live-gallery
Render the ig-live-gallery format from a config. Each of the brand's REAL hero product
stills is presented as the "live video" inside an authentic Instagram-Live card — dark
gradient scrims top & bottom over the bright product, an IG gradient-ring avatar + username +
verified check + red LIVE badge + viewer count + close X across the top, a short live-comment
feed + an EMPTY "Add a comment…" bar + heart/share icons across the bottom, and pink/red
reaction hearts floating up the right edge. A benefit sentence builds one short phrase per
slide as the top overlay, and it closes on a clean brand logo card with the payoff line + CTA.
Deterministic and FREE — no generative image/video, no AI-rendered text. The paid music bed is
a separate capability (create-music-elevenlabs) muxed on afterward.
Run
python3 scripts/build.py --config config.json --assets <stills-dir> --out master-silent.mp4
# quick check — one frame per slide:
python3 scripts/build.py --config config.json --assets <stills-dir> --stills <dir>
config.example.json is a full worked config (Glossier). Config shape:
username, verified, palette, slide_dur, endcard_dur, crossfade
slides[] — { image, phrase, viewers, comments: [[handle, text], …] } per product
endcard — { logo, logo_is_white, payoff, handle, cta }
music — { prompt, length_ms, trim_intro_sec } (consumed by create-music-elevenlabs)
Image paths in the config resolve against --assets.
Craft rules (baked into the renderer)
- Center each product on its TOP-HALF silhouette, never the full non-white bbox — the base
drop-shadow otherwise inflates the box and the product reads shifted sideways. The renderer
measures the top 50% of the silhouette with an
L<246 threshold (catches white-product edge
shading too) and centers that midpoint.
- Reaction hearts float up the right edge as a full column and may overlap the centered
product — that's fine; don't shrink them to a thin edge ribbon.
- Comments must be claim-free brand-descriptor vibe (2-3 words, generic handles, NO emoji —
PIL can't render color emoji); the comment INPUT bar stays empty. LIVE badge + viewer count +
hearts are ambient live-stream chrome, not proof claims.
- Endcard is the clean logo card (bg + wordmark + @handle + CTA + payoff), never a model face.
- Real product stills + real wordmark only. Music bed only, no VO.
Output
A silent WxH (default 1080x1920) H.264 master. Generate + mux the create-music-elevenlabs
bed with a short fade in/out + loudnorm (-map 0:v:0 -map 1:a:0), then QC with watch.
1---2name: render-ig-live-gallery3description: Render an 'Instagram-Live social-proof gallery' video from a config — ~5 real brand product stills each framed as an Instagram-LIVE card (IG gradient-ring avatar, username, verified check, red LIVE badge, viewer count, close X, a short claim-free live-comment feed, an empty 'Add a comment…' bar, and reaction hearts floating up the right edge), with a brand-approved benefit sentence building one phrase per slide and a clean logo endcard, rendered deterministically with PIL frames plus FFmpeg — FREE (the music bed comes from create-music-elevenlabs), products and wordmark stay crisp. Use for the ig-live-gallery format.4---5
6# render-ig-live-gallery
7
8Render the **ig-live-gallery** format from a config. Each of the brand's REAL hero product
9stills is presented as the "live video" inside an authentic Instagram-Live card — dark
10gradient scrims top & bottom over the bright product, an IG gradient-ring avatar + username +
11verified check + red LIVE badge + viewer count + close X across the top, a short live-comment
12feed + an EMPTY "Add a comment…" bar + heart/share icons across the bottom, and pink/red
13reaction hearts floating up the right edge. A benefit sentence builds one short phrase per
14slide as the top overlay, and it closes on a clean brand logo card with the payoff line + CTA.
15
16Deterministic and FREE — no generative image/video, no AI-rendered text. The paid music bed is
17a separate capability (`create-music-elevenlabs`) muxed on afterward.
18
19## Run
20
21```bash
22python3 scripts/build.py --config config.json --assets <stills-dir> --out master-silent.mp4
23# quick check — one frame per slide:
24python3 scripts/build.py --config config.json --assets <stills-dir> --stills <dir>
25```
26
27`config.example.json` is a full worked config (Glossier). Config shape:
28
29- `username`, `verified`, `palette`, `slide_dur`, `endcard_dur`, `crossfade`
30- `slides[]` — `{ image, phrase, viewers, comments: [[handle, text], …] }` per product
31- `endcard` — `{ logo, logo_is_white, payoff, handle, cta }`
32- `music` — `{ prompt, length_ms, trim_intro_sec }` (consumed by `create-music-elevenlabs`)
33
34Image paths in the config resolve against `--assets`.
35
36## Craft rules (baked into the renderer)
37
38- **Center each product on its TOP-HALF silhouette**, never the full non-white bbox — the base
39 drop-shadow otherwise inflates the box and the product reads shifted sideways. The renderer
40 measures the top 50% of the silhouette with an `L<246` threshold (catches white-product edge
41 shading too) and centers that midpoint.
42- **Reaction hearts float up the right edge as a full column** and may overlap the centered
43 product — that's fine; don't shrink them to a thin edge ribbon.
44- **Comments must be claim-free brand-descriptor vibe** (2-3 words, generic handles, NO emoji —
45 PIL can't render color emoji); the comment INPUT bar stays empty. LIVE badge + viewer count +
46 hearts are ambient live-stream chrome, not proof claims.
47- **Endcard is the clean logo card** (bg + wordmark + @handle + CTA + payoff), never a model face.
48- Real product stills + real wordmark only. Music bed only, no VO.
49
50## Output
51
52A silent `WxH` (default 1080x1920) H.264 master. Generate + mux the `create-music-elevenlabs`
53bed with a short fade in/out + loudnorm (`-map 0:v:0 -map 1:a:0`), then QC with `watch`.