Systems Lab

Agent skill

carousel-creator

Generate LinkedIn carousel slides as structured HTML files with brand styling

dormantReaches the webInstructions only1,364 words

Filed under LinkedIn and social.

From ekatasingh1107/b2b-gtm-skills · 99 skills · 2 · pushed 2026-04-11

What it does when it runs

Generate LinkedIn carousel slides as structured HTML files with brand styling

Read from the skill and the 1 file bundled beside it. A skill’s own description is written to be selected by an agent, so it describes the job and not the dependencies.

Keys and connectors you must supply
None found.
Hosts it reaches
  • fonts.googleapis.com
Tool permissions it declares
No allowed-tools in the frontmatter. It only issues instructions, so there is nothing to bound.
Actions present in the files
None. Instructions only.

Ask about carousel-creator

Opens your assistant with this page's verified links already in the prompt.

Is this safe to install?ClaudeChatGPT
Adapt it to my stackClaudeChatGPT
What else do I need for it to workClaudeChatGPT
Rather ask a human? Talk to Cheetah
git clone --depth 1 --filter=blob:none --sparse https://github.com/ekatasingh1107/b2b-gtm-skills.git /tmp/b2b-gtm-skills
git -C /tmp/b2b-gtm-skills sparse-checkout set "skills/capabilities/carousel-creator"
mkdir -p ~/.claude/skills/carousel-creator
cp -R "/tmp/b2b-gtm-skills/skills/capabilities/carousel-creator/." ~/.claude/skills/carousel-creator/

Picked up without a restart. A project skill of the same name is shadowed by your personal one. For one repository only, swap ~/.claude/skills for .claude/skills. Claude Code docs ↗

The folder is the same in every client that implements the format — 46 of them — so if yours is not above, only the destination changes.

Reproduced in full from ekatasingh1107/b2b-gtm-skills/blob/eae8dd0bb98da1c8e84abd297066a87015dd860f/skills/capabilities/carousel-creator/SKILL.md, which is licensed MIT (repository). 1,364 words, 10 headings.

Carousel Creator

Generates LinkedIn carousel content structured as 8-12 slides with a hook, value slides, and CTA. Outputs each slide as a standalone HTML file with inline brand-color styling, sized for LinkedIn carousel dimensions (1080x1350px). The HTML files can be screenshot'd to PNG for upload.

Prerequisites

  • agency.config.json at repo root with agency, outreach, services, and case_studies sections
  • Topic, raw content, or a brief describing what the carousel covers
  • Optional: brand colors override (defaults to config or neutral palette)
  • Optional: output directory for HTML files

Phase 0: Intake

  1. Read agency.config.json from the project root.
  2. Extract:
    • agency.name -- for branding on final slide
    • agency.founder -- for attribution
    • agency.domain -- for CTA slide link
    • outreach.tone -- voice and style for copy
    • outreach.banned_phrases -- phrases to avoid
    • services[] -- for contextual relevance
    • case_studies[] -- for data-backed slides
  3. Accept parameters:
    • topic -- (required) the carousel topic or headline
    • source_content -- (optional) raw text, blog post, or notes to structure into slides
    • slide_count -- number of slides. Default: 10. Range: 8-12
    • brand_colors -- (optional) object with primary, secondary, background, text hex values. Default: dark background (#1a1a2e), white text (#ffffff), accent (#e94560)
    • font_family -- (optional) Google Font name. Default: "Inter"
    • output_dir -- directory to write HTML files. Default: ./carousel-output/
    • style -- visual style: dark | light | gradient | minimal. Default: dark
    • cta -- call-to-action for final slide. Default: "Follow for more" + agency domain

Phase 1: Content Structuring

Transform the topic or source content into a slide-by-slide structure. Each slide must carry exactly one idea.

Slide architecture:

SlidePurposeContent Rules
1HookBold statement, question, or surprising stat. Must stop the scroll. Max 10 words.
2ContextSet up the problem or frame the topic. 15-25 words.
3-8ValueOne point per slide. Title (3-6 words) + body (15-30 words).
9-10ProofData point, case study result, or before/after. Numbers prominent.
11SummaryKey takeaway in one sentence. Optional: numbered recap.
12CTAClear action: follow, visit, DM, book a call. Brand name + handle.

Content rules (non-negotiable):

  • No slide exceeds 40 words total (title + body combined)
  • Hook slide (slide 1) must work without any context
  • Every value slide has a clear title that summarizes the point
  • Data slides lead with the number in large format
  • CTA slide includes agency name, domain, and specific next step
  • No filler slides -- every slide must deliver standalone value
  • If source content is provided, extract and restructure; do not summarize

Copy quality checks:

  • Each slide must pass the "screenshot test" -- readable in a 2-second glance
  • Titles should be parallel in structure (all imperatives, all questions, or all statements -- pick one)
  • Remove all unnecessary words: no "that", "very", "really", "just", "basically"
  • Prefer concrete specifics over abstract generalities

Compile the content plan:

CAROUSEL PLAN:
---
Topic: [headline]
Style: [dark/light/gradient/minimal]
Slide count: [N]
Title structure: [imperative/question/statement]
---
Slide 1 (Hook): [text]
Slide 2 (Context): [title] | [body]
Slide 3 (Value): [title] | [body]
...
Slide N (CTA): [text]

Phase 2: Visual Design System

Define the design tokens for the carousel before generating HTML:

Color palette by style:

StyleBackgroundTextAccentSecondary BG
dark#1a1a2e#ffffff#e94560#16213e
light#ffffff#1a1a2e#e94560#f5f5f5
gradient#0f0c29 to #302b63#ffffff#24d2b5#24243e
minimal#fafafa#2d2d2d#0066ff#eeeeee

Override with brand_colors if provided.

Typography scale:

  • Hook slide title: 64px, font-weight 800
  • Slide title: 42px, font-weight 700
  • Slide body: 24px, font-weight 400, line-height 1.5
  • Slide number: 18px, font-weight 600, accent color
  • CTA text: 36px, font-weight 700
  • Attribution: 20px, font-weight 400

Layout rules:

  • Canvas size: 1080px x 1350px (4:5 LinkedIn ratio)
  • Padding: 80px on all sides
  • Content vertically centered
  • Slide number in top-right corner (except hook and CTA slides)
  • Agency logo/name in bottom-left corner (all slides except hook)
  • Accent bar (4px) at bottom of each slide

Phase 3: HTML Generation

Generate one HTML file per slide. Each file is self-contained with inline CSS.

HTML template structure per slide:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <style>
    @import url('https://fonts.googleapis.com/css2?family={{font_family}}:wght@400;600;700;800&display=swap');
    * { margin: 0; padding: 0; box-sizing: border-box; }
    body {
      width: 1080px;
      height: 1350px;
      font-family: '{{font_family}}', sans-serif;
      background: {{background_color}};
      color: {{text_color}};
      display: flex;
      flex-direction: column;
      justify-content: center;
      padding: 80px;
      position: relative;
    }
    .slide-number {
      position: absolute;
      top: 40px;
      right: 60px;
      font-size: 18px;
      font-weight: 600;
      color: {{accent_color}};
    }
    .title {
      font-size: 42px;
      font-weight: 700;
      margin-bottom: 24px;
      line-height: 1.2;
    }
    .body-text {
      font-size: 24px;
      font-weight: 400;
      line-height: 1.5;
      opacity: 0.9;
    }
    .accent-bar {
      position: absolute;
      bottom: 0;
      left: 0;
      width: 100%;
      height: 4px;
      background: {{accent_color}};
    }
    .branding {
      position: absolute;
      bottom: 40px;
      left: 80px;
      font-size: 16px;
      opacity: 0.6;
    }
  </style>
</head>
<body>
  <div class="slide-number">{{number}}/{{total}}</div>
  <div class="title">{{slide_title}}</div>
  <div class="body-text">{{slide_body}}</div>
  <div class="branding">{{agency_name}}</div>
  <div class="accent-bar"></div>
</body>
</html>

Slide-type variations:

  • Hook slide: No slide number, no branding. Title at 64px, centered. Optional subtitle at 24px below.
  • Value slides: Slide number visible. Title + body layout. Optional icon placeholder.
  • Data slides: Large number (80px, accent color) centered, with context line below (24px).
  • CTA slide: Agency name at 36px, domain below, CTA text prominent, optional "Follow for more" or "DM me" text. No slide number.

File naming: slide-01.html, slide-02.html, ..., slide-12.html

Write all files to output_dir.

Phase 4: Slide Variants

Generate two variant options for the hook slide (slide 1), since the hook determines carousel performance:

Hook variant types:

  1. Question hook: Pose a provocative question the audience wants answered
  2. Stat hook: Lead with a surprising number or data point
  3. Contrarian hook: Challenge a common belief in the audience's space
  4. List hook: "X things that..." or "X mistakes that..."

Generate the top 2 most compelling variants. Output both as separate HTML files: slide-01-a.html and slide-01-b.html.

Phase 5: Output

Return structured JSON and write HTML files:

{
  "carousel_metadata": {
    "topic": "The carousel headline",
    "slide_count": 10,
    "style": "dark",
    "brand_colors": {
      "background": "#1a1a2e",
      "text": "#ffffff",
      "accent": "#e94560"
    },
    "font": "Inter",
    "output_dir": "./carousel-output/"
  },
  "slides": [
    {
      "slide_number": 1,
      "type": "hook",
      "title": "Hook text here",
      "body": null,
      "word_count": 8,
      "file": "slide-01.html"
    },
    {
      "slide_number": 2,
      "type": "context",
      "title": "Context Title",
      "body": "Context body text here",
      "word_count": 22,
      "file": "slide-02.html"
    },
    {
      "slide_number": 3,
      "type": "value",
      "title": "Point Title",
      "body": "Supporting detail for this point",
      "word_count": 18,
      "file": "slide-03.html"
    }
  ],
  "hook_variants": [
    {"variant": "A", "type": "question", "text": "Are you making these CRO mistakes?", "file": "slide-01-a.html"},
    {"variant": "B", "type": "stat", "text": "73% of Shopify stores lose revenue here", "file": "slide-01-b.html"}
  ],
  "files_written": [
    "slide-01.html",
    "slide-01-a.html",
    "slide-01-b.html",
    "slide-02.html",
    "slide-03.html",
    "slide-04.html",
    "slide-05.html",
    "slide-06.html",
    "slide-07.html",
    "slide-08.html",
    "slide-09.html",
    "slide-10.html"
  ],
  "content_quality": {
    "max_words_per_slide": 35,
    "parallel_titles": true,
    "screenshot_test_passed": true,
    "banned_phrases_clear": true
  }
}

Phase 6: Review

Present the slide plan to the user before writing HTML files:

  1. Show the full slide-by-slide content plan
  2. Show both hook variants
  3. Ask if any slides need adjustment
  4. After approval, write the HTML files
  5. Suggest next step: screenshot the HTML files to PNG, or hand off to content-repurposer for multi-channel distribution

Example Usage

Trigger phrases:

  • "Create a LinkedIn carousel about [topic]"
  • "Turn this blog post into carousel slides"
  • "Make a 10-slide carousel on CRO tips"
  • "Build carousel slides from these notes"
  • "Generate a carousel for LinkedIn"
User: Create a LinkedIn carousel about 5 CRO mistakes D2C brands make on Shopify
Assistant: [reads config, structures 10 slides, generates HTML files with dark theme, presents 2 hook variants, writes files to carousel-output/]
User: Turn this blog post into a carousel [pastes content]
Assistant: [extracts key points from content, structures into 8-12 slides, generates HTML with brand colors, returns slide plan + files]

Files bundled with it

These load only when the skill asks for them, so they cost nothing until it runs.

Other skills for the same job

Different authors, same problem. Matched on the words in the skill name, across every library in the catalogue except this one.

Need help setting it up?

This page tells you what carousel-creator does and what it needs. Cheetah builds the agent setup it runs inside: data, CRM, sequencing and the guardrails.

Book a call →

The directory stays free. There is nothing gated behind this.