marcolang/marketing-skills/instagram-carousel
Claude Code and agent skill by marcolang/marketing-skills
- community
Checking that the SKILL.md file is still in the repository.
Creates high-quality Instagram carousels as swipeable HTML previews with export-ready slides (1080×1350px PNG). Handles the full workflow: brand setup, slide copy, visual design system (colors, fonts, components), HTML generation, and Playwright-based export. Use this skill whenever the user asks to create, design, or generate an Instagram carousel, carrossel, slides para Instagram, or any Instagram multi-image post — even if they don't explicitly say "carousel" or "skill". Also trigger for req…
Install
npx vskill@latest install marcolang/marketing-skills/instagram-carouselSKILL.md
The same SKILL.md was published earlier as neversight/learn-skills.dev/instagram-carousel.
Instagram Carousel Generator
Generates fully self-contained, swipeable HTML carousels where every slide is designed to be exported as an individual 1080×1350px PNG for Instagram.
Step 1: Collect Brand Details
Before generating, ask the user for the following (if not already provided):
- Brand name — displayed on first and last slides
- Instagram handle — shown in the IG frame header
- Primary brand color — hex code, or describe and Claude picks one
- Logo — SVG path, brand initial, or skip
- Font preference — see typography table below, or specific Google Fonts
- Tone — professional, casual, playful, bold, minimal, etc.
- Images — profile photo, screenshots, product images, etc.
- Idioma dos slides — default: Português (BR) unless specified otherwise
- Carousel format — standard (7 slides) or alternate sequence (see sequences section)
If the user provides a website URL or brand assets, derive colors and style from those.
If the user says "make me a carousel about X" without brand details, ask before generating. Don't assume defaults.
Handling User-Provided Images
This section applies from the very first HTML generation — not only during export.
When the user provides an image file path (e.g., /home/user/gestante.png, /mnt/user-data/uploads/foto.jpg):
⚠️ Critical Rules
- NEVER use relative paths (
gestante.png) — they break in every browser context except the exact folder the HTML lives in. - NEVER use `background: url(filepath)` — leads to 1.5MB+ base64 inline strings that crash the browser parser.
- ALWAYS embed as base64 `data:` URI — works in preview, export, and any environment.
- ALWAYS generate the HTML via Python (
Path.write_text()) — shell heredocs interpolate$and backticks, corrupting base64 strings.
Step-by-step: embed an image
Image as slide background (most common use)
For dark slides, use rgba(0,0,0,0.45) as the overlay instead.
Common image mistakes to avoid
| Mistake | What goes wrong | Fix | |
|---|---|---|---|
<img src="gestante.png"> | Broken image — relative path only works if HTML and image share the same folder | Always use base64 data: URI | |
background: url('data:...') inline with 1.5MB base64 | Browser parser crash, 1.3M token context | Use <img> tag with object-fit:cover | |
Generating HTML via shell echo or heredoc | $ and backtick characters in base64 get interpolated and corrupt the string | Always use Python Path.write_text() | |
Assuming .png extension = PNG format | File may actually be JPEG; wrong MIME type breaks rendering | Run file command to detect actual format |
Step 2: Derive the Full Color System
From the user's single primary brand color, generate the full 6-token palette:
Rules for deriving colors:
- LIGHT_BG: tinted off-white complementing the primary (warm → warm cream, cool → cool gray-white)
- DARK_BG: near-black with subtle brand tint (warm → #1A1918, cool → #0F172A)
- LIGHT_BORDER: always ~1 shade darker than LIGHT_BG
- Brand gradient:
linear-gradient(165deg, BRAND_DARK 0%, BRAND_PRIMARY 50%, BRAND_LIGHT 100%)
Step 3: Set Up Typography
Based on the user's font preference, pick a heading font and body font from Google Fonts.
| Style | Heading Font | Body Font | |
|---|---|---|---|
| Editorial / premium | Playfair Display | DM Sans | |
| Modern / clean | Plus Jakarta Sans (700) | Plus Jakarta Sans (400) | |
| Warm / approachable | Lora | Nunito Sans | |
| Technical / sharp | Space Grotesk | Space Grotesk | |
| Bold / expressive | Fraunces | Outfit | |
| Classic / trustworthy | Libre Baskerville | Work Sans | |
| Rounded / friendly | Bricolage Grotesque | Bricolage Grotesque |
Font size scale (fixed across all brands):
- Headings: 28–34px, weight 600, letter-spacing -0.3 to -0.5px, line-height 1.1–1.15
- Body: 14px, weight 400, line-height 1.5–1.55
- Tags/labels: 10px, weight 600, letter-spacing 2px, uppercase
- Step numbers: heading font, 26px, weight 300
- Small text: 11–12px
Apply via CSS classes .serif (heading font) and .sans (body font) throughout all slides.
Slide 1 — Hook Rules
The first slide must stop the scroll in under 1 second. Prioritize these formats:
| Hook format | Example | |
|---|---|---|
| Afirmação polêmica | "Você está usando IA errado" | |
| Número + benefício | "7 ferramentas que substituem seu designer" | |
| Pergunta que dói | "Por que seus carrosséis têm 0 salvamentos?" | |
| Resultado concreto | "Esse post gerou 4.200 seguidores em 3 dias" | |
| Inversão de expectativa | "Mais esforço no design = menos alcance" |
Rules:
- Never start with the brand name as headline
- Visual proof on Slide 1 whenever possible (screenshot, result, real number)
- Hook must promise value that the following slides deliver
Slide Sequences
Standard (7 slides — default)
| # | Type | Background | Purpose | |
|---|---|---|---|---|
| 1 | Hero | LIGHT_BG | Hook — bold statement, logo lockup, optional watermark | |
| 2 | Problem | DARK_BG | Pain point — what's broken, frustrating, or outdated | |
| 3 | Solution | Brand gradient | The answer — what solves it, optional quote/prompt box | |
| 4 | Features | LIGHT_BG | What you get — feature list with icons | |
| 5 | Details | DARK_BG | Depth — customization, specs, differentiators | |
| 6 | How-to | LIGHT_BG | Steps — numbered workflow or process | |
| 7 | CTA | Brand gradient | Call to action — logo, tagline, CTA button. No arrow. Full progress bar. |
Listicle (5–10 slides)
| # | Type | Background | |
|---|---|---|---|
| 1 | Hero | LIGHT_BG | |
| 2–N | Item N | Alternating LIGHT/DARK | |
| Last | CTA | Brand gradient |
Use for: "X ferramentas", "X erros", "X dicas"
Tutorial (7 slides)
| # | Type | Background | |
|---|---|---|---|
| 1 | Hero | LIGHT_BG | |
| 2 | Contexto / Por quê | DARK_BG | |
| 3–5 | Passo 1, 2, 3 | Alternating | |
| 6 | Resultado esperado | DARK_BG | |
| 7 | CTA | Brand gradient |
Comparação (5 slides)
| # | Type | Background | |
|---|---|---|---|
| 1 | Hero (o que será comparado) | LIGHT_BG | |
| 2 | Opção A | LIGHT_BG | |
| 3 | Opção B | DARK_BG | |
| 4 | Veredicto | Brand gradient | |
| 5 | CTA | DARK_BG |
General rules for all sequences:
- Start with a hook — first slide must stop the scroll
- End CTA on brand gradient — no swipe arrow, progress bar at 100%
- Alternate light and dark backgrounds for visual rhythm
- Adapt sequence to topic — not every carousel needs all slides
Slide Architecture
Format
- Aspect ratio: 4:5 (Instagram carousel standard)
- Each slide is self-contained — all UI elements baked into the image
- Alternate LIGHT_BG and DARK_BG backgrounds for visual rhythm
Required Elements on Every Slide
1. Progress Bar (bottom of every slide)
Shows position in the carousel. Fills as user swipes.
- Position: absolute bottom, full width, 28px horizontal padding, 20px bottom padding
- Track: 3px height, rounded corners
- Fill width:
((slideIndex + 1) / totalSlides) * 100% - Light slides:
rgba(0,0,0,0.08)track,BRAND_PRIMARYfill,rgba(0,0,0,0.3)counter - Dark slides:
rgba(255,255,255,0.12)track,#ffffill,rgba(255,255,255,0.4)counter - Counter label beside the bar: "1/7" format, 11px, weight 500
⚠️ Important: Always replace BRAND_PRIMARY with the actual hex value before rendering. Never leave it as a variable name in the HTML output.
2. Swipe Arrow (right edge — every slide EXCEPT the last)
Subtle chevron guiding the user to keep swiping. Removed on the last slide.
- Position: absolute right, full height, 48px wide
- Background: gradient fade transparent → subtle tint
- Chevron: 24×24 SVG, rounded strokes
- Light slides:
rgba(0,0,0,0.06)bg,rgba(0,0,0,0.25)stroke - Dark slides:
rgba(255,255,255,0.08)bg,rgba(255,255,255,0.35)stroke
Reusable Components
Strikethrough pills
Tag pills
Prompt / quote box
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewNot runA model review is scheduled for the next rescan.
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckinginstagram-carousel/SKILL.md
Popularity
- Repository stars
- 68
- Repository forks
- 25
- 7-day trend score
- 0
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/marcolang/marketing-skills/instagram-carousel)