home / skills / cdeistopened / opened-vault / text-on-broll

text-on-broll skill

/.claude/skills/text-on-broll

This skill helps you create bold, text-forward short-form videos by compositing on-screen text over AI-generated b-roll for Instagram Reels, TikTok, and Shorts.

npx playbooks add skill cdeistopened/opened-vault --skill text-on-broll

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

Files (4)
SKILL.md
12.7 KB
---
name: text-on-broll
description: Create short-form text-on-video content using AI-generated b-roll (Veo 3.1) composited with on-screen text (Remotion). End-to-end workflow from topic to publishable vertical video. Use when you need Instagram Reels, TikToks, or Shorts with bold text overlays on cinematic footage.
---

# Text on B-Roll

Create scroll-stopping short-form videos by compositing bold on-screen text over AI-generated b-roll footage. The full pipeline: topic in, rendered MP4s out.

**Prerequisite skills (loaded automatically):**
- `video-generator` - Veo 3.1 API for b-roll generation
- `video-caption-creation` - Hook frameworks and text patterns
- `one-liners` - 12 core one-liner patterns
- `nano-banana-image-generator` - Optional: generate a matching static thumbnail

---

## When to Use This Skill

- Promoting a blog post, article, or newsletter on Reels/TikTok/Shorts
- Creating text-forward social videos from a topic or theme
- Building a batch of short-form content around one visual concept
- Any time you want bold text + cinematic b-roll without filming anything

**This skill is NOT for:**
- Podcast clips with audio (use `youtube-clip-extractor`)
- Videos with voiceover or dialogue (use `video-generator` directly)
- Static image posts (use `nano-banana-image-generator`)

---

## Workflow Overview

1. **Understand the topic** - What's the article/theme about?
2. **Generate b-roll** - One photorealistic Veo clip that matches the topic
3. **Write 8-12 text options** - Framework-fitted to proven patterns
4. **User selects favorites** - Pick 2-4 lines
5. **Scaffold Remotion project** - From template
6. **Preview in Studio** - User approves look
7. **Render to MP4** - One video per text option

---

## Step 1: B-Roll Generation

Generate one strong b-roll clip using `video-generator`. The visual should be:

- **Photorealistic** - not illustrated or stylized
- **Extreme close-up or tight shot** - intense, tactile, sensory
- **One simple action** - hands doing something, a single motion
- **Ambient audio only** - no dialogue, no music
- **9:16 vertical, 1080p, 8 seconds**

### B-Roll Prompt Template

```
Extreme close-up, shallow depth of field. [Subject performing tactile action].
[Specific sensory details - textures, colors, materials]. [Paper/surface reacts to the action].
The sound of [specific ambient audio]. Photorealistic, handheld micro-movement,
warm natural light from a nearby window.
```

### B-Roll Quality Checklist

- [ ] Photorealistic (not AI-looking)
- [ ] Strong tactile/sensory quality
- [ ] Simple composition (one focal point)
- [ ] No text or symbols in the footage
- [ ] Vertical 9:16
- [ ] Motion is slow and deliberate (not chaotic)

### Running the Generation

```bash
cd "/Users/charliedeist/Desktop/New Root Docs/OpenEd Vault"
export GEMINI_API_KEY=$(grep GEMINI_API_KEY .env | cut -d'=' -f2) && \
python3 ".claude/skills/video-generator/scripts/generate_video.py" \
  "Your prompt here" \
  --aspect 9:16 --resolution 1080p --duration 8 \
  --name "descriptive-name" \
  --output "Studio/SEO Content Production/" \
  --negative "text overlays, watermarks, blurry, cartoon, illustration, anime"
```

Veo takes 1-6 minutes. If the first result has artifacts, regenerate - don't rework.

---

## Step 2: Write Text Options

Generate 8-12 on-screen text options using proven patterns. The text must work WITHOUT audio context - it stands alone over silent b-roll.

### Pattern Library (Use These)

| Pattern | Format | Example |
|---------|--------|---------|
| **Stop + Complaint** | "Stop [universal frustration]" | "Stop grading kids on how fast they fill in bubbles." |
| **Everyday Observation** | "[Simple truth no one says]" | "Nobody remembers their test scores." |
| **Existential Question** | "[Question that points out absurdity]" | "Who decided 30 bubbles could measure a kid?" |
| **Normalize** | "Normalize [thing people feel guilty about]" | "Normalize letting kids destroy the answer sheet." |
| **Values / Core Belief** | "[Worldview in one line]" | "Curiosity doesn't fit in a bubble." |
| **Mock Instruction** | "[Absurdly specific command]" | "Instructions unclear. Used the Scantron as a canvas." |
| **Polarizing Statement** | "[Challenge common assumption]" | "Scantrons don't measure intelligence. They measure obedience." |
| **Full Quote** | "[Long conversational text that fills screen]" | "We hand kids four choices and call it thinking. Then we wonder why they let AI think for them." |
| **Two-Part Reveal** | Setup → hard cut → punchline | "They said my kid can't think critically." → "She was finger painting while your kid was memorizing answers." |
| **Aspirational** | "This is your sign to [permission]" | "This is your sign to let your kid color outside the bubbles." |

### Text Quality Rules

- **McDonald's Test:** If a truck driver wouldn't get it, simplify
- **First 3 words do 80% of the work.** Front-load the punch
- **Mix lengths:** Include punchy (2-5 words), statement (5-8), narrative (9-15), and full-quote (15+)
- **No AI-isms:** No "delve," "comprehensive," "crucial," "landscape"
- **No correlatives:** Never "X isn't just Y - it's Z"
- **Conversational:** Would you text this to a friend?
- **Specific > vague:** "Stop acting like worksheets are learning" beats "Education should be better"

### Text Sizing Guide

| Text Length | Font Size | Notes |
|-------------|-----------|-------|
| 2-5 words | 78-90px | Big, dominant, centered |
| 5-8 words | 66-78px | Still bold, may wrap to 2 lines |
| 9-15 words | 56-66px | Will wrap to 3-4 lines, still readable |
| 15+ words | 48-56px | Fills more screen, reads like a paragraph |
| Two-part reveal | 60-66px each | Part 1 slightly larger than part 2 |

---

## Step 3: Remotion Composition

### Template Location

Reusable template files are at:
`.claude/skills/text-on-broll/template/`

### Quick Setup

```bash
# Create project directory
mkdir -p "Studio/[project-name]/text-on-broll"
cd "Studio/[project-name]/text-on-broll"

# Init and install
npm init -y
npm install --save remotion @remotion/cli @remotion/player react react-dom
npm install --save-dev typescript @types/react

# Create directories
mkdir -p src public

# Copy b-roll video
cp path/to/generated-video.mp4 public/bg-video.mp4
```

Then create three files from the templates below.

### tsconfig.json

```json
{
  "compilerOptions": {
    "target": "ESNext",
    "module": "commonjs",
    "jsx": "react-jsx",
    "strict": true,
    "esModuleInterop": true,
    "forceConsistentCasingInFileNames": true,
    "skipLibCheck": true
  },
  "include": ["src"]
}
```

### src/index.ts

```typescript
import { registerRoot } from "remotion";
import { RemotionRoot } from "./Root";

registerRoot(RemotionRoot);
```

### src/Root.tsx

Register one `<Composition>` per text variant. All compositions share the same settings:

```typescript
import React from "react";
import { Composition } from "remotion";
// Import your compositions from TextOverlay.tsx

export const RemotionRoot: React.FC = () => {
  return (
    <>
      <Composition
        id="variant-name"
        component={YourComponent}
        durationInFrames={240}  // 8s at 30fps
        fps={30}
        width={1080}
        height={1920}  // 9:16 vertical
      />
    </>
  );
};
```

### src/TextOverlay.tsx - The Core Component

```typescript
import React from "react";
import {
  AbsoluteFill,
  OffthreadVideo,
  staticFile,
  useCurrentFrame,
} from "remotion";

const IGText: React.FC<{
  text: string;
  fontSize?: number;
  top?: string;
}> = ({ text, fontSize = 72, top = "38%" }) => {
  return (
    <div
      style={{
        position: "absolute",
        top,
        left: "50%",
        transform: "translateX(-50%)",
        width: "85%",
        textAlign: "center",
        zIndex: 10,
      }}
    >
      <span
        style={{
          fontFamily: "'Helvetica Neue', 'Inter', Arial, sans-serif",
          fontWeight: 800,
          fontSize,
          lineHeight: 1.15,
          color: "white",
          WebkitTextStroke: "2.5px rgba(0,0,0,0.9)",
          textShadow: "0 3px 12px rgba(0,0,0,0.5)",
          letterSpacing: "-0.02em",
        }}
      >
        {text}
      </span>
    </div>
  );
};
```

### The IGText Style (Locked In)

This is the approved IG-native text style. Do not change without explicit request:

| Property | Value | Why |
|----------|-------|-----|
| Font family | Helvetica Neue / Inter | Clean, IG-native feel |
| Weight | 800 (extra bold) | Readable over video |
| Color | White | Maximum contrast |
| Stroke | 2.5px rgba(0,0,0,0.9) | Thin black outline, readable on any background |
| Shadow | 0 3px 12px rgba(0,0,0,0.5) | Subtle depth, not cheesy |
| Letter spacing | -0.02em | Tighter, more editorial |
| Line height | 1.15 | Compact multi-line |
| Width | 85% of frame | Safe margins for IG |
| Animation | None | Text appears immediately, no fade/spring |

### Composition Patterns

**Single line (most common):**
```tsx
export const MyComposition: React.FC = () => (
  <AbsoluteFill>
    <OffthreadVideo src={staticFile("bg-video.mp4")} />
    <IGText text="Your text here." fontSize={68} top="32%" />
  </AbsoluteFill>
);
```

**Two-part reveal (hard cut at midpoint):**
```tsx
export const TwoPartReveal: React.FC = () => {
  const frame = useCurrentFrame();
  const midpoint = 108; // ~3.6s at 30fps

  return (
    <AbsoluteFill>
      <OffthreadVideo src={staticFile("bg-video.mp4")} />
      {frame < midpoint && (
        <IGText text="Setup line." fontSize={66} top="30%" />
      )}
      {frame >= midpoint && (
        <IGText text="Punchline." fontSize={60} top="28%" />
      )}
    </AbsoluteFill>
  );
};
```

---

## Step 4: Preview and Render

### Preview

```bash
npx remotion studio --port 3123
```

Opens at http://localhost:3123. Check all compositions. Look for:
- Text readable over the video at all moments
- No text clipping at edges
- Font size appropriate for text length
- Two-part reveal timing feels natural

### Render All Compositions

```bash
# Render a single composition
npx remotion render src/index.ts [composition-id] out/[name].mp4

# Render all compositions in batch
for comp in comp1 comp2 comp3; do
  npx remotion render src/index.ts $comp out/$comp.mp4
done
```

### Render Settings

| Setting | Value |
|---------|-------|
| Codec | H.264 (default) |
| Frame rate | 30fps |
| Resolution | 1080x1920 |
| CRF | 18 (high quality) |

### Output Routing

| Platform | Specs | Notes |
|----------|-------|-------|
| Instagram Reels | 9:16, < 90s, < 4GB | Upload directly |
| TikTok | 9:16, < 10 min, < 287MB | Upload directly |
| YouTube Shorts | 9:16, < 60s | Upload directly |
| Stories | 9:16, < 15s per story | May need to trim to 8s |

---

## Batch Production Workflow

For creating multiple videos from one topic (e.g., promoting an article):

1. **Generate 1 b-roll clip** that captures the topic's visual metaphor
2. **Write 10 text options** across all pattern types
3. **User picks 3-4 favorites**
4. **Scaffold 1 Remotion project** with all selected as separate compositions
5. **Preview all in Studio**, adjust sizes/positions
6. **Batch render** all compositions
7. **Pair each video with a platform-specific caption** (from content-repurposer)

This gives you 3-4 unique videos from one generation session, each with different text but the same compelling visual.

---

## Skill Chain

This skill works best as part of a content production chain:

```
Source Content (article, newsletter, podcast)
    ↓
text-on-broll (this skill) → 3-4 vertical videos
    ↓
content-repurposer → platform captions for each video
    ↓
Post to IG Reels, TikTok, Shorts
```

**Related skills:**
- `video-generator` - B-roll generation (called by this skill)
- `video-caption-creation` - Hook frameworks (referenced by this skill)
- `nano-banana-image-generator` - Static thumbnail for the same content
- `content-repurposer` - Platform captions to pair with each video
- `one-liners` - Text pattern library
- `short-form-video` - Broader short-form strategy and philosophy

---

## Examples

### Example: Education Article Promotion

**Topic:** Article about standardized testing and creative agency

**B-roll prompt:** "Extreme close-up, shallow depth of field. A child's small paint-covered fingers slowly drag through thick finger paint across a standardized test bubble sheet. Paint smears vibrant orange and blue across neat rows of bubbles. The sound of wet paint dragging across paper. Photorealistic, handheld micro-movement, warm natural light."

**Text options selected:**
1. "Stop grading kids on how fast they fill in bubbles." (Stop + Complaint)
2. "Curiosity doesn't fit in a bubble." (Values)
3. "They said my kid can't think critically." → "She was finger painting while your kid was memorizing answers." (Two-Part Reveal)

**Result:** 3 vertical videos, same b-roll, different text - each targets a different scroll-stop trigger.

Overview

This skill creates scroll-stopping short-form videos by compositing bold on-screen text over AI-generated b-roll footage and rendering publish-ready vertical MP4s. It runs an end-to-end pipeline from topic to remotion composition, preview, and batch render so you can produce Reels, TikToks, or Shorts without filming. The workflow emphasizes tactile, photorealistic b-roll and text options that read on-screen without audio.

How this skill works

I generate one strong 9:16 photorealistic b-roll clip (Veo 3.1) matched to your topic, then produce 8–12 text variants using proven short-form patterns. You pick favorites, and I scaffold a Remotion project that overlays the chosen lines with an IG-native text style. Preview in Remotion Studio, adjust sizing/timing, and render MP4s for platform upload.

When to use it

  • Promoting an article, newsletter, or blog with vertical social videos
  • Creating text-forward Reels/TikToks/Shorts from a single topic without recording footage
  • Batch-producing 3–4 unique videos from one visual concept
  • Making silent, caption-first clips meant to stop scrolling
  • When you need cinematic b-roll combined with bold, readable on-screen copy

Best practices

  • Generate one photorealistic, tactile 8s vertical clip; regenerate if artifacts appear
  • Produce 8–12 text options across short, statement, narrative, and full-quote lengths
  • Front-load the first three words; ensure each line reads without audio context
  • Use the locked IGText style (extra-bold white text, black stroke, subtle shadow) for legibility
  • Preview in Remotion Studio and check for clipping, contrast, and timing before batch renders

Example use cases

  • Promote a newsletter with three short variants that target different hooks
  • Repurpose a long article into 3–4 scroll-stopping shorts using one visual metaphor
  • Create a set of attention-grabbing education clips arguing a single point from different angles
  • Produce silent tutorials or thought-provokers where text must carry the message
  • Quickly batch videos for A/B testing captions and thumbnails

FAQ

How long should the b-roll be?

8 seconds at 1080x1920, 30fps is recommended so each composition matches the Remotion template.

How many text variants should I pick?

Pick 2–4 favorites from the 8–12 generated options to scaffold separate compositions and maximize reuse of one b-roll clip.