Tool Stack: Follow ~/.claude/skills/_shared/tool-stack.md for ALL tool choices.
Quality Gates: Follow ~/.claude/skills/_shared/quality-gates.md for ALL quality checks.
Instagram Carousel Maker
Interactive Decision Points
1. Generation Mode
Ask the user:
- Question: "How should we create the carousel slides?"
- Options:
- "Screenshot-Based (Recommended)" — Real frames from source video, preserves exact faces/details
- "AI-Generated" — Gemini Pro generates stylized slides from scratch
- "Watermark Removal Only" — Clean up existing Gemini-generated images
2. Carousel Format
Ask the user:
- Question: "What format fits your content?"
- Options:
- "The List" — "5 Ways to..." "7 Mistakes..." (educational, high saves)
- "Framework Reveal" — "The 3-Step System for..." (authority, high follows)
- "Myth-Bust" — "You've been told X. Here's the truth." (contrarian, high comments)
- "Story Arc" — "This one decision changed everything." (narrative, high engagement)
3. Visual Style
Ask the user:
- Question: "What visual style do you want?"
- Options:
- "Screenshot + Annotation (Recommended)" — Real frames with text overlays and highlights (Mode B)
- "Keynote (Luis Carrillo Original)" — Black background, Inter font, Apple colors, massive typography, one idea per slide. Jobs-style story arc. Pure #000000, white text, accent colors (blue #2997ff, green #30d158, purple #bf5af2, red #ff453a). Each slide = downloadable 4:5 image.
- "Cards Against Humanity" — Stark white, black border, bold Helvetica
- "Handwritten Whiteboard" — Hand-drawn markers, slightly imperfect
- "Custom / Brand Match" — Provide a reference image to clone the vibe
Mode Decision Logic
| Signal |
Mode |
| Real person on camera |
Mode B (screenshot) |
| Product demos / physical items |
Mode B (screenshot) |
| Concept / educational / no face |
Mode A (AI-generated) |
| User says "use frames" or "screenshots" |
Mode B (screenshot) |
The 5-Step Workflow
| Step |
What |
Details |
| 1 |
Content Ingestion |
Video link, transcript, or topic + character ref + aesthetic ref |
| 2 |
Format Selection |
List / Myth-Bust / Before-After / Story / Framework / Hot Take |
| 3 |
Style & CTA |
7 visual styles + 5 CTA options |
| 4 |
Script + Visual Plan |
Slide-by-slide text + visual descriptions |
| 5 |
Generation + Cleanup |
Generate → watermark removal → rename → verify |
Readability Rules (ENFORCE ALWAYS)
- Max 15 words per slide (8-12 ideal)
- One idea per slide — if it needs a comma, split it
- No paragraphs — bullet points or single lines only
- High contrast — black on white or white on black
- Readable on mobile without zooming
- ALWAYS center-aligned, both axes
- Minimum 10% margin on all sides
Tools
| Tool |
Purpose |
| Gemini Pro |
Generate & edit slides |
| yt-dlp |
Download source videos |
| ffmpeg |
Extract frames (Mode B) |
| Pillow (PIL) |
Canvas layout & text overlays (Mode B) |
| Google Drive MCP |
Access Drive folders |
Trust Enforcement (Inherited — Global Law, Mar 16, 2026)
| Pillar |
Rule |
| Verify Before Claim |
Tool call before stating facts. Never answer from memory alone. |
| Data Accuracy |
All handles, URLs, IDs from source files ONLY. Never fabricate. |
| Complete The Ask |
Do EVERYTHING the user asked. All items. Not just the first one. |
| Show Your Work |
Open Kitchen — show every step as it happens. No black boxes. |
| Source Everything |
Cite where information comes from. |
| Internet-First |
Fetch official docs before advising on any tool/API. |
Enforcement: trust-guardian.js hook + quality-gates.md Trust Gate. Full: ~/.claude/skills/trust/SKILL.md
Gate Protocol
- Pre-flight: Verify image generation tool is available (Glif, DALL-E, etc.). Confirm style requirements and dimensions. Check for brand guidelines if client work.
- Mid-flight: Validate prompt quality before generation. Review output for quality, accuracy, and brand alignment. Iterate if first generation misses the brief.
- Post-flight: Verify output image exists at expected path. Check resolution and format. Confirm no artifacts, text errors, or brand violations.
AI Agent Readiness Layer
I/O Schema
| Field |
Type |
Required |
Example |
input_source |
string — URL | filepath | raw_text |
YES |
"https://youtube.com/..." |
mode |
enum — A | B | watermark_only |
NO (auto-detected) |
"B" |
format |
enum — list | framework | myth-bust | story |
NO (prompted) |
"list" |
style |
enum — keynote | cards | whiteboard | screenshot | custom |
NO (prompted) |
"keynote" |
slide_count |
int 8–10 |
NO (default: 10) |
9 |
client_name |
string |
NO |
"Ryan Magin" |
output_dir |
filepath |
NO (default: ~/Downloads/[name]/clean/) |
"~/Downloads/carousel-ep42/clean/" |
output_files |
array[filepath] — PNG, 4:5, ≥1080px wide |
YES (post-flight) |
["01.png", "02.png", ...] |
slide_count_verified |
boolean |
YES (post-flight) |
true |
watermarks_removed |
boolean |
YES (Mode A post-flight) |
true |
Error Handling Table
| Error |
Trigger |
Agent Action |
| No input provided |
input_source empty |
BLOCK: "Provide a video link, transcript, or topic to continue." |
| yt-dlp download fails |
Non-zero exit code |
Retry once. If fail: INFORM "Download failed — paste transcript manually." |
| Gemini API error |
HTTP 4xx/5xx from Gemini |
Retry once with simplified prompt. If fail: BLOCK + log error. |
| ffmpeg frame extraction fails |
No frames in output dir |
INFORM: "Frame extraction failed. Check video file path and ffmpeg install." |
| design-system.md unreachable |
File not found |
BLOCK for Keynote style: "Cannot load design system. Check /keynote-generator/references/design-system.md" |
| Slide word count > 15 |
Word count check on script |
BLOCK generation: rewrite offending slide before continuing |
| Watermark not removed |
Watermark still visible post-script |
Re-run removal with higher threshold. If 2x fail: INFORM user to manually crop |
| Output dir write error |
Permission denied |
INFORM: "Cannot write to [dir]. Check permissions or specify alternate path." |
| Slide count mismatch |
len(output_files) != slide_count |
Flag missing slides, retry generation for missing indices only |
Handoff Labels
| Step |
Handoff Type |
Condition |
| Mode selection (ambiguous input) |
APPROVAL-REQUIRED |
Cannot auto-detect mode — present options, await user choice |
| Style selection |
APPROVAL-REQUIRED |
No style specified and no client brand guide available |
| Slide script review |
INFORM |
Script generated — show to user before image generation begins |
| Generation complete |
INFORM |
All slides generated and renamed — surface output path |
| Error recovery (retries exhausted) |
APPROVAL-REQUIRED |
Cannot auto-resolve — surface error + options to user |
| Clean final delivery |
AUTONOMOUS |
All gates pass, files verified, path confirmed — no user action needed |
Exact Tool Calls
# Download video
/opt/homebrew/bin/yt-dlp -f "bestvideo[ext=mp4]+bestaudio[ext=m4a]/mp4" \
--cookies-from-browser chrome \
-o "~/Downloads/[carousel-name]/source.%(ext)s" "[VIDEO_URL]"
# Extract frames (Mode B) — 1 frame per second
ffmpeg -i ~/Downloads/[carousel-name]/source.mp4 \
-vf "fps=1" ~/Downloads/[carousel-name]/frames/frame_%04d.png
# Transcribe audio
groq-transcribe ~/Downloads/[carousel-name]/source.mp4
# Run watermark removal
/opt/homebrew/bin/python3.13 \
~/.claude/plugins/cache/every-marketplace/compound-engineering/2.28.0/skills/gemini-imagegen/scripts/remove_watermark.py \
--input ~/Downloads/[carousel-name]/raw/ \
--output ~/Downloads/[carousel-name]/clean/
# Rename slides sequentially
/opt/homebrew/bin/python3.13 -c "
import os, glob
files = sorted(glob.glob('~/Downloads/[carousel-name]/clean/*.png'))
for i, f in enumerate(files, 1):
os.rename(f, f'~/Downloads/[carousel-name]/clean/{i:02d}.png')
"
Full Specification
Complete details, decision trees, protocols, and implementation specs: references/full-details.md
Change Log
- [2026-03-09]: Context Diet — split 294 lines into routing card (171 lines) + references/full-details.md (143 lines). Zero content deleted. By skill-diet.py.
- [2026-03-02]: AI Agent Readiness upgrade — scored 4/10, upgraded to 10/10. By Agent Luis.
- [2026-03-02]: War Room Tier 2 — content quality upgrade (gate→image).
- [2026-03-02]: War Room Tier 1 audit — skill structure verified and standardized.
1---2name: carousel-maker3description: This skill should be used when creating Instagram carousels from video content, transcripts, topics, or ideas. Two generation modes: Mode A (AI-generated slides, styles 1-6) and Mode B (screenshot-based slides, style 7). Includes automatic watermark removal. Triggers: 'make a carousel', 'create carousel', 'instagram carousel', 'carousel from this video', 'turn this into a carousel', any video link with carousel intent.4---56**Tool Stack:** Follow `~/.claude/skills/_shared/tool-stack.md` for ALL tool choices.7**Quality Gates:** Follow `~/.claude/skills/_shared/quality-gates.md` for ALL quality checks.89# Instagram Carousel Maker1011## Interactive Decision Points1213### 1. Generation Mode1415Ask the user:16- **Question:** "How should we create the carousel slides?"17- **Options:**18 - "Screenshot-Based (Recommended)" — Real frames from source video, preserves exact faces/details19 - "AI-Generated" — Gemini Pro generates stylized slides from scratch20 - "Watermark Removal Only" — Clean up existing Gemini-generated images2122### 2. Carousel Format2324Ask the user:25- **Question:** "What format fits your content?"26- **Options:**27 - "The List" — "5 Ways to..." "7 Mistakes..." (educational, high saves)28 - "Framework Reveal" — "The 3-Step System for..." (authority, high follows)29 - "Myth-Bust" — "You've been told X. Here's the truth." (contrarian, high comments)30 - "Story Arc" — "This one decision changed everything." (narrative, high engagement)3132### 3. Visual Style3334Ask the user:35- **Question:** "What visual style do you want?"36- **Options:**37 - "Screenshot + Annotation (Recommended)" — Real frames with text overlays and highlights (Mode B)38 - "Keynote (Luis Carrillo Original)" — Black background, Inter font, Apple colors, massive typography, one idea per slide. Jobs-style story arc. Pure #000000, white text, accent colors (blue #2997ff, green #30d158, purple #bf5af2, red #ff453a). Each slide = downloadable 4:5 image.39 - "Cards Against Humanity" — Stark white, black border, bold Helvetica40 - "Handwritten Whiteboard" — Hand-drawn markers, slightly imperfect41 - "Custom / Brand Match" — Provide a reference image to clone the vibe4243## Mode Decision Logic4445| Signal | Mode |46|--------|------|47| Real person on camera | **Mode B** (screenshot) |48| Product demos / physical items | **Mode B** (screenshot) |49| Concept / educational / no face | Mode A (AI-generated) |50| User says "use frames" or "screenshots" | **Mode B** (screenshot) |5152## The 5-Step Workflow5354| Step | What | Details |55|------|------|---------|56| 1 | Content Ingestion | Video link, transcript, or topic + character ref + aesthetic ref |57| 2 | Format Selection | List / Myth-Bust / Before-After / Story / Framework / Hot Take |58| 3 | Style & CTA | 7 visual styles + 5 CTA options |59| 4 | Script + Visual Plan | Slide-by-slide text + visual descriptions |60| 5 | Generation + Cleanup | Generate → watermark removal → rename → verify |6162## Readability Rules (ENFORCE ALWAYS)63641. Max 15 words per slide (8-12 ideal)652. One idea per slide — if it needs a comma, split it663. No paragraphs — bullet points or single lines only674. High contrast — black on white or white on black685. Readable on mobile without zooming696. ALWAYS center-aligned, both axes707. Minimum 10% margin on all sides7172## Tools7374| Tool | Purpose |75|------|---------|76| Gemini Pro | Generate & edit slides |77| yt-dlp | Download source videos |78| ffmpeg | Extract frames (Mode B) |79| Pillow (PIL) | Canvas layout & text overlays (Mode B) |80| Google Drive MCP | Access Drive folders |818283## Trust Enforcement (Inherited — Global Law, Mar 16, 2026)8485| Pillar | Rule |86|--------|------|87| **Verify Before Claim** | Tool call before stating facts. Never answer from memory alone. |88| **Data Accuracy** | All handles, URLs, IDs from source files ONLY. Never fabricate. |89| **Complete The Ask** | Do EVERYTHING the user asked. All items. Not just the first one. |90| **Show Your Work** | Open Kitchen — show every step as it happens. No black boxes. |91| **Source Everything** | Cite where information comes from. |92| **Internet-First** | Fetch official docs before advising on any tool/API. |9394Enforcement: `trust-guardian.js` hook + `quality-gates.md` Trust Gate. Full: `~/.claude/skills/trust/SKILL.md`9596## Gate Protocol97- **Pre-flight:** Verify image generation tool is available (Glif, DALL-E, etc.). Confirm style requirements and dimensions. Check for brand guidelines if client work.98- **Mid-flight:** Validate prompt quality before generation. Review output for quality, accuracy, and brand alignment. Iterate if first generation misses the brief.99- **Post-flight:** Verify output image exists at expected path. Check resolution and format. Confirm no artifacts, text errors, or brand violations.100101---102103## AI Agent Readiness Layer104105### I/O Schema106107| Field | Type | Required | Example |108|-------|------|----------|---------|109| `input_source` | `string` — URL \| filepath \| raw_text | YES | `"https://youtube.com/..."` |110| `mode` | `enum` — A \| B \| watermark_only | NO (auto-detected) | `"B"` |111| `format` | `enum` — list \| framework \| myth-bust \| story | NO (prompted) | `"list"` |112| `style` | `enum` — keynote \| cards \| whiteboard \| screenshot \| custom | NO (prompted) | `"keynote"` |113| `slide_count` | `int` 8–10 | NO (default: 10) | `9` |114| `client_name` | `string` | NO | `"Ryan Magin"` |115| `output_dir` | `filepath` | NO (default: `~/Downloads/[name]/clean/`) | `"~/Downloads/carousel-ep42/clean/"` |116| `output_files` | `array[filepath]` — PNG, 4:5, ≥1080px wide | YES (post-flight) | `["01.png", "02.png", ...]` |117| `slide_count_verified` | `boolean` | YES (post-flight) | `true` |118| `watermarks_removed` | `boolean` | YES (Mode A post-flight) | `true` |119120### Error Handling Table121122| Error | Trigger | Agent Action |123|-------|---------|--------------|124| No input provided | `input_source` empty | BLOCK: "Provide a video link, transcript, or topic to continue." |125| yt-dlp download fails | Non-zero exit code | Retry once. If fail: INFORM "Download failed — paste transcript manually." |126| Gemini API error | HTTP 4xx/5xx from Gemini | Retry once with simplified prompt. If fail: BLOCK + log error. |127| ffmpeg frame extraction fails | No frames in output dir | INFORM: "Frame extraction failed. Check video file path and ffmpeg install." |128| design-system.md unreachable | File not found | BLOCK for Keynote style: "Cannot load design system. Check /keynote-generator/references/design-system.md" |129| Slide word count > 15 | Word count check on script | BLOCK generation: rewrite offending slide before continuing |130| Watermark not removed | Watermark still visible post-script | Re-run removal with higher threshold. If 2x fail: INFORM user to manually crop |131| Output dir write error | Permission denied | INFORM: "Cannot write to [dir]. Check permissions or specify alternate path." |132| Slide count mismatch | `len(output_files) != slide_count` | Flag missing slides, retry generation for missing indices only |133134### Handoff Labels135136| Step | Handoff Type | Condition |137|------|-------------|-----------|138| Mode selection (ambiguous input) | APPROVAL-REQUIRED | Cannot auto-detect mode — present options, await user choice |139| Style selection | APPROVAL-REQUIRED | No style specified and no client brand guide available |140| Slide script review | INFORM | Script generated — show to user before image generation begins |141| Generation complete | INFORM | All slides generated and renamed — surface output path |142| Error recovery (retries exhausted) | APPROVAL-REQUIRED | Cannot auto-resolve — surface error + options to user |143| Clean final delivery | AUTONOMOUS | All gates pass, files verified, path confirmed — no user action needed |144145### Exact Tool Calls146147```bash148# Download video149/opt/homebrew/bin/yt-dlp -f "bestvideo[ext=mp4]+bestaudio[ext=m4a]/mp4" \150 --cookies-from-browser chrome \151 -o "~/Downloads/[carousel-name]/source.%(ext)s" "[VIDEO_URL]"152153# Extract frames (Mode B) — 1 frame per second154ffmpeg -i ~/Downloads/[carousel-name]/source.mp4 \155 -vf "fps=1" ~/Downloads/[carousel-name]/frames/frame_%04d.png156157# Transcribe audio158groq-transcribe ~/Downloads/[carousel-name]/source.mp4159160# Run watermark removal161/opt/homebrew/bin/python3.13 \162 ~/.claude/plugins/cache/every-marketplace/compound-engineering/2.28.0/skills/gemini-imagegen/scripts/remove_watermark.py \163 --input ~/Downloads/[carousel-name]/raw/ \164 --output ~/Downloads/[carousel-name]/clean/165166# Rename slides sequentially167/opt/homebrew/bin/python3.13 -c "168import os, glob169files = sorted(glob.glob('~/Downloads/[carousel-name]/clean/*.png'))170for i, f in enumerate(files, 1):171 os.rename(f, f'~/Downloads/[carousel-name]/clean/{i:02d}.png')172"173```174175176## Full Specification177178Complete details, decision trees, protocols, and implementation specs: [references/full-details.md](references/full-details.md)179180181## Change Log182- [2026-03-09]: Context Diet — split 294 lines into routing card (171 lines) + references/full-details.md (143 lines). Zero content deleted. By skill-diet.py.183- [2026-03-02]: AI Agent Readiness upgrade — scored 4/10, upgraded to 10/10. By Agent Luis.184- [2026-03-02]: War Room Tier 2 — content quality upgrade (gate→image).185- [2026-03-02]: War Room Tier 1 audit — skill structure verified and standardized.