home / skills / blitzreels / agent-skills / blitzreels-carousels

blitzreels-carousels skill

/skills/blitzreels-carousels

This skill helps you create TikTok and Instagram carousels as polished slideshow videos with timed image slides and text overlays.

npx playbooks add skill blitzreels/agent-skills --skill blitzreels-carousels

Review the files below or copy the command above to add this skill to your agents.

Files (8)
SKILL.md
11.7 KB
---
name: blitzreels-carousels
description: Create TikTok/Instagram carousel projects (still slides + text overlays) via the BlitzReels API.
---

# BlitzReels Carousels (TikTok + Instagram)

This skill focuses on creating **still-slide carousel projects**: each slide is typically a full-screen image with text on top.

Key idea: model a carousel as a normal BlitzReels project, with:

- `project_type: "carousel"`
- Slide backgrounds uploaded as **image media assets**
- Slides laid out as **timeline media items** (one per slide segment)
- Text placed as **text overlays** aligned to each slide’s time window

## Important Limitations (Current Public API)

- The public OpenAPI spec currently does not expose a ZIP export of per-slide images. Treat carousels as a **slideshow video**: image-per-slide on the timeline + timed text overlays + `mp4` export.
- **Safe area presets are metadata only** — they don't auto-position text. You must manually set `position_x`/`position_y` (see Safe Area Positioning section below).

Always validate what's available via OpenAPI:

- `https://www.blitzreels.com/api/openapi.json`

## Platform Presets

### TikTok (Photo Mode)
- Aspect ratio: `9:16` ✅
- `safe_area_preset`: `tiktok_9_16` (metadata only — manual positioning required)

### Instagram Feed Carousel
- Aspect ratio: `4:5` ✅ (now supported as of 2026-02-12)
- `safe_area_preset`: `instagram_4_5` (metadata only — manual positioning required)

Instagram square is also common:
- Aspect ratio: `1:1` ✅
- `safe_area_preset`: `instagram_1_1` (metadata only — manual positioning required)

## Carousel Project Support

As of 2026-02-12, the public API now supports:
- ✅ `project_type: "carousel"` — creates a carousel-specific project
- ✅ `carousel_settings` (JSONB) — stores platform, safe area preset, slide count, etc.
- ✅ `aspect_ratio: "4:5"` — Instagram portrait format now supported

## Workflow (Manual Carousel Assembly)

1. Create a carousel project (`POST /projects`)
2. Upload slide background images (`POST /projects/{id}/media` with `url` or presigned upload)
3. Insert each image on the timeline (`POST /projects/{id}/timeline/media`) at `start_seconds = slideIndex * slideDuration`
4. Add text overlays for each slide (`POST /projects/{id}/text-overlays`) with matching `start_seconds` and `duration_seconds`
5. Fetch context to confirm layout (`GET /projects/{id}/context?mode=timeline`)
6. Export an `mp4` slideshow video (`POST /projects/{id}/export` with `format:"mp4"`)

## Workflow (One-Call Generation)

This repo includes `scripts/generate.sh` for an experimental one-call carousel generator, but it is not currently part of the public OpenAPI spec. Prefer the manual assembly flow above.

## Quickstart (Script)

This skill includes `scripts/carousel.sh` which creates a carousel project and inserts slide images + optional per-slide titles.

```bash
export BLITZREELS_API_KEY="br_live_xxxxx"
export BLITZREELS_ALLOW_EXPENSIVE=1  # only needed if you export a video preview

# TikTok: 3 slides (URLs) + titles
bash scripts/carousel.sh \
  --platform tiktok \
  --name "My TikTok Carousel" \
  --slide-duration 3 \
  --images "https://.../1.jpg|https://.../2.jpg|https://.../3.jpg" \
  --titles "Hook line|Main point|CTA"

# Instagram feed: 4:5
bash scripts/carousel.sh \
  --platform instagram \
  --aspect 4:5 \
  --name "My IG Carousel" \
  --images "https://.../1.jpg|https://.../2.jpg"
```

## API Endpoints Used

| Method | Path | Purpose |
|--------|------|---------|
| POST | `/projects` | Create a project (carousel fields may be ignored if not supported) |
| POST | `/projects/{id}/media` | Upload/import slide background images |
| POST | `/projects/{id}/timeline/media` | Insert images into the timeline (one segment per slide) |
| POST | `/projects/{id}/text-overlays` | Add slide text overlays (time-windowed) |
| GET | `/projects/{id}/context?mode=timeline` | Inspect timing + overlay placement |
| POST | `/projects/{id}/export` | Export slideshow `mp4` (expensive) |

## Export Slideshow (MP4)

```bash
export BLITZREELS_ALLOW_EXPENSIVE=1

# Slideshow video
bash scripts/blitzreels.sh POST "/projects/${PROJECT_ID}/export" '{"resolution":"1080p","format":"mp4"}'
```

## Marketing Slide Structure

Carousels perform best when structured for social media consumption:

**3-Slide Formula (TikTok):**
1. **Hook (Slide 1)**: Attention-grabbing statement or question (e.g., "3 Mistakes Killing Your Startup")
2. **Value (Slide 2)**: Core insight or key points
3. **CTA (Slide 3)**: Clear next step (e.g., "Save This Post" / "Follow for More")

**5-Slide Formula (Instagram Feed):**
1. **Hook**: Compelling title/question
2-4. **Key Points**: 3 actionable insights (one per slide)
5. **CTA + Recap**: Summary + follow/save/comment prompt

**Template Patterns:**
- Educational: "How to [X]" → Steps 1-3 → Recap
- Listicle: "[N] Ways to [X]" → Point 1 → Point 2 → Point 3 → Summary
- Storytelling: Problem → Struggle → Solution → Result → CTA

## Readability Rules (CRITICAL)

**Character & Line Limits:**
- **Max 40 chars/line** (mobile readable at thumb-scrolling speed)
- **Max 4 lines/slide** (avoid visual clutter)
- Break long text into multiple slides rather than cramming

**Contrast & Legibility:**
- **WCAG AA minimum**: 4.5:1 contrast ratio (text vs background)
- **Always enable text stroke**: 6px black stroke on white text (or vice versa)
- Use web contrast checkers: [WebAIM Contrast Checker](https://webaim.org/resources/contrastchecker/)

**Font Sizing:**
- **Titles**: 64-80px (hook slides, CTAs)
- **Body text**: 48-64px (key points)
- **Minimum**: 48px (anything smaller risks illegibility on mobile)

**Typography Best Practices:**
- Bold fonts (700+ weight) for better mobile readability
- Center-aligned text for carousels (easier to scan)
- Sans-serif fonts (Inter, Montserrat, Poppins) over serif

## Safe Area Positioning (Platform-Specific)

The API supports `carousel_settings.safe_area_preset`, but you must manually position text to respect UI danger zones.

### TikTok Photo Mode (`9:16`)

**Danger Zones (Absolute Pixels @ 1080x1920):**
- **Right edge**: Avoid rightmost 120px (share/like/comment buttons)
- **Bottom**: Avoid bottom 450px (username, caption overlay, sound)
- **Top**: Avoid top 80px (status bar, back button)

**Safe Positioning (Normalized Coords):**
- **Top-center safe**: `position_x: 0.5, position_y: 0.18` (hook slides)
- **Middle-left safe**: `position_x: 0.35, position_y: 0.5` (body text, avoids right UI)
- **Bottom safe**: `position_x: 0.5, position_y: 0.65` (max safe before captions)

**TikTok Best Practices:**
- Always offset text slightly left (`position_x: 0.45` instead of `0.5`) to avoid right-side buttons
- Use `position: "top"` preset for simplicity
- Test with TikTok watermark/UI overlay in mind

### Instagram Feed Carousel (`4:5` or `1:1`)

**Danger Zones (Absolute Pixels @ 1080x1350 for 4:5):**
- **Bottom**: Avoid bottom 420px (username, caption preview, action buttons)
- **Edges**: Keep text 80px from all edges (safe margins)

**Safe Positioning (Normalized Coords):**
- **Top-center safe**: `position_x: 0.5, position_y: 0.15` (titles)
- **Middle-center safe**: `position_x: 0.5, position_y: 0.45` (body text)
- **Bottom safe (max)**: `position_x: 0.5, position_y: 0.6` (before caption zone)

**Instagram Best Practices:**
- Center all text (Instagram's feed is symmetrical)
- Use consistent vertical positioning across all slides (e.g., always `position_y: 0.18`)
- Leave generous bottom margin (users expect captions below)

### Square Format (`1:1`)

**Danger Zones (Absolute Pixels @ 1080x1080):**
- **Bottom**: Avoid bottom 380px (captions, profile link)
- **Edges**: 80px margins on all sides

**Safe Positioning:**
- **Top-center**: `position_x: 0.5, position_y: 0.15`
- **Middle-center**: `position_x: 0.5, position_y: 0.5`

## Text Overlay Mandate (CRITICAL)

**ALWAYS use `POST /projects/{id}/text-overlays` for carousel text.**

**NEVER use motion graphics or motion code for slide text** — those tools are for:
- Animated lower thirds (video editing)
- Dynamic charts/graphs
- Complex multi-layer compositions

**Why text overlays for carousels:**
- Optimized for static text rendering
- Direct control over positioning, stroke, alignment
- No unnecessary animation overhead
- Consistent with per-slide timing model

**API Call Pattern:**
```bash
bash scripts/blitzreels.sh POST "/projects/${PROJECT_ID}/text-overlays" '{
  "text": "Your slide text here\nMax 40 chars/line",
  "start_seconds": 0,
  "duration_seconds": 3,
  "position_x": 0.5,
  "position_y": 0.18,
  "style": {
    "font_size": 64,
    "font_weight": "700",
    "text_align": "center",
    "color": "#ffffff",
    "text_stroke_enabled": true,
    "text_stroke_color": "#000000",
    "text_stroke_width_px": 6
  }
}'
```

## Complete Examples

### Example 1: TikTok Entrepreneurship Carousel (3 Slides)

**Topic**: "3 Mistakes Killing Your Startup"

**Slide 1 (Hook):**
- Text: "3 Mistakes Killing\nYour Startup"
- Duration: 3s
- Position: `position_x: 0.45, position_y: 0.18` (top-left-of-center)
- Style: 72px, bold, white text, 6px black stroke

**Slide 2 (Value):**
- Text: "1. Building without users\n2. Ignoring metrics\n3. Perfectionism"
- Duration: 3s
- Position: `position_x: 0.35, position_y: 0.5`
- Style: 56px, bold

**Slide 3 (CTA):**
- Text: "Save this for later ↓\nFollow for more tips"
- Duration: 3s
- Position: `position_x: 0.45, position_y: 0.18`
- Style: 64px, bold

**Script:**
```bash
bash scripts/tiktok.sh \
  --name "Startup Mistakes Carousel" \
  --slide-duration 3 \
  --images "https://example.com/slide1.jpg|https://example.com/slide2.jpg|https://example.com/slide3.jpg" \
  --titles "3 Mistakes Killing\nYour Startup|1. Building without users\n2. Ignoring metrics\n3. Perfectionism|Save this for later ↓\nFollow for more tips"
```

### Example 2: Instagram Educational Carousel (5 Slides)

**Topic**: "How Photosynthesis Works"

**Slide 1 (Hook):**
- Text: "How Photosynthesis\nWorks (Explained)"
- Position: `position_x: 0.5, position_y: 0.15` (top-center)

**Slides 2-4 (Steps):**
- Slide 2: "Step 1: Light Absorption\nChloroplasts capture sunlight"
- Slide 3: "Step 2: Water Splitting\nH2O breaks into H + O2"
- Slide 4: "Step 3: Sugar Formation\nCO2 + H → Glucose"

**Slide 5 (Recap):**
- Text: "Light → Water → Sugar\nSave for biology class!"

**Script:**
```bash
bash scripts/instagram.sh \
  --aspect 4:5 \
  --name "Photosynthesis Explained" \
  --slide-duration 3 \
  --images "url1|url2|url3|url4|url5" \
  --titles "How Photosynthesis\nWorks (Explained)|Step 1: Light Absorption\nChloroplasts capture sunlight|Step 2: Water Splitting\nH2O breaks into H + O2|Step 3: Sugar Formation\nCO2 + H → Glucose|Light → Water → Sugar\nSave for biology class!"
```

## API Validation & Drift Prevention

Before starting carousel work, validate that required endpoints exist:

```bash
# Validate API endpoints
bash scripts/validate-api.sh
```

**Required Endpoints:**
- `POST /projects` (carousel project creation)
- `POST /projects/{id}/media` (slide background upload)
- `POST /projects/{id}/timeline/media` (slide sequencing)
- `POST /projects/{id}/text-overlays` (text placement)
- `GET /projects/{id}/context` (layout inspection)
- `POST /projects/{id}/export` (mp4 slideshow export)

**OpenAPI Spec Reference:**
- Live spec: `https://www.blitzreels.com/api/openapi.json`
- Always check spec before assuming endpoint availability

## Safe Area Guidance (Practical)

The API supports `carousel_settings.safe_area_preset`, but the preset is **metadata** today.
To "respect safe areas" in practice:

- Keep critical text away from the extreme edges.
- On TikTok, avoid the **right side** (UI buttons) and the **bottom** (captions/CTA overlays).
- Prefer using `position: "top"` or `position: "center"` for text overlays, or set normalized `position_x`/`position_y` (0..1) conservatively.

Overview

This skill creates TikTok and Instagram carousel projects (still slides with text overlays) using the BlitzReels API. It models carousels as carousel-type projects, uploads images as media assets, places one image per timeline segment, and adds timed text overlays for each slide. The output is an mp4 slideshow export suitable for social platforms.

How this skill works

It creates a project with project_type:"carousel" and stores platform settings in carousel_settings. Slide backgrounds are uploaded via media endpoints, each image is added to the timeline at start_seconds = slideIndex * slideDuration, and text is added as time-windowed text overlays with explicit position_x/position_y coordinates. Finally, export the assembled slideshow as an mp4 using the export endpoint.

When to use it

  • You need static-image carousels for TikTok Photo Mode or Instagram feed.
  • You want per-slide readable text with precise positioning and stroke for mobile legibility.
  • You need an mp4 slideshow export rather than a ZIP of individual slide images.
  • You must guarantee consistent timing and per-slide CTAs or hooks.
  • You want programmatic bulk generation of social carousels from URLs and titles.

Best practices

  • Respect the Readability Rules: max 40 chars/line and max 4 lines/slide; split long copy across slides.
  • Always use text-overlays endpoint for slide text; do not use motion graphics for static slide text.
  • Apply a 6px stroke and high contrast (WCAG AA minimum) for legibility on mobile.
  • Manually set position_x/position_y because safe_area_preset is metadata only; test for platform UI overlays.
  • Use consistent vertical positioning across slides and keep bottom margins generous to avoid captions/controls.

Example use cases

  • TikTok 3-slide hook-value-CTA carousel with 9:16 aspect ratio and slightly left-aligned text to avoid right-side UI.
  • Instagram 4:5 educational carousel with five slides following hook → steps → recap pattern.
  • Batch-generate product feature carousels from image URLs and per-slide titles using scripts/carousel.sh.
  • Create social-ready mp4 previews for designers to review timing and legibility before posting.

FAQ

Can I export individual slide images (ZIP) via the public API?

No. The public OpenAPI currently does not provide a per-slide ZIP export. Treat carousels as an mp4 slideshow export.

Do safe area presets auto-position text for me?

No. safe_area_preset is metadata only. You must set position_x and position_y manually to respect danger zones.

Which endpoint must I use for slide text?

Always use POST /projects/{id}/text-overlays for carousel text. This ensures static text rendering and precise control.