---
name: carousel-prompt-generator
description: "Generate ready-to-paste image-generation prompts for seamless Instagram carousels. Supports PPAI and mhanifakh brand presets, variable slide counts (3-6), and any topic/CTA. Use when the user wants to create a seamless carousel image prompt."
version: 1.0.0
author: Hermes Agent
license: MIT
metadata:
  hermes:
    tags: [prompt, carousel, instagram, image-generation, branding, ppai, mhanifakh]
    related_skills: [prompt-enchanter, content-agent]
---

# Seamless Carousel Prompt Generator

Generate ready-to-paste image-generation prompts for seamless Instagram carousels — the kind where the hero character and decorative elements physically cross slide boundaries, creating one continuous composition when placed side by side.

## ⚠️ CRITICAL: Output Is a PROMPT, Not an Image

**This skill generates a text prompt for the user to copy-paste into their OWN preferred image generation platform (Midjourney, DALL-E, Leonardo, etc.). NEVER call `image_generate` or any other image generation tool.** The user has their own platform — your job ends at delivering the prompt.

The deliverable is:
1. A ready-to-copy prompt in a code block
2. An input summary for verification
3. Save the prompt to the GitHub repo

Do NOT generate, render, or produce an actual image.

## When to Use

- User wants to create a seamless Instagram carousel
- User says "carousel", "seamless carousel", "swipeable post", or similar
- User references the original carousel prompt template or wants similar output
- User wants to generate a wide continuous image for splitting into slides
- **NOT this skill** when the user wants AutoFeeds Carousel Feeds output (per-slide prompts, 13 template types incl. news) — that is a different register; use `carousel-feeds-prompt-generator-offline` instead.

## Source Material

This generator is built on a proven seamless carousel prompt template originally designed for 4 slides at 1080×1350px with a hot-pink accent. It has been parameterized into a reusable system supporting:
- **2 brand presets**: PPAI (warm light) and mhanifakh (dark neon)
- **Variable slide count**: 3-6 slides
- **Any topic, language, CTA type**

## Variable Classification System

Every part of the carousel prompt is classified into one of three tiers:

| Tier | Symbol | Meaning |
|---|---|---|
| FIXED | 🔒 | Structural backbone — never changes (seamless flow, dimensions, editorial aesthetic, safe zones) |
| BRAND | 🎨 | Swaps between PPAI and mhanifakh design tokens (colors, fonts, floating elements, shadow style) |
| CONTENT | 📝 | Changes per post (topic, headlines, character, CTA, slide count) |

### Fixed Elements (Never Change)
- Instagram carousel format (1080×1350px / 4:5)
- Seamless horizontal flow — elements cross slide boundaries
- Single wide continuous image output (width = NUM_SLIDES × 1080)
- **No visible separators/borders/dividers between slides** — the image is one unbroken canvas. The user cuts it manually.
- Safe zones — nothing important on cut lines
- Slide numbers in top corner (01, 02, ...) with thin accent-colored line
- Floating 3D elements with depth variation (some sharp, some blurred)
- Editorial magazine aesthetic
- Headlines: huge, bold, condensed, uppercase, left-aligned, 40-50% of slide

### Brand-Dependent Elements
See **Brand Presets** section below.

### Content-Dependent Elements
- Topic (free text)
- Hero character description (animal + twist + outfit + accessories)
- Per-slide headlines and sublines
- CTA text and button label
- Which word gets texture fill
- Number of slides (3-6)
- Language (English or Bahasa Indonesia)

---

## Brand Presets

### PPAI (Pijar Pintar AI)
```
BG_HEX:              #F4EFE6 (warm sand)
BG_DESCRIPTION:      Warm sand gradient background with a subtle radial glow — NOT flat white, NOT pure off-white. Rich warm cream with depth.
HEADLINE_COLOR:      #1A1A1A (near-black)
HEADLINE_COLOR_NAME: near-black
HEADLINE_FONT:       Druk Condensed / Anton (heavy condensed)
ACCENT_HEX:          #E8642A (ember orange)
ACCENT_NAME:         ember orange
FLOATING_ELEMENTS:   glowing lightbulbs, orange circuit nodes, floating AI chip fragments, warm gradient orbs
SHADOW_STYLE:        Soft realistic shadows with warm amber undertones
EXTRA_ACCENT_HEX:    (none — single accent)
CHARACTER_VIBE:      tech-forward, curious, approachable
```

### mhanifakh
```
BG_HEX:              #0F0E17 (dark indigo-black)
BG_DESCRIPTION:      Deep dark indigo-black
HEADLINE_COLOR:      #FFFFFE (white)
HEADLINE_COLOR_NAME: white
HEADLINE_FONT:       Druk Wide / Anton (wide bold)
ACCENT_HEX:          #00C2C7 (cyan)
ACCENT_NAME:         cyan
FLOATING_ELEMENTS:   cyan geometric shards, purple gradient orbs, holographic rings, neon particles
SHADOW_STYLE:        Glowing luminous shadows (dark bg inverts shadow logic)
EXTRA_ACCENT_HEX:    #8B5CF6 (purple) — secondary accent for depth layers
CHARACTER_VIBE:      bold, stylish, confident, dark-mode aesthetic
```

> ⚠️ **CRITICAL**: NEVER mix tokens between brands. Each carousel uses ONE preset end-to-end. This is a hard rule — PPAI's warm palette + mhanifakh's dark neon don't combine.

---

## Slide Role Patterns (Scale to Any Slide Count)

### 3-Slide Carousel
| Slide | Role | Purpose |
|---|---|---|
| 1 | Hook | Bold claim + character |
| 2 | Proof | Evidence/examples |
| 3 | CTA | Call to action + character |

### 4-Slide Carousel
| Slide | Role | Purpose |
|---|---|---|
| 1 | Hook | Attention grabber + character |
| 2 | Benefit | Why it matters + character continuation |
| 3 | Proof | Social proof / examples |
| 4 | CTA | Action + character |

### 5-Slide Carousel
| Slide | Role | Purpose |
|---|---|---|
| 1 | Hook | Attention grabber + character |
| 2 | Problem | Pain point / relatable scenario |
| 3 | Solution | How it works |
| 4 | Proof | Results / examples |
| 5 | CTA | Action + character |

### 6-Slide Carousel
| Slide | Role | Purpose |
|---|---|---|
| 1 | Hook | Attention grabber + character |
| 2 | Problem | Pain point |
| 3 | Agitation | Why it's urgent |
| 4 | Solution | How it works |
| 5 | Proof | Results / examples |
| 6 | CTA | Action + character |

---

## Character Placement & Pose Rules (Auto-Computed)

Given `{NUM_SLIDES}`, the character appears on:

- **Slides 1-2** — always (hook impact + continuation creates the seamless effect)
- **Last slide** — always (CTA needs personality)
- **Middle slides** — optional, place if NUM_SLIDES ≥ 5

Character must always **cross a seam** — either body extends past the right edge (slides where character enters from right) or enters from the left edge (continuation slides).

### ⚠️ CRITICAL: One Pose Per Seam Crossing + Anchored Character Rule

**Problem:** Image models render SEPARATE characters when they see "character on slide 1" and "character on slide 2" — even with "same pose" language. They produce duplicate figures with arms reaching across, instead of one continuous body.

**Rule 1 — ONE unified pose per appearance group.** Never describe two different poses for a character that crosses a seam.

**Rule 2 — Anchor the character to ONE slide.** The character's body (head, torso, legs) stays entirely within ONE slide. Only a peripheral body part (arm, paw, tail, wing, held object) extends past the edge into the neighboring slide. This gives the seamless effect without requiring the model to split a body across a cut line.

**Rule 3 — Explicit anti-duplication language.** Always include: "There is only ONE [character] in this image. Do NOT render a second copy of the [character] on any other slide."

**Example — WRONG (two poses, body split):**
```
- Slide 1: Character stands confidently, body extending past right edge.
- Slide 2: Character continues from left edge, same pose.
```

**Example — WRONG (triggers duplication):**
```
- Slide 1: Character on the right side, body extends past right edge into slide 2.
- Slide 2: Character continues from the left edge.
```

**Example — RIGHT (anchored, arm-only crossing):**
```
- Slide 1: Character stands on the right side, full body within the slide. Its left arm extends past the right edge holding a glowing tablet.
- Slide 2: Only the character's arm and the tablet it holds are visible on the left edge — the rest of the character is on slide 1.
```

**Anti-duplication banner (include in every prompt):**
```
IMPORTANT: There is only ONE [sun bear] in this entire image. The [sun bear] appears as a single character anchored on slide 1 and slide 4. Do NOT render a second copy of the [sun bear] on slide 2 — only its arm crosses into slide 2.
```

### Character Appearance Groups

| Slides | Group | Pose Rule |
|---|---|---|
| 1 | Hook group | Character anchored entirely on slide 1. Only an arm/paw/tail/held object crosses into slide 2. ONE pose. |
| Last (4, 5, or 6) | CTA group | Character anchored entirely on last slide. Self-contained pose, no seam crossing needed. |
| Middle (if ≥5 slides) | Optional | Self-contained pose on one slide, no seam crossing |

**Anti-duplication:** Every prompt must state "There is only ONE [character] in this image" and explicitly say NOT to render a copy on the continuation slide.

---

## CTA Variants

| CTA Type | Button Text Example | Slide 4/Last Description |
|---|---|---|
| **Comment keyword** ⭐ DEFAULT | `COMMENT "AI"` | Headline with texture word + large accent button + IG comment UI mock |
| Follow account | `FOLLOW @ppai.id` | Headline + smaller accent-colored follow button with IG icon |
| DM for guide | `DM "GUIDE"` | Headline + accent chat-bubble style button |
| Link in bio | `LINK IN BIO →` | Headline + arrow pointing toward bio + accent button |
| Swipe up | `SWIPE UP ↑` | Headline + upward arrow accent element |

### Comment Keyword CTA Specifics (DEFAULT — ManyChat Trigger)
This is the default CTA type. The keyword triggers an automated DM via ManyChat (or similar).

- **Keyword selection**: 1 word, ALL CAPS, easy to type (e.g., "AI", "GUIDE", "TOOLS", "ADS"). Must be memorable and unique to the post topic.
- **Button design**: Large accent-colored rounded rectangle/pill at bottom of last slide. Text: `COMMENT "[KEYWORD]"` in white. Below the button, small text: "We'll DM you the [free guide/checklist/video] instantly"
- **Visual emphasis**: The keyword itself should be the most prominent text element on the CTA slide. Consider giving the keyword a texture fill (leopard print, gradient, etc.) for extra attention.
- **IG comment mockup** (optional): A small mock Instagram comment input field below or beside the button showing the keyword being typed, with a small "Post" button — reinforces the action visually.
- **Character pose**: Pointing toward the button, looking at the viewer, or holding up the keyword as a sign/card.

### Brand → Default Keywords

| Brand | Account Handle | Common Keywords |
|---|---|---|
| PPAI | @ppai.id | AI, GUIDE, TOOLS, START, LEARN |
| mhanifakh | @mhanifakh | ADS, SCALING, ROI, TEMPLATE |

### Follow Account CTA Specifics
When the CTA is explicitly "follow the account" (not the default):
- Replace the comment-style button with a **follow button** styled like Instagram's UI: rounded pill shape, accent-colored, with a small "+" or IG icon
- Add small text: "Follow @[handle] for more"
- No texture-fill word needed (that's specific to comment-style CTAs)
- Character pose should be inviting (pointing, waving, or looking toward the button)

---

## Generator Workflow (For the Agent)

When the user asks to generate a carousel prompt:

### Step 1: Collect Required Inputs

Ask the user for these (use `clarify` if not provided):

```
BRAND:          [ppai | mhanifakh]
NUM_SLIDES:     [3-6, default 4]
TOPIC:          [one sentence describing what the carousel is about]
LANGUAGE:       [English | Bahasa Indonesia]
HERO_CHARACTER: [animal + twist + outfit + accessories + held items]
CTA_TYPE:       [comment (default) | follow | dm | link_in_bio | swipe_up]
CTA_KEYWORD:    [1 word, ALL CAPS — e.g., AI, GUIDE, TOOLS, ADS]
```

If the user provides partial info, fill gaps with sensible defaults:
- NUM_SLIDES default: 4
- LANGUAGE default: match user's message language
- HERO_CHARACTER: if not provided, suggest one based on brand + topic
- CTA_TYPE default: **comment** (ManyChat trigger keyword)
- CTA_KEYWORD default: pick from brand keyword table based on topic relevance (e.g., AI tools post → "TOOLS", general intro → "AI")
- If user says "follow CTA" or "just want followers" → use follow type instead

### Step 2: Auto-Compute Derived Values

```
CANVAS_WIDTH = NUM_SLIDES × 1080
CHARACTER_SLIDES = [1, 2] + ([last] always) + ([middle] if NUM_SLIDES >= 5)
SLIDE_ROLES = lookup from Slide Role Patterns table
```

### Step 3: Generate Per-Slide Content

For each slide, create headline + subline based on:
- The role (hook/benefit/problem/solution/proof/cta)
- The topic
- The brand voice (PPAI = educational, encouraging; mhanifakh = bold, direct, persuasive)
- The language

Headlines should be:
- ALL CAPS, short (3-6 words)
- Punchy and attention-grabbing
- In the selected language

### Step 4: Assemble Final Prompt

Use the master template below. Replace all `{{VARIABLES}}` with concrete values.

### Step 5: Present to User

Show the generated prompt in a code block ready to copy-paste. Also show the input summary so the user can verify.

### Step 6: Save to GitHub Repo

Save every generated prompt to the workspace repo for backup and easy copy-paste access.

**Repo:** `ppai-hermes-workspace` → `workspace/projects/{brand}/carousels/`

**File naming convention:**
```
YYMMDD-NN-slug.md
```
- `YYMMDD` — date prefix (e.g., `260711` = July 11, 2026)
- `NN` — sequential number per brand per day (01, 02, 03...)
- `slug` — short kebab-case description (e.g., `ai-changing-everything`)

**File structure:**
```markdown
# {Brand} Carousel {NN} — "{Headline}"

> **Brand:** {brand} · **Slides:** {N} · **CTA:** Comment "{KEYWORD}" (ManyChat trigger) · **Character:** {character}
> **Created:** YYYY-MM-DD · **Status:** Ready to generate

---

## Copy-Paste Prompt

```
{full generated prompt}
```
```

**After saving:** `git add` → `git commit -m "feat: carousel prompt — {brand} {topic}"` → `git push origin main`

---

## Master Template

Replace all `{{VARIABLES}}` and present the result in a single code block.

**Layout rules (include ALL of these in every prompt):**
1. "single horizontal strip" + "NOT a 2x2 grid" + "NOT a grid"
2. "no visible separators, borders, dividers, or panel lines between slides — one unbroken canvas"
3. "Generate exactly {{NUM_SLIDES}} slides — do not omit any"
4. Background must be a rich gradient/texture, NOT flat white or flat off-white

**Anti-duplication banner:** Include after SLIDE CONTENT, before the CRITICAL line:

```
IMPORTANT: There is only ONE {{CHARACTER_NAME}} in this entire image. The {{CHARACTER_NAME}} is anchored on slide 1 (with only its arm crossing into slide 2) and on the last slide. Do NOT render a second copy of the {{CHARACTER_NAME}} on slide 2 or any other slide — only decorative elements (orbs, floating objects, circuit lines) cross the other seams.
```

```
Design a seamless Instagram carousel — {{NUM_SLIDES}} slides, each 1080x1350px (4:5), that connect into ONE continuous horizontal composition. When placed side by side, the slides must flow into each other with no visible seams: the hero character and decorative elements physically cross slide boundaries (e.g., the character's body starts on slide 1 and continues onto slide 2).

TOPIC: {{TOPIC}}

HERO CHARACTER: {{HERO_CHARACTER}}. The character appears on slides {{CHARACTER_SLIDES}} in different poses, always partially crossing into the neighboring slide.

STYLE:
- {{BG_DESCRIPTION}} studio background ({{BG_HEX}}) across all slides
- Huge bold condensed uppercase sans-serif headlines in {{HEADLINE_COLOR_NAME}} ({{HEADLINE_COLOR}}), {{HEADLINE_FONT}} style, left-aligned, taking 40-50% of the slide
- One accent color: {{ACCENT_NAME}} ({{ACCENT_HEX}}) — used for slide numbers, underlines, small highlight elements, and the CTA button{{EXTRA_ACCENT_CLAUSE}}
- Each slide numbered in the top corner: 01, 02, ... {{NUM_SLIDES_PADDED}} with a thin accent-colored line
- Small floating 3D elements scattered across slides and crossing seams: {{FLOATING_ELEMENTS}} — some sharp, some blurred for depth
- {{SHADOW_STYLE}}, editorial magazine feel, lots of {{WHITE_SPACE_TERM}}

SLIDE CONTENT:
{{SLIDE_CONTENT_BLOCK}}

CRITICAL: Generate as one wide continuous image ({{CANVAS_WIDTH}}x1350px) so the composition flows across all {{NUM_SLIDES}} slides, designed to be cut into {{NUM_SLIDES}} equal parts. Nothing important (text, faces) should sit on a cut line — only decorative elements and the character's body cross the seams.
```

---

## Improvement Ideas (Future Versions)

These are known gaps that could be addressed in future skill updates:

1. **Brand preset extension** — Add a mechanism for defining new brand presets beyond PPAI/mhanifakh (e.g., a generic template with blank tokens)
2. **Font availability check** — Druk is a commercial font; add fallback guidance for models that don't know it (Anton is the free equivalent)
3. **Multi-character support** — Currently only supports one hero character; could support duos or rotating characters
4. **Splitting guide** — Add a companion guide on how to split the wide image into N equal parts (ImageMagick commands or tool recommendations)
5. **Aspect ratio variants** — Currently only 4:5 (1080×1350); could support 1:1 square or 9:16 story format
6. **Bilingual carousel** — Support carousels with mixed language (e.g., English headline + Indonesian subline)
7. **Negative prompt section** — Add recommended negative prompts for image models that support them (e.g., "no watermark, no text errors, no distorted faces")
8. **Style reference images** — Add guidance on pairing the text prompt with style reference images for better consistency
9. **Batch generation** — Add a workflow for generating multiple carousel prompts in one session (e.g., a content calendar of 5 posts)
