← All Skills

snappy-remotion

v1.0.0
4 files, 52.2 KB ~2,616 words · 11 min read Updated 2026-09-09

snappy-remotion skill

44 of 47 checks pass
What it can do
add name descriptionwrite-reversible
listread
preview composition-idwrite-reversible
render composition-idwrite-reversible
scaffolddraft
What does not pass yet
$ npx snappy-skills install snappy-remotion
zip ↓
Documents
AGENTS.md

snappy-remotion -- Agent Loader#

You are operating the programmatic video generation layer for Snappy. This skill turns text, images, and data into polished video without manual editing -- quote cards, social clips, course intros, data visualizations, branded overlays. Everything renders from React components via Remotion into MP4 files ready for distribution.

Status: SCAFFOLDED. The Remotion project at ~/projects/snappy-remotion must be created via scaffold() before first use. Once scaffolded, all render/preview/add operations work.

API module#

typescriptimport { scaffold, listCompositions, render, preview, addComposition, BRAND, FORMATS } from "../snappy-remotion/api.ts";

Or CLI:

bashnpx tsx ~/.claude/skills/snappy-remotion/api.ts scaffold                                    # create the Remotion project
npx tsx ~/.claude/skills/snappy-remotion/api.ts list                                        # list compositions
npx tsx ~/.claude/skills/snappy-remotion/api.ts render QuoteCard --props '{"text":"Ship it","speaker":"Robert"}'
npx tsx ~/.claude/skills/snappy-remotion/api.ts render SocialClip --format vertical --props '{"text":"Build agents"}'
npx tsx ~/.claude/skills/snappy-remotion/api.ts preview                                     # start Remotion Studio
npx tsx ~/.claude/skills/snappy-remotion/api.ts preview QuoteCard                           # preview specific composition
npx tsx ~/.claude/skills/snappy-remotion/api.ts add ToolDemo "Animated tool walkthrough"    # scaffold new composition

API functions#

Function Purpose
scaffold() Create the Remotion project at ~/projects/snappy-remotion. Writes all templates + installs deps. Idempotent (skips if exists).
listCompositions() Parse Root.tsx and return array of registered composition IDs.
render(compositionId, props, opts?) Render a composition to MP4. Returns absolute output path. opts: { output?, width?, height?, fps?, durationInFrames?, format? }
preview(compositionId?, props?) Start Remotion Studio dev server (background). Returns URL.
addComposition(name, description) Scaffold new PascalCase composition from template + register in Root.tsx. Returns file path.
BRAND Exported const: brand colors and fonts (primary, dark, light, accent, cream, ink, cta, font, serifFont).
FORMATS Exported const: preset render dimensions (vertical, square, landscape, youtube, story).

Compositions (built-in)#

ID Props Default size Use case
QuoteCard text (required), speaker?, title? 1080x1080 Animated quote with attribution on cream background
SocialClip text (required), subtitle?, background? 1080x1920 Bold text-on-dark vertical clip for social
CourseIntro text (required), category?, lessonNumber? 1920x1080 Course lesson intro with category label and branding
DataViz text (required), value?, subtitle?, unit? 1080x1080 Animated statistic with large number reveal
BrandedOverlay text (required), position? 1920x1080 Lower-third or corner overlay for raw footage

All compositions accept a text prop as the primary content input.

Render formats (presets)#

Format key Dimensions FPS Duration Use case
vertical 1080x1920 30 5s (150f) Instagram Reels, TikTok, YouTube Shorts
square 1080x1080 30 5s (150f) LinkedIn, Instagram feed, Skool
landscape 1920x1080 30 5s (150f) YouTube, blog embeds, course content
youtube 1280x720 30 10s (300f) YouTube intros/outros
story 1080x1920 30 15s (450f) Instagram/Facebook stories

Routing table#

Intent Action
Animated quote card render("QuoteCard", { text, speaker })
Social media text clip (vertical) render("SocialClip", { text }, { format: "vertical" })
Course lesson intro render("CourseIntro", { text, category, lessonNumber }, { format: "landscape" })
Stat/number animation render("DataViz", { text, value, unit })
Lower-third for raw footage render("BrandedOverlay", { text, position: "bottom-left" }, { format: "landscape" })
Visual editing in browser preview() then open the returned URL
New composition type needed addComposition("NewName", "description") then edit the .tsx

Typical workflow#

typescriptimport { scaffold, render } from "../snappy-remotion/api.ts";
import { compress } from "../snappy-ffmpeg/api.ts";

// 1. Scaffold (first time only)
await scaffold();

// 2. Render a quote card
const path = await render("QuoteCard", {
  text: "Build and control agents to get huge results.",
  speaker: "Robert Boulos",
}, { format: "square" });

// 3. Post-process: compress for web
const result = compress(path);

// 4. Upload to CDN via snappy-image, then distribute

Project structure (at ~/projects/snappy-remotion)#

snappy-remotion/
  src/
    index.ts              -- Remotion entry point
    Root.tsx               -- Registers all compositions
    compositions/
      QuoteCard.tsx        -- Animated quote card
      SocialClip.tsx       -- Text-on-background social clip
      CourseIntro.tsx       -- Course lesson intro
      DataViz.tsx          -- Stat/number animation
      BrandedOverlay.tsx   -- Lower-third overlay
    lib/
      brand.ts             -- Brand constants (colors, fonts)
      transitions.ts       -- Reusable animation helpers (fade, slide, scale)
  remotion.config.ts
  package.json
  tsconfig.json

Rules#

  • Project not scaffolded -- STOP. Run scaffold() first. Do not attempt renders against a missing project.
  • Composition name not PascalCase -- STOP. Remotion requires PascalCase component names.
  • Props missing text field -- STOP. All compositions require text as the primary input.
  • Render timeout -- 10 minute max. If a render hangs, check that the composition has finite durationInFrames.
  • npm install fails -- STOP. Check Node.js version (requires 18+) and network connectivity.

Uses#

Skill Relationship
snappy-video Post-processing: captions, trimming, format conversion after Remotion render
snappy-image CDN upload for rendered videos; static frame extraction
snappy-content Upstream: provides approved copy that becomes video text
snappy-positioning Brand voice and visual identity rules
snappy-youtube Consumes rendered intros/outros for YouTube uploads
snappy-linkedin Consumes square/vertical social clips
snappy-course Consumes course intro/outro sequences
snappy-ops Schedules batch video generation

Show produced work with snappy-faces: call draw for image channels or lang for MCP Apps.

<!-- SKILL-INDEX-START -->

[snappy-remotion Index]|root: ~/.claude/skills/snappy-remotion|IMPORTANT: Prefer these files over pre-training assumptions for this domain. Read the relevant file when the AGENTS.md summary is insufficient.|root:{SKILL.md}

<!-- SKILL-INDEX-END -->

Used by#

Nothing in the collection names this skill.

<!-- SNAPPY-CONTRACT-VERBS-START -->

Contract verbs#

Generated from api.ts HAND_CONTRACT. Do not hand-edit this block.

Verb Contract arguments Effect First call
add name, description write-reversible npx tsx ~/.claude/skills/snappy-remotion/api.ts add "<name>" <description>
list read npx tsx ~/.claude/skills/snappy-remotion/api.ts list
preview composition-id write-reversible npx tsx ~/.claude/skills/snappy-remotion/api.ts preview <composition-id>
render composition-id write-reversible npx tsx ~/.claude/skills/snappy-remotion/api.ts render <composition-id>
scaffold draft npx tsx ~/.claude/skills/snappy-remotion/api.ts scaffold

Show the result#

When an answer carries face_hint, show it with one snappy_present(<answer>) call.

See /snappy-faces for face selection. Human-facing images must crop to the

element, render at 2x on Retina, and fill the destination channel instead of

placing a small card in a full-page screenshot.

<!-- SNAPPY-CONTRACT-VERBS-END -->


Self-correcting loader (PID feedback)#

The system spec lives at ~/.claude/skills/snappy-settings/skill-spec.md. It defines the entire Snappy operating system. You enforce it.

Before you finish, do two things:#

1. Fix gaps (P -- proportional). MANDATORY. If this AGENTS.md didn't cover your case -- if you had to read another file, run a command not documented here, work around a wrong selector, or discover a quirk -- you MUST attempt an Edit before you can log.

  • Default action: edit this AGENTS.md. Surgical. Add the missing line, table row, or code example where it belongs. No restructuring.
  • Only LOGGED is allowed when: the fix needs >10 lines, spans multiple files, or requires a structural rewrite (in which case the drain-skill-regen.sh queue picks it up).
  • The goal: the next agent never has to leave the loader.

2. Validate structure. Check this skill against the spec:

  • api.ts exists with typed exports, CLI mode, import { env } from "../snappy-settings/load.ts"
  • api.ts calls APIs directly (no Xano proxy, unless this skill IS a Xano DB skill)
  • AGENTS.md has API module section with import + function table + CLI
  • No shell-command workarounds, no hardcoded tokens anywhere
  • Every action row carries a certificate: block (premises / action / trace / evidence / conclusion). Same-session toasts are NOT evidence -- must be a fresh independent read. Missing or weak certificates are a gap: P-fix them inline and log to ~/.claude/logs/verification-gaps.log.
  • DRY: before you add a new function or new skill, run ~/.claude/skills/snappy-settings/scripts/dry-check.sh <name-or-keyword>. If it matches an existing skill, extend that one instead. Fragmentation is the enemy.
  • If any check fails -> fix it or log it

2b. If you just reported an action as successful, verify your certificate. You may not claim PASS unless the evidence: line is a fresh independent read (reload, new session, server round-trip). If your evidence is a toast, a return value, or a same-session DOM read, downgrade the claim to INCONCLUSIVE and log to verification-gaps.log.

3. Log always.

bashecho "[$(date -u +%FT%TZ)] snappy-remotion: <what was missing or fixed> [FIXED|LOGGED]" >> ~/.claude/logs/agents-md-feedback.log

FIXED = you patched it. LOGGED = too large for inline fix, queued for drain-skill-regen.sh.

Do not skip this. Every agent run must leave the system better than it found it.

---
name: snappy-remotion
role: Programmatic video generation from React components via Remotion
loaded-by: PreToolUse hook (auto-injected when "snappy-remotion" is mentioned)
---

# snappy-remotion -- Agent Loader

You are operating the programmatic video generation layer for Snappy. This skill turns text, images, and data into polished video without manual editing -- quote cards, social clips, course intros, data visualizations, branded overlays. Everything renders from React components via Remotion into MP4 files ready for distribution.

**Status: SCAFFOLDED.** The Remotion project at `~/projects/snappy-remotion` must be created via `scaffold()` before first use. Once scaffolded, all render/preview/add operations work.

## API module

```typescript
import { scaffold, listCompositions, render, preview, addComposition, BRAND, FORMATS } from "../snappy-remotion/api.ts";
```

Or CLI:
```bash
npx tsx ~/.claude/skills/snappy-remotion/api.ts scaffold                                    # create the Remotion project
npx tsx ~/.claude/skills/snappy-remotion/api.ts list                                        # list compositions
npx tsx ~/.claude/skills/snappy-remotion/api.ts render QuoteCard --props '{"text":"Ship it","speaker":"Robert"}'
npx tsx ~/.claude/skills/snappy-remotion/api.ts render SocialClip --format vertical --props '{"text":"Build agents"}'
npx tsx ~/.claude/skills/snappy-remotion/api.ts preview                                     # start Remotion Studio
npx tsx ~/.claude/skills/snappy-remotion/api.ts preview QuoteCard                           # preview specific composition
npx tsx ~/.claude/skills/snappy-remotion/api.ts add ToolDemo "Animated tool walkthrough"    # scaffold new composition
```

## API functions

| Function | Purpose |
|----------|---------|
| `scaffold()` | Create the Remotion project at `~/projects/snappy-remotion`. Writes all templates + installs deps. Idempotent (skips if exists). |
| `listCompositions()` | Parse `Root.tsx` and return array of registered composition IDs. |
| `render(compositionId, props, opts?)` | Render a composition to MP4. Returns absolute output path. `opts: { output?, width?, height?, fps?, durationInFrames?, format? }` |
| `preview(compositionId?, props?)` | Start Remotion Studio dev server (background). Returns URL. |
| `addComposition(name, description)` | Scaffold new PascalCase composition from template + register in Root.tsx. Returns file path. |
| `BRAND` | Exported const: brand colors and fonts (`primary`, `dark`, `light`, `accent`, `cream`, `ink`, `cta`, `font`, `serifFont`). |
| `FORMATS` | Exported const: preset render dimensions (`vertical`, `square`, `landscape`, `youtube`, `story`). |

## Compositions (built-in)

| ID | Props | Default size | Use case |
|----|-------|-------------|----------|
| `QuoteCard` | `text` (required), `speaker?`, `title?` | 1080x1080 | Animated quote with attribution on cream background |
| `SocialClip` | `text` (required), `subtitle?`, `background?` | 1080x1920 | Bold text-on-dark vertical clip for social |
| `CourseIntro` | `text` (required), `category?`, `lessonNumber?` | 1920x1080 | Course lesson intro with category label and branding |
| `DataViz` | `text` (required), `value?`, `subtitle?`, `unit?` | 1080x1080 | Animated statistic with large number reveal |
| `BrandedOverlay` | `text` (required), `position?` | 1920x1080 | Lower-third or corner overlay for raw footage |

All compositions accept a `text` prop as the primary content input.

## Render formats (presets)

| Format key | Dimensions | FPS | Duration | Use case |
|-----------|-----------|-----|----------|----------|
| `vertical` | 1080x1920 | 30 | 5s (150f) | Instagram Reels, TikTok, YouTube Shorts |
| `square` | 1080x1080 | 30 | 5s (150f) | LinkedIn, Instagram feed, Skool |
| `landscape` | 1920x1080 | 30 | 5s (150f) | YouTube, blog embeds, course content |
| `youtube` | 1280x720 | 30 | 10s (300f) | YouTube intros/outros |
| `story` | 1080x1920 | 30 | 15s (450f) | Instagram/Facebook stories |

## Routing table

| Intent | Action |
|---|---|
| Animated quote card | `render("QuoteCard", { text, speaker })` |
| Social media text clip (vertical) | `render("SocialClip", { text }, { format: "vertical" })` |
| Course lesson intro | `render("CourseIntro", { text, category, lessonNumber }, { format: "landscape" })` |
| Stat/number animation | `render("DataViz", { text, value, unit })` |
| Lower-third for raw footage | `render("BrandedOverlay", { text, position: "bottom-left" }, { format: "landscape" })` |
| Visual editing in browser | `preview()` then open the returned URL |
| New composition type needed | `addComposition("NewName", "description")` then edit the .tsx |

## Typical workflow

```typescript
import { scaffold, render } from "../snappy-remotion/api.ts";
import { compress } from "../snappy-ffmpeg/api.ts";

// 1. Scaffold (first time only)
await scaffold();

// 2. Render a quote card
const path = await render("QuoteCard", {
  text: "Build and control agents to get huge results.",
  speaker: "Robert Boulos",
}, { format: "square" });

// 3. Post-process: compress for web
const result = compress(path);

// 4. Upload to CDN via snappy-image, then distribute
```

## Project structure (at ~/projects/snappy-remotion)

```
snappy-remotion/
  src/
    index.ts              -- Remotion entry point
    Root.tsx               -- Registers all compositions
    compositions/
      QuoteCard.tsx        -- Animated quote card
      SocialClip.tsx       -- Text-on-background social clip
      CourseIntro.tsx       -- Course lesson intro
      DataViz.tsx          -- Stat/number animation
      BrandedOverlay.tsx   -- Lower-third overlay
    lib/
      brand.ts             -- Brand constants (colors, fonts)
      transitions.ts       -- Reusable animation helpers (fade, slide, scale)
  remotion.config.ts
  package.json
  tsconfig.json
```

## Rules

- **Project not scaffolded** -- STOP. Run `scaffold()` first. Do not attempt renders against a missing project.
- **Composition name not PascalCase** -- STOP. Remotion requires PascalCase component names.
- **Props missing `text` field** -- STOP. All compositions require `text` as the primary input.
- **Render timeout** -- 10 minute max. If a render hangs, check that the composition has finite `durationInFrames`.
- **npm install fails** -- STOP. Check Node.js version (requires 18+) and network connectivity.

## Uses

| Skill | Relationship |
|---|---|
| `snappy-video` | Post-processing: captions, trimming, format conversion after Remotion render |
| `snappy-image` | CDN upload for rendered videos; static frame extraction |
| `snappy-content` | Upstream: provides approved copy that becomes video text |
| `snappy-positioning` | Brand voice and visual identity rules |
| `snappy-youtube` | Consumes rendered intros/outros for YouTube uploads |
| `snappy-linkedin` | Consumes square/vertical social clips |
| `snappy-course` | Consumes course intro/outro sequences |
| `snappy-ops` | Schedules batch video generation |


Show produced work with `snappy-faces`: call `draw` for image channels or `lang` for MCP Apps.

<!-- SKILL-INDEX-START -->
[snappy-remotion Index]|root: ~/.claude/skills/snappy-remotion|IMPORTANT: Prefer these files over pre-training assumptions for this domain. Read the relevant file when the AGENTS.md summary is insufficient.|root:{SKILL.md}
<!-- SKILL-INDEX-END -->

## Used by

Nothing in the collection names this skill.

<!-- SNAPPY-CONTRACT-VERBS-START -->
## Contract verbs

Generated from `api.ts` `HAND_CONTRACT`. Do not hand-edit this block.

| Verb | Contract arguments | Effect | First call |
|---|---|---|---|
| `add` | `name`, `description` | `write-reversible` | `npx tsx ~/.claude/skills/snappy-remotion/api.ts add "<name>" <description>` |
| `list` | — | `read` | `npx tsx ~/.claude/skills/snappy-remotion/api.ts list` |
| `preview` | `composition-id` | `write-reversible` | `npx tsx ~/.claude/skills/snappy-remotion/api.ts preview <composition-id>` |
| `render` | `composition-id` | `write-reversible` | `npx tsx ~/.claude/skills/snappy-remotion/api.ts render <composition-id>` |
| `scaffold` | — | `draft` | `npx tsx ~/.claude/skills/snappy-remotion/api.ts scaffold` |

## Show the result

When an answer carries `face_hint`, show it with one `snappy_present(<answer>)` call.
See `/snappy-faces` for face selection. Human-facing images must crop to the
element, render at 2x on Retina, and fill the destination channel instead of
placing a small card in a full-page screenshot.
<!-- SNAPPY-CONTRACT-VERBS-END -->

---

## Self-correcting loader (PID feedback)

The system spec lives at `~/.claude/skills/snappy-settings/skill-spec.md`. It defines the entire Snappy operating system. You enforce it.

### Before you finish, do two things:

**1. Fix gaps (P -- proportional). MANDATORY.** If this AGENTS.md didn't cover your case -- if you had to read another file, run a command not documented here, work around a wrong selector, or discover a quirk -- you MUST attempt an `Edit` before you can log.

- **Default action: edit this AGENTS.md.** Surgical. Add the missing line, table row, or code example where it belongs. No restructuring.
- **Only LOGGED is allowed when:** the fix needs >10 lines, spans multiple files, or requires a structural rewrite (in which case the drain-skill-regen.sh queue picks it up).
- The goal: the next agent never has to leave the loader.

**2. Validate structure.** Check this skill against the spec:
- `api.ts` exists with typed exports, CLI mode, `import { env } from "../snappy-settings/load.ts"`
- `api.ts` calls APIs directly (no Xano proxy, unless this skill IS a Xano DB skill)
- `AGENTS.md` has API module section with import + function table + CLI
- No shell-command workarounds, no hardcoded tokens anywhere
- **Every action row carries a `certificate:` block** (premises / action / trace / evidence / conclusion). Same-session toasts are NOT evidence -- must be a fresh independent read. Missing or weak certificates are a gap: P-fix them inline and log to `~/.claude/logs/verification-gaps.log`.
- **DRY:** before you add a new function or new skill, run `~/.claude/skills/snappy-settings/scripts/dry-check.sh <name-or-keyword>`. If it matches an existing skill, extend that one instead. Fragmentation is the enemy.
- If any check fails -> fix it or log it

**2b. If you just reported an action as successful, verify your certificate.** You may not claim PASS unless the `evidence:` line is a fresh independent read (reload, new session, server round-trip). If your evidence is a toast, a return value, or a same-session DOM read, downgrade the claim to INCONCLUSIVE and log to `verification-gaps.log`.

**3. Log always.**
```bash
echo "[$(date -u +%FT%TZ)] snappy-remotion: <what was missing or fixed> [FIXED|LOGGED]" >> ~/.claude/logs/agents-md-feedback.log
```
`FIXED` = you patched it. `LOGGED` = too large for inline fix, queued for drain-skill-regen.sh.

**Do not skip this.** Every agent run must leave the system better than it found it.

Keyboard Shortcuts

Search in document⌘K
Focus search/
Previous file tab
Next file tab
Close overlayEsc
Show shortcuts?