Create Remotion animations for your videos. B-roll accents, social clips, diagrams, text overlays, and transitions for any format.
Today: !date +%Y-%m-%d
Create branded video animations using Remotion. Covers all animation types: B-roll for any format, social clips, diagrams, overlays, and one-off animations. Supports landscape (16:9), vertical (9:16), and square (1:1).
Pipeline position: /video-edit -> /video-animate -> /video-finalize
[active-business]/brand.md (Section 4: Brand Voice) for brand colors, fonts, and tone.[active-business]/lessons.md for any animation or video lessons.system/tools/video-animations/node_modules. If it exists, Remotion is ready. If not, check for system/config/remotion-setup.md and tell the user: "Remotion isn't installed yet. Check system/config/remotion-setup.md for setup instructions. In the meantime, I can create a detailed animation brief you can use with any video tool."Set remotion_available = true or false for the rest of the workflow.
system/tools/video-animations/src/compositions/archetypes.md (if it exists) -- animation pattern catalogsystem/tools/video-animations/src/config/ (if it exists)shared.ts from any existing composition folderRead the request and identify:
Read the full script and identify moments that benefit from visual animation:
Every script-based vertical video batch MUST include a hook animation as item #01. This is a 1-2 second animated opener before the talking head.
Hook types (pick the best fit):
| Type | When to use |
|---|---|
| Tweet card | Citing someone's claim/tweet |
| Bold title card | Introducing a tool/concept |
| Stat reveal | Hook is a number |
| News flash | Covering a new release |
| Contrarian claim | Challenging conventional wisdom |
Specs: 1-2 seconds (30-60 frames), full-screen, dark background, text fills 60%+ of frame.
For landscape format, the hook animation is optional.
If the brand has a background file, cross-reference claims and numbers. Flag discrepancies but don't block. Present them: "The script says X but your files say Y. Which is correct?"
Ask via AskUserQuestion:
Mood/energy -- What's the overall feel?
Format -- What output dimensions?
Any specific requests? -- Open text for constraints, must-haves, or references.
For each animation moment, select an archetype from the catalog (if it exists). Aim for variety -- avoid using the same pattern twice in a row.
| Decision | How to decide |
|---|---|
| Archetype | Match content type to pattern |
| Duration | Max 3 seconds (90 frames at 30fps). Simplify content rather than extending. |
| Background | Dark and light modes. Every animation gets both. |
| Element | Landscape (1920x1080) | Vertical (1080x1920) | Square (1080x1080) |
|---|---|---|---|
| Headings | 48-72px | 64-80px | 56-72px |
| Body | 28-36px | 38-50px | 32-42px |
| Labels | 20-24px | 28-36px | 24-30px |
Vertical-specific:
Show a minimal list:
1. AnimationName -- one-line description
2. AnimationName -- one-line description
...
Total: N animations
Hook: [yes/no, type]
Formats: [landscape/vertical/square/multiple]
Wait for approval before building.
system/tools/video-animations/src/compositions/{platform}-{slug}-{YYYY-MM}/
-- shared.ts -- BgMode helpers, font loading, theme re-exports
-- 01-AnimationName.tsx
-- 02-AnimationName.tsx
Naming convention: {platform}-{slug}-{YYYY-MM}
yt, rl (reels), ig, fb, li, tw, web, miscCopy pattern from existing shared.ts (if available):
BgMode typebgColor(), headingColor(), bodyColor(), mutedColor(), etc.grainStyle() for texture overlayBuild each animation as a self-contained React component.
./shared -- never directly from theme{ mode: BgMode } prop -- every component supports dark and lightAbsoluteFill as root containergrainStyle(mode)interpolate(), spring(), and Easing from Remotion// Naming: {PREFIX}-{##}-{Name} for dark, {PREFIX}-{##}-{Name}-L for light
<Composition
id="YT-01-AnimName"
component={AnimName}
defaultProps={{ mode: "dark" as const }}
durationInFrames={90}
fps={30}
width={1920}
height={1080}
/>
Format prefixes:
YT = YouTube landscape, YTS = YouTube shortsRL = Reels verticalSQ = Square-L = lightBefore presenting, review and flag:
Present flags: "Things to double-check: #08 font might be tight on iPhone SE, #03 text might overlap platform UI"
cd system/tools/video-animations && npm run dev
Tell user: "Studio is open at http://localhost:3000. Check the flagged items. Let me know any changes needed."
Iterate on feedback until approved.
If Remotion is available:
Batch render everything. Run 4-5 in parallel.
Dark and light versions (MP4):
npx remotion render {COMPOSITION_ID} "output/path/{filename}.mp4" --crf 18
Vertical format also gets transparent (ProRes 4444):
npx remotion render {COMPOSITION_ID} "output/path/{filename}-alpha.mov" --codec prores --prores-profile 4444 --pixel-format yuva444p10le
Render outputs:
Verify each file exists and has non-zero size.
If Remotion is NOT available:
Create a detailed animation brief with:
Save brief to [active-business]/output/video/[date]-[slug]-animation-brief.md
# B-Roll Map: [Video Title]
| Script Section | Timestamp | Animation | File | Duration | Notes |
|---------------|-----------|-----------|------|----------|-------|
| "example text" | 0:45 | AnimName | 01-AnimName-dark.mp4 | 3s | Full screen replacement |
Save to same folder as rendered output: broll-map.md
Total animations: [N]
Total files rendered: [X] (dark + light MP4s, transparent MOVs)
Formats: [landscape/vertical/square]
Output: [path to rendered files]
B-roll map: [path] (if script-based)
If Remotion available:
system/tools/video-animations/src/compositions/{project-slug}/[active-business]/output/video/{project-slug}/If Remotion NOT available:
[active-business]/output/video/[date]-[slug]-animation-brief.mdWant to change anything? If you give feedback, I'll apply it and add a lesson to your brand's lessons.md so I remember next time.