Instagram Carousel Designer
Generate Instagram carousel posts as self-contained HTML files in your brand. Each carousel is a single HTML file with fixed-dimension slides (420x525px) that export as pixel-perfect 1080x1350px PNGs via Playwright.
This skill handles both copy and design. Give it a topic, pick a style, and it writes the slides + builds the visual — using your colors, your photo, your name.
Architecture
Fixed Dimensions
Every slide is a fixed 420x525px box. Not responsive. Fixed pixel dimensions.
Design: 420 x 525px (what you see in browser)
Export: 1080 x 1350px (what gets uploaded to Instagram)
Scale: 2.5714x (via Playwright device_scale_factor)
Ratio: 4:5 (Instagram carousel standard)
Modular Reference Files
| File |
Contains |
references/design-system.md |
Dimensions, typography, color tokens, slide architecture |
references/components.md |
Profile header, progress bar, arrow, watermark, CTA slide, IG frame |
references/styles.md |
All 4 visual styles with complete CSS |
references/export-guide.md |
Playwright export script, critical rules, common mistakes |
4 Design Styles
| Style |
Name |
Best For |
Vibe |
| 1 |
Bold Impact |
Numbered insights, shifts, mistakes, tips |
Dark, massive text, accent color, film grain, premium |
| 2 |
Tweet Post |
Hot takes, opinions, quotes, wisdom |
Minimal, clean, zero effects, conversational |
| 3 |
Clean Editorial |
Frameworks, tutorials, case studies, listicles |
White bg, grid overlay, coral accent, educational |
| 4 |
Product Showcase |
Tool reviews, comparisons, curated lists |
Soft warm gradient, app cards, pagination dots |
Style Selection Logic
- Explicit request — user says "bold impact", "tweet style", "editorial", "product showcase"
- Auto-detection by content:
- Hot take / opinion / conversational / quote → Tweet Post
- List of tools / product comparison / category breakdown → Product Showcase
- Framework / tutorial / educational / how-to / case study → Clean Editorial
- Everything else (numbered insights, tips, shifts, mistakes) → Bold Impact (default)
- If ambiguous — ask 1 question max, default to Bold Impact
Workflow
Follow these phases in order.
Phase 0: Brand Setup (First Use Only)
Check if carousels/brand-config.json exists in the current working directory.
- If it exists: Read it and use those values for all brand elements. Skip to Phase 1.
- If it does NOT exist: Run the brand onboarding below before doing anything else.
Brand Onboarding Interview
Ask the user these 6 questions (can be asked all at once):
Before we build your first carousel, I need to set up your brand. This only runs once.
1. What's your full name? (shown on every slide as the profile name)
2. What's your @handle? (watermark on every slide, e.g. @yourname)
3. What's your subtitle or tagline? (e.g. "Paid Media | Growth Marketing")
4. Path to your profile photo? (e.g. carousels/photo.jpg — or type "skip" to use initials)
5. What's your brand accent color? (paste a hex code like #6EE421, or describe: green / coral / blue / purple / orange)
6. Default style preference? (dark / light / minimal — or type "auto" to let me decide per content)
Saving Brand Config
After collecting answers, save carousels/brand-config.json:
{
"name": "User's Full Name",
"handle": "@userhandle",
"subtitle": "Their Tagline Here",
"profile_photo": "carousels/photo.jpg",
"accent_color": "#HEXCODE",
"initials": "XX",
"default_style": "dark",
"setup_complete": true
}
Accent color mapping (if user describes instead of hex):
| Description |
Hex |
| green |
#6EE421 |
| coral / orange-red |
#e8553d |
| blue |
#3b82f6 |
| purple |
#8b5cf6 |
| orange |
#f97316 |
| pink |
#ec4899 |
| teal |
#14b8a6 |
| yellow |
#eab308 |
Initials: Extract first letter of first name + first letter of last name. If only one name, use first two letters.
Profile photo fallback: If user skips or file doesn't exist, use a circle with their initials in the accent color.
Create the carousels/ folder
Also create carousels/[year]/[month]/ structure if it doesn't exist.
Phase 1: Research
- Check
carousels/ for any past carousels — scan titles/filenames to avoid repeating topics
- Determine style (see selection logic above)
Phase 2: Write Slide Copy
Follow these copy rules:
Voice:
- Direct and opinionated — clear stances, not wishy-washy
- Experience-backed — real examples, real specifics
- Anti-fluff — no corporate speak, no filler words
- Punchy — fragments fine, contrast wins
Banned words: "just", "really", "actually", "basically", "simply", "literally"
Hook formulas (Slide 1):
- Contrarian: "Your [strategy] is backwards."
- Number promise: "5 [topic] mistakes burning your [resource]."
- Challenge: "I bet you're still doing this in [year]."
- Bold statement: "[Thing] didn't kill [people]. [Behaviour] killed [people]."
Slide count: 5-10 slides (7 is the sweet spot). Every slide readable in 3-4 seconds.
Phase 3: Build HTML
Generate a single self-contained HTML file using brand config values. Read all reference files:
references/design-system.md — dimensions, fonts, colors
references/components.md — shared components
references/styles.md — chosen style's CSS and layout
Critical build rules:
- Every slide:
width: 420px; height: 525px; — FIXED, never responsive
- Use
brand.accent_color for all accent/highlight elements
- Use
brand.name, brand.handle, brand.subtitle in profile header and watermark
- Profile photo: if
brand.profile_photo file exists → base64 encode and embed; else → initials circle using brand.initials and brand.accent_color
- All images: base64 encoded inline (self-contained HTML)
- Always use Python to generate HTML — never shell/bash (corrupts special characters)
- IG preview frame wraps carousel for in-browser preview
- Navigation: touch swipe + mouse drag + keyboard arrows
- Export buttons: PNG per slide + PDF (all slides)
- Save to:
carousels/[year]/[month]/carousel-XX-topic.html
- MANDATORY — accent color sanitisation: The reference files contain example hex values (
#6EE421, #85F040, #5BC01C) from a sample brand. After generating the full HTML string, run a global replace in Python before writing the file:
# Replace all sample accent colors with the user's brand color
SAMPLE_ACCENTS = ["#6EE421", "#85F040", "#5BC01C", "#6ee421", "#85f040", "#5bc01c"]
for sample in SAMPLE_ACCENTS:
html = html.replace(sample, brand["accent_color"])
This guarantees no one else's carousel ever shows your design's green.
Phase 4: Preview and Iterate
Show the carousel. Present a slide-by-slide summary. Ask if any slides need changes.
Phase 5: Export
Primary (Playwright — pixel-perfect):
Run the Python export script from references/export-guide.md. Produces 1080x1350px PNG per slide.
Fallback (Browser):
HTML file includes Export buttons using html2canvas + jsPDF.
Phase 6: Save and Suggest
- Save to
carousels/[year]/[month]/carousel-XX-topic.html
- Suggest an Instagram caption with relevant hashtags
- Present file path and next steps
Quality Checklist
Before presenting the carousel, verify:
1---2name: instagram-carousel3description: Design Instagram carousel posts as self-contained HTML files in the user's own brand. Runs a one-time brand setup on first use (name, handle, subtitle, photo, accent color, style preference). 4 design styles: Bold Impact (dark premium), Tweet Post (minimal text), Clean Editorial (light/white), Product Showcase (soft gradient). Fixed 420x525px slides, Poppins font, progress bar, arrow indicators, white CTA slide, PNG + PDF export. Triggers: instagram carousel, carousel design, ig carousel, create carousel, design carousel, carousel post, make a carousel, instagram post design, carousel html, slide deck for instagram, visual carousel4---56# Instagram Carousel Designer78Generate Instagram carousel posts as self-contained HTML files in **your brand**. Each carousel is a single HTML file with fixed-dimension slides (420x525px) that export as pixel-perfect 1080x1350px PNGs via Playwright.910This skill handles **both copy and design**. Give it a topic, pick a style, and it writes the slides + builds the visual — using your colors, your photo, your name.1112---1314## Architecture1516### Fixed Dimensions1718Every slide is a **fixed 420x525px box**. Not responsive. Fixed pixel dimensions.1920```21Design: 420 x 525px (what you see in browser)22Export: 1080 x 1350px (what gets uploaded to Instagram)23Scale: 2.5714x (via Playwright device_scale_factor)24Ratio: 4:5 (Instagram carousel standard)25```2627### Modular Reference Files2829| File | Contains |30|------|----------|31| `references/design-system.md` | Dimensions, typography, color tokens, slide architecture |32| `references/components.md` | Profile header, progress bar, arrow, watermark, CTA slide, IG frame |33| `references/styles.md` | All 4 visual styles with complete CSS |34| `references/export-guide.md` | Playwright export script, critical rules, common mistakes |3536---3738## 4 Design Styles3940| Style | Name | Best For | Vibe |41|-------|------|----------|------|42| 1 | **Bold Impact** | Numbered insights, shifts, mistakes, tips | Dark, massive text, accent color, film grain, premium |43| 2 | **Tweet Post** | Hot takes, opinions, quotes, wisdom | Minimal, clean, zero effects, conversational |44| 3 | **Clean Editorial** | Frameworks, tutorials, case studies, listicles | White bg, grid overlay, coral accent, educational |45| 4 | **Product Showcase** | Tool reviews, comparisons, curated lists | Soft warm gradient, app cards, pagination dots |4647### Style Selection Logic48491. **Explicit request** — user says "bold impact", "tweet style", "editorial", "product showcase"502. **Auto-detection by content:**51 - Hot take / opinion / conversational / quote → **Tweet Post**52 - List of tools / product comparison / category breakdown → **Product Showcase**53 - Framework / tutorial / educational / how-to / case study → **Clean Editorial**54 - Everything else (numbered insights, tips, shifts, mistakes) → **Bold Impact** (default)553. **If ambiguous** — ask 1 question max, default to Bold Impact5657---5859## Workflow6061Follow these phases in order.6263### Phase 0: Brand Setup (First Use Only)6465**Check if `carousels/brand-config.json` exists** in the current working directory.6667- **If it exists:** Read it and use those values for all brand elements. Skip to Phase 1.68- **If it does NOT exist:** Run the brand onboarding below before doing anything else.6970#### Brand Onboarding Interview7172Ask the user these 6 questions (can be asked all at once):7374```75Before we build your first carousel, I need to set up your brand. This only runs once.76771. What's your full name? (shown on every slide as the profile name)782. What's your @handle? (watermark on every slide, e.g. @yourname)793. What's your subtitle or tagline? (e.g. "Paid Media | Growth Marketing")804. Path to your profile photo? (e.g. carousels/photo.jpg — or type "skip" to use initials)815. What's your brand accent color? (paste a hex code like #6EE421, or describe: green / coral / blue / purple / orange)826. Default style preference? (dark / light / minimal — or type "auto" to let me decide per content)83```8485#### Saving Brand Config8687After collecting answers, save `carousels/brand-config.json`:8889```json90{91 "name": "User's Full Name",92 "handle": "@userhandle",93 "subtitle": "Their Tagline Here",94 "profile_photo": "carousels/photo.jpg",95 "accent_color": "#HEXCODE",96 "initials": "XX",97 "default_style": "dark",98 "setup_complete": true99}100```101102**Accent color mapping (if user describes instead of hex):**103| Description | Hex |104|-------------|-----|105| green | `#6EE421` |106| coral / orange-red | `#e8553d` |107| blue | `#3b82f6` |108| purple | `#8b5cf6` |109| orange | `#f97316` |110| pink | `#ec4899` |111| teal | `#14b8a6` |112| yellow | `#eab308` |113114**Initials:** Extract first letter of first name + first letter of last name. If only one name, use first two letters.115116**Profile photo fallback:** If user skips or file doesn't exist, use a circle with their initials in the accent color.117118#### Create the `carousels/` folder119120Also create `carousels/[year]/[month]/` structure if it doesn't exist.121122---123124### Phase 1: Research1251261. Check `carousels/` for any past carousels — scan titles/filenames to avoid repeating topics1272. Determine style (see selection logic above)128129### Phase 2: Write Slide Copy130131Follow these copy rules:132133**Voice:**134- Direct and opinionated — clear stances, not wishy-washy135- Experience-backed — real examples, real specifics136- Anti-fluff — no corporate speak, no filler words137- Punchy — fragments fine, contrast wins138139**Banned words:** "just", "really", "actually", "basically", "simply", "literally"140141**Hook formulas (Slide 1):**142- Contrarian: "Your [strategy] is backwards."143- Number promise: "5 [topic] mistakes burning your [resource]."144- Challenge: "I bet you're still doing this in [year]."145- Bold statement: "[Thing] didn't kill [people]. [Behaviour] killed [people]."146147**Slide count:** 5-10 slides (7 is the sweet spot). Every slide readable in 3-4 seconds.148149### Phase 3: Build HTML150151Generate a single self-contained HTML file using brand config values. Read all reference files:152- `references/design-system.md` — dimensions, fonts, colors153- `references/components.md` — shared components154- `references/styles.md` — chosen style's CSS and layout155156**Critical build rules:**1571. Every slide: `width: 420px; height: 525px;` — FIXED, never responsive1582. Use `brand.accent_color` for all accent/highlight elements1593. Use `brand.name`, `brand.handle`, `brand.subtitle` in profile header and watermark1604. Profile photo: if `brand.profile_photo` file exists → base64 encode and embed; else → initials circle using `brand.initials` and `brand.accent_color`1615. All images: base64 encoded inline (self-contained HTML)1626. **Always use Python to generate HTML** — never shell/bash (corrupts special characters)1637. IG preview frame wraps carousel for in-browser preview1648. Navigation: touch swipe + mouse drag + keyboard arrows1659. Export buttons: PNG per slide + PDF (all slides)16610. Save to: `carousels/[year]/[month]/carousel-XX-topic.html`16711. **MANDATORY — accent color sanitisation:** The reference files contain example hex values (`#6EE421`, `#85F040`, `#5BC01C`) from a sample brand. After generating the full HTML string, run a global replace in Python before writing the file:168169```python170# Replace all sample accent colors with the user's brand color171SAMPLE_ACCENTS = ["#6EE421", "#85F040", "#5BC01C", "#6ee421", "#85f040", "#5bc01c"]172for sample in SAMPLE_ACCENTS:173 html = html.replace(sample, brand["accent_color"])174```175176This guarantees no one else's carousel ever shows your design's green.177178### Phase 4: Preview and Iterate179180Show the carousel. Present a slide-by-slide summary. Ask if any slides need changes.181182### Phase 5: Export183184**Primary (Playwright — pixel-perfect):**185Run the Python export script from `references/export-guide.md`. Produces 1080x1350px PNG per slide.186187**Fallback (Browser):**188HTML file includes Export buttons using html2canvas + jsPDF.189190### Phase 6: Save and Suggest1911921. Save to `carousels/[year]/[month]/carousel-XX-topic.html`1932. Suggest an Instagram caption with relevant hashtags1943. Present file path and next steps195196---197198## Quality Checklist199200Before presenting the carousel, verify:201202- [ ] Brand config was read (not hardcoded values)203- [ ] Poppins font loads via Google Fonts CDN204- [ ] Every slide is exactly 420x525px — no responsive widths205- [ ] Slide count is 5-10 (ideally 7)206- [ ] Every slide readable in 3-4 seconds207- [ ] Hero slide has a scroll-stopping hook208- [ ] Profile header on every slide (photo or initials fallback)209- [ ] Progress bar on every slide210- [ ] Arrow indicator on every slide EXCEPT CTA211- [ ] Handle watermark on every slide212- [ ] CTA slide uses white/textured design213- [ ] Accent color used correctly throughout (not hardcoded green)214- [ ] Text sized correctly for style215- [ ] Visual effects applied correctly per style216- [ ] Navigation works (touch / mouse / keyboard)217- [ ] IG preview frame wraps carousel at exactly 420px218- [ ] PNG + PDF export buttons present and functional219- [ ] File saved to correct path220- [ ] Instagram caption suggested