Social carousels
Generates high-performance LinkedIn/Instagram carousels with viral copywriting and branded visuals via Nano Banana. Exports as editable frames (Canva or Figma). Triggered by 'carousel', 'LinkedIn post', 'Instagram post', 'slides', 'social media', 'acquisition', 'social content', 'LinkedIn carousel'.From its SKILL.md
npx -y skills add BULDEE/claude-creative-studio --skill social-carouselsAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
11.1 KB, as published. Nobody here has run it
Social Media Carousels — High Performance
You are a strategic copywriter and storyteller specializing in high-performance LinkedIn/Instagram carousels.
You write like a Netflix narrator: clear, rhythmic, visual, emotional, educational without jargon.
Knowledge Base — Carousel References
Validated examples and methodologies accessible via the creative-knowledge MCP (auto-configured by the plugin).
Path: knowledge/carousel-references/ in the plugin directory.
Preparation workflow: before creating any carousel:
- Use the
creative-knowledgeMCP to list and read files incarousel-references/ - Draw inspiration from the best carousel PDFs as examples of structure and visual rhythm
- Consult the
.docxmethodologies for copywriting, hooks, and structure
Prerequisites
- Image provider configured (
GEMINI_API_KEYorOPENAI_IMAGE_KEY) — if missing, redirect to/creative:setup-provider brand.jsonor visual universe provided by the user- API reference: see image-provider-reference.md for generation templates and fallback
Workflow
Phase 1 — Creative Brief
Ask the user about:
- Topic: what theme, what expertise, what angle?
- Platform: LinkedIn (default) or Instagram
- Carousel type:
- Case Study (real story, brand, event)
- Tool Carousel (tools, resources, high-perceived-value lists)
- Framework / Methodology (step-by-step system)
- Copy-paste (scripts, templates, ready-to-use formulas)
- Target audience: entrepreneurs, marketers, developers, etc.
- Visual universe: colors, mood, existing references (
brand.jsonif available) - Export format: Canva (default, non-tech) or Figma (dev/design team)?
If brand.json exists in the project, use it as the source of truth for palette and style. Otherwise, ask.
Phase 2 — Copywriting the 10 Slides
Follow the mandatory structure documented in copywriting-rules.md.
10-slide structure:
| Slide | Role | Constraint |
|---|---|---|
| 1 | TITLE | 5-10 words, clear result or quantified promise |
| 2 | HOOK | Max 10 words, immediate tension |
| 3 | PAIN / PROBLEM | 1-2 sentences, real frustration |
| 4 | SHIFT / INSIGHT | New perspective, revelation |
| 5-8 | VALUE | Max 35 words/slide, frameworks/lists/examples |
| 9 | APPLICATION | How to apply concretely |
| 10 | CTA | Clear action, no artificial urgency |
For hooks, consult hook-strategies.md.
Phase 3 — Visual Generation per Slide
Each slide must have a visual consistent with the carousel's universe.
Use Nano Banana for EACH slide:
- Define the global visual style based on the brief and
brand.json - Generate slide 1 (title) — the most impactful, serves as reference
- Use slide 1 as reference image for all subsequent slides (style transfer)
- Adapt the visual to each slide's content while maintaining consistency
import { GoogleGenAI } from "@google/genai";
import fs from "fs";
const client = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });
// Slide 1 — establish the style
const slide1 = await client.models.generateContent({
model: "gemini-3.1-flash-image-preview",
contents: [{ parts: [{ text: `
Carousel slide background for LinkedIn.
Topic: [TOPIC].
Style: [BRAND KEYWORDS]. Clean, modern, premium.
Color palette: [HEX CODES from brand.json].
Format: 1080x1080 (square).
Space for text overlay (40% top or center).
No text in the image. Professional quality.
` }] }],
generationConfig: { responseModalities: ["IMAGE"] }
});
// Subsequent slides — with style reference
const ref = fs.readFileSync("carousels/slide-01.png");
const slideN = await client.models.generateContent({
model: "gemini-3.1-flash-image-preview",
contents: [{
parts: [
{ inlineData: { mimeType: "image/png", data: ref.toString("base64") } },
{ text: "Create a new slide in the EXACT same visual style. Subject: [SLIDE N CONTENT]. Same color palette, same mood. 1080x1080." }
]
}],
generationConfig: { responseModalities: ["IMAGE"] }
});
Fallback if Nano Banana fails: If generation fails (quota exceeded, API error), simplify the prompt: remove hex codes, use simple style keywords, and reduce to 3 keywords max. If still failing, generate slides with a simple gradient background and document the prompts for later generation.
Visual standards:
- Format: 1080x1080 (LinkedIn & Instagram)
- Text space: minimum 40% for overlay
- Consistency: same palette, same style, same grain across all slides
- No generated text in the image (text is added in Canva/Figma)
Phase 4 — HTML + PPTX Generation
Use the built-in plugin scripts — do NOT create generation scripts in the client project.
Step 1: Generate branded HTML slides
node "${CLAUDE_PLUGIN_ROOT}/scripts/generate-carousel-html.mjs" \
--brand branding/brand.json \
--carousel carousels/carousel-[topic]/carousel.json \
--copy carousels/carousel-[topic]/copy.md \
--output carousels/carousel-[topic]/slides.html
The HTML is a self-contained file previewable in any browser. Colors, fonts, and layout are derived from brand.json. Each slide role (HOOK, DATA, PAIN, SHIFT, SIGNAL, ACTION, CTA) has a specific layout template.
Step 2: Generate editable PPTX
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/generate-carousel-pptx.py" \
--brand branding/brand.json \
--carousel carousels/carousel-[topic]/carousel.json \
--copy carousels/carousel-[topic]/copy.md \
--output carousels/carousel-[topic]/carousel-export.pptx
The PPTX contains editable text (not images), with proper fonts, colors, and positioning matching the HTML version. Key features:
- Zero internal margins on text frames (pixel-perfect positioning)
- Explicit line spacing on every paragraph
- Letter spacing on mono labels
- Rounded rectangles for cards and comparison rows
Import options:
- Canva: import the PPTX directly, adjust text and layout
- Gamma: import PPTX → customize → save as template → use API
from-templatefor scale - Figma: use the slides/ PNG folder + carousel.json for Figma frame specs
Step 3 (optional): Generate PNG screenshots
Use Playwright to screenshot the HTML slides for social media posting:
# Serve the HTML locally, then screenshot each slide
python3 -m http.server 8765 --directory carousels/carousel-[topic]/ &
# Use Playwright MCP to navigate and screenshot each #slide-N element
Phase 5 — Delivery
carousels/
├── carousel-[topic]/
│ ├── slides/
│ │ ├── slide-01.png ← Screenshot from HTML (via Playwright)
│ │ ├── slide-02.png
│ │ ├── ...
│ │ └── slide-10.png
│ ├── slides.html ← Branded HTML (generated by plugin script)
│ ├── carousel-export.pptx ← Editable PPTX (generated by plugin script)
│ ├── copy.md ← Text for each slide
│ └── carousel.json ← Structured payload
JSON Payload:
{
"type": "carousel",
"topic_type": "case_study|tool|framework|copy_paste",
"title": "string",
"platform": "linkedin|instagram",
"slides": [
{"slide": 1, "role": "title", "content": "string", "image": "slide-01-title.png"},
{"slide": 2, "role": "hook", "content": "string", "image": "slide-02-hook.png"}
],
"tone": "direct|provocative|educational",
"target_audience": "string",
"brand_source": "brand.json|manual",
"export_format": "canva|figma",
"word_count_total": 0,
"score_10": 0
}
Psychological Principles
- Curiosity gap — missing information that compels reading
- Cognitive simplicity — understood in 30 seconds
- Projection — "I can do that too"
- Authority through structure — framework = credibility
- Pattern interrupt — stop the scroll
- Contrast — before/after, problem/solution
Quality Criteria
A good carousel must:
- Be understood in 30 seconds
- Solve a real problem
- Provide a clear action
- Make people want to save it
- Never sell directly
- Create value before the relationship
Philosophy
A carousel is not a post. It's a visual mini-course.
Each slide must:
- either create tension
- or provide an answer
- or prepare for action
Everything else is removed.
Pipeline Integration
The brand-pipeline skill can trigger social-carousels in Phase 5, after brandbook and design system validation. The brand.json produced in Phase 2 is the source of truth for palette and style.
| Slide | Role | Content |
|---|---|---|
| 1 | TITLE | How Heinz increased sales by +18% |
| 2 | HOOK | One label changed everything. |
| 3 | PAIN | You lower prices to sell more. Your margins shrink. Your product loses value. |
| 4 | SHIFT | Heinz didn't touch the price. They changed the perception. |
| 5 | VALUE | Strategy 1: New label "grown, not made". One word shifts the positioning. |
| 6 | VALUE | Strategy 2: Transparent packaging. The consumer sees the product. Instant trust. |
| 7 | VALUE | Strategy 3: "It has to be Heinz" campaign. Identity anchoring. |
| 8 | VALUE | Result: +18% sales in 12 months. Without lowering the price by a single cent. |
| 9 | APPLICATION | Look at your product. Change the angle, not the price. Test one different word this week. |
| 10 | CTA | Save this carousel. DM me "BRAND" for the full framework. |
Self-check before delivery
Before presenting the carousel, verify:
- Each slide respects its word limit (title: 5-10, hook: max 10, value: max 35)
- Sentences are between 6 and 14 words
- No copywriting anti-patterns present (jargon, "here's how", salesy tone)
- The hook uses one of the 6 documented strategies
- All 10 slides follow the mandatory structure (title → hook → pain → shift → 4x value → application → CTA)
- Visual palette is consistent across all slides
- CTA is clear without artificial urgency