carousel-builder
Produce a finished, renderable carousel: on-brand copy + real PNG slides. Default
output: English. Text is rendered as crisp HTML/CSS (never baked into an image
model, which mangles paragraph text); imagery is the optional background layer.
Reference: carousel mechanics §10, ABC §3, JSON prompting §12 in
../social-content-os/reference/frameworks.md. Load ../social-content-os/brand.json.
Inputs
- Topic, script, or the winning hook (from hook-lab).
- Slide count (default 8; range 7–10).
- Platform (IG default). Whether to generate background imagery (default yes).
Build steps
- Structure the deck (ABC across slides):
- Slide 1 — Scroll-Stop (hook, dark theme): the hook on a specific pain
point. Highest visual energy.
- Middle — Tension & Value: one idea per slide, numbered. Alternate
theme light/dark for the "rhythm check". Match visual energy to narrative
energy (high contrast on tension, calmer on teaching).
- Final — Identity CTA: align the CTA with who the viewer wants to become,
plus the comment-trigger ("Comment WORD").
- Keep each slide to one idea; headline short, body 1–2 lines max.
- Write
slides.json in a new carousel folder (default
./carousels/<slug>/slides.json). Schema:{
"slides": [
{"n":1,"type":"hook","theme":"dark","eyebrow":"SECTION TAG",
"headline":"...","body":"","bg_image":"bg-1.png","bg_prompt":"..."},
{"n":2,"type":"value","theme":"light","eyebrow":"...","headline":"...","body":"..."},
{"n":8,"type":"cta","theme":"dark","eyebrow":"...","headline":"...","body":"..."}
]
}
type is hook | value | cta. bg_prompt is the JSON-style image brief
(subject as metaphor, not decoration; brand mood/palette); bg_image is the
filename it will be saved as.
- Generate backgrounds (if enabled): for slides with a
bg_prompt, invoke the
fal-media skill to generate each background image and save it into the
carousel folder as the bg_image filename. Use a 4:5 / portrait size. Put NO
hex codes or on-screen text in the image prompt — describe the scene/mood only
(the typography is added by the renderer). Hero slides (1 and the CTA) benefit
most; teaching slides can stay solid-color (omit bg_image) for legibility.
- Render: run
python3 <this skill dir>/render_carousel.py ./carousels/<slug> to produce
slide-01.png … slide-NN.png (2160x2700, downscale-safe for IG/LinkedIn).
- Write the caption by handing the topic to the caption-writer skill (or
inline a quick one): hook line + 2–4 value lines + the comment-trigger CTA +
3–6 hashtags. Remind the user to add music so it also hits the Reels feed.
Output
- The carousel folder with
slides.json and the rendered slide-*.png.
- The caption.
- A one-line note on what to test next (Best of Nine: recreate this format 3x with
different hooks).
Keep copy specific and human. No AI tells (no em-dashes, en-dashes, smart quotes,
"unlock/elevate/dive in"). If fal-media or Chrome is unavailable, still write
slides.json and the copy, and tell the user what's missing.
1---2name: carousel-builder3description: Build a 7–10 slide Instagram/LinkedIn carousel (1080x1350) from a topic or script AND render the slides to PNG. Use when the user wants a carousel, slides, a slide deck for IG/LinkedIn, or says "zrob karuzele o X", "slajdy na instagram", "carousel", "make a carousel", "build slides", "turn this into a carousel". Writes slide-by-slide copy (scroll-stop hook, tension+value middle with light/dark rhythm, identity CTA), a per-slide JSON background-image prompt, generates the background imagery via the fal-media skill, then renders crisp on-brand PNG slides via the bundled render_carousel.py (headless Chrome). Outputs the slide PNGs plus a caption.4---56# carousel-builder78Produce a finished, renderable carousel: on-brand copy + real PNG slides. Default9output: **English**. Text is rendered as crisp HTML/CSS (never baked into an image10model, which mangles paragraph text); imagery is the optional background layer.11Reference: carousel mechanics §10, ABC §3, JSON prompting §12 in12`../social-content-os/reference/frameworks.md`. Load `../social-content-os/brand.json`.1314## Inputs1516- Topic, script, or the winning hook (from hook-lab).17- Slide count (default 8; range 7–10).18- Platform (IG default). Whether to generate background imagery (default yes).1920## Build steps21221. **Structure the deck** (ABC across slides):23 - **Slide 1 — Scroll-Stop (hook, dark theme):** the hook on a specific pain24 point. Highest visual energy.25 - **Middle — Tension & Value:** one idea per slide, numbered. Alternate26 `theme` light/dark for the "rhythm check". Match visual energy to narrative27 energy (high contrast on tension, calmer on teaching).28 - **Final — Identity CTA:** align the CTA with who the viewer wants to become,29 plus the comment-trigger ("Comment WORD").30 - Keep each slide to one idea; headline short, body 1–2 lines max.312. **Write `slides.json`** in a new carousel folder (default32 `./carousels/<slug>/slides.json`). Schema:33 ```json34 {35 "slides": [36 {"n":1,"type":"hook","theme":"dark","eyebrow":"SECTION TAG",37 "headline":"...","body":"","bg_image":"bg-1.png","bg_prompt":"..."},38 {"n":2,"type":"value","theme":"light","eyebrow":"...","headline":"...","body":"..."},39 {"n":8,"type":"cta","theme":"dark","eyebrow":"...","headline":"...","body":"..."}40 ]41 }42 ```43 `type` is `hook` | `value` | `cta`. `bg_prompt` is the JSON-style image brief44 (subject as metaphor, not decoration; brand mood/palette); `bg_image` is the45 filename it will be saved as.463. **Generate backgrounds (if enabled):** for slides with a `bg_prompt`, invoke the47 **fal-media** skill to generate each background image and save it into the48 carousel folder as the `bg_image` filename. Use a 4:5 / portrait size. Put NO49 hex codes or on-screen text in the image prompt — describe the scene/mood only50 (the typography is added by the renderer). Hero slides (1 and the CTA) benefit51 most; teaching slides can stay solid-color (omit bg_image) for legibility.524. **Render:** run53 `python3 <this skill dir>/render_carousel.py ./carousels/<slug>` to produce54 `slide-01.png … slide-NN.png` (2160x2700, downscale-safe for IG/LinkedIn).555. **Write the caption** by handing the topic to the **caption-writer** skill (or56 inline a quick one): hook line + 2–4 value lines + the comment-trigger CTA +57 3–6 hashtags. Remind the user to add music so it also hits the Reels feed.5859## Output6061- The carousel folder with `slides.json` and the rendered `slide-*.png`.62- The caption.63- A one-line note on what to test next (Best of Nine: recreate this format 3x with64 different hooks).6566Keep copy specific and human. No AI tells (no em-dashes, en-dashes, smart quotes,67"unlock/elevate/dive in"). If fal-media or Chrome is unavailable, still write68`slides.json` and the copy, and tell the user what's missing.