remotion-video
Create production-grade motion graphics and videos using Remotion (React). Use whenever the user wants branded video content, product demos, data-driven video generation, or motion graphics with audio sync, web fonts, TailwindCSS styling, or media embedding. Covers: marketing videos, product launches, data visualizations, social media content, personalized video at scale, explainer videos with voiceover, animated charts, 3D scenes via Three.js. Requires Node.js and Claude Code environment. Trigger on: "create a Remotion video", "React video", "motion graphics", "branded video", "product demo video", "remotion", "video with audio", "TailwindCSS video", "data-driven video generation", "personalized video at scale", "video with voiceover". For mathematical animations, algorithm visualizations, or headless container rendering, use concept-to-video (Manim) instead.
NPX Install
npx skill4agent add mathews-tom/armory remotion-videoSKILL.md Content
Remotion Video
Reference Files
| File | Purpose |
|---|---|
| useCurrentFrame, useVideoConfig, interpolate, spring, core hooks |
| Easing, spring config, interpolateColors, timing patterns |
| Composition, registerRoot, Folder, calculateMetadata |
| Img, Video, OffthreadVideo, Audio, staticFile, async loading |
| Google Fonts, local fonts, text measurement, typography |
| TailwindCSS integration, utility-first styling in Remotion |
| Audio component, volume curves, trimming, frame-synced audio |
| Caption system, SRT/VTT parsing, word-level timing |
| @remotion/three, ThreeCanvas, React Three Fiber integration |
| Bar, pie, line chart animation patterns |
| CLI render, renderMedia API, quality presets |
| Dataset rendering, batch generation, parametric compositions |
| Parametric tech explainer template |
| Product showcase template |
| Animated chart composition template |
| Bootstrap a new Remotion project with TailwindCSS |
| Render wrapper with quality presets and format options |
Why Remotion
- Component composition: Nest scenes, reuse components, apply CSS.
- Spring physics: gives natural motion without hand-tweaking cubic beziers.
spring() - Asset pipeline: Import images, audio, video — the same way you import in React.
- Iterative workflow: Edit code → hot-reload preview → render final. The file IS the editable intermediate.
.tsx - Data-driven at scale: Render thousands of personalized videos by passing different props to the same composition.
Workflow
Scaffold → Compose → Preview → Iterate → Render- Scaffold the project (once per video project)
- Interpret the user's concept — choose the right template and rule files
- Compose React components for each scene
- Preview in Remotion Studio ()
npm run dev - Iterate based on user feedback
- Render final video via
scripts/render.sh
Step 0: Ensure Dependencies
node --version # Must be >= 18.0.0
npm --versionStep 1: Scaffold the Project
scripts/scaffold_project.shbash scripts/scaffold_project.sh my-video-project
cd my-video-project
npm run dev # Opens Remotion Studio at localhost:3000Step 2: Interpret the Concept
| Content type | Rule file | Template |
|---|---|---|
| Explainer / educational | fundamentals.md | explainer.tsx |
| Product demo / marketing | animations.md | product-demo.tsx |
| Data visualization / animated chart | charts.md | data-viz.tsx |
| Video with voiceover / narration | audio.md + subtitles.md | explainer.tsx |
| Social media clip (short, looping) | animations.md | product-demo.tsx |
| 3D scene / abstract motion graphics | three-d.md | (custom) |
| Personalized / batch generation | data-driven.md | any |
| Video with embedded media | media.md | any |
Step 3: Compose the Components
- One composition per video: points to one root composition.
registerRoot - Sequences for timing: Use to place scenes at specific frames.
<Sequence from={30} durationInFrames={60}> - AbsoluteFill for layering: Use as the base for any full-screen element.
<AbsoluteFill> - Frame-based math only: Derive all animation state from . Never use
useCurrentFrame()orDate.now().setTimeout - Spring over easing: Prefer for natural motion.
spring({ frame, fps }) - Props for everything variable: Hardcoded values → props. This enables data-driven rendering.
Component structure pattern
import {
useCurrentFrame,
useVideoConfig,
interpolate,
spring,
AbsoluteFill,
Sequence,
} from "remotion";
type MySceneProps = {
title: string;
accentColor: string;
};
export const MyScene: React.FC<MySceneProps> = ({ title, accentColor }) => {
const frame = useCurrentFrame();
const { fps, durationInFrames } = useVideoConfig();
const opacity = interpolate(frame, [0, 30], [0, 1], {
extrapolateRight: "clamp",
});
const scale = spring({ frame, fps, config: { damping: 12, stiffness: 100 } });
return (
<AbsoluteFill style={{ backgroundColor: "#0a0a0a" }}>
<div
style={{ opacity, transform: `scale(${scale})`, color: accentColor }}
>
{title}
</div>
</AbsoluteFill>
);
};Step 4: Preview
npm run devhttp://localhost:3000<Still>Step 5: Iterate
| Request | Action |
|---|---|
| "Slower/faster" | Adjust |
| "Different color" | Update props passed to composition |
| "Add a section" | Add new |
| "Change font" | Load via |
| "Add background music" | Add |
| "Make it loop" | Set |
| "Add captions" | See subtitles.md for SRT parsing and word-level timing |
Step 6: Render
scripts/render.shbash scripts/render.sh --composition MyComposition --quality final --format mp4Quality presets
| Preset | Resolution | FPS | Use case |
|---|---|---|---|
| 480p | 15 | Fast layout check |
| 720p | 30 | Client draft review |
| 1080p | 30 | Standard delivery |
| 2160p | 60 | Presentation / cinema |
Format options
| Format | Use case |
|---|---|
| Standard delivery (H.264) |
| Web-optimized |
| Embeddable in docs, social media |
Error Handling
| Error | Cause | Resolution |
|---|---|---|
| Node.js not installed | Install Node.js 18+ from nodejs.org |
| Dependencies not installed | Run |
| Wrong composition ID | Check |
| Async asset load > 30s | Increase timeout via |
| Video codec not supported | Convert to H.264 MP4 with ffmpeg first |
| Out of memory on large compositions | Reduce |
| Another dev server running | Kill existing process or set |
| Spring animation goes past 1.0 | Missing | Add extrapolation clamp to |
| Fonts not loading in render | Font not loaded before render starts | Use |
Limitations
- Node.js required — Remotion is a Node.js framework. Cannot run in Python-only or headless container environments.
- Chromium dependency — Remotion renders via Chromium. The command downloads it automatically, but it requires ~300MB disk space.
npx remotion render - No server-side Lambda in v1 — Cloud rendering via is deferred to a future skill version. Local rendering only.
@remotion/lambda - Large renders are slow — A 60-second 1080p video at 30fps = 1800 frames rendered through Chromium. Plan for 10-30 minutes on a typical laptop.
- GIF size — GIFs at full resolution are large. Limit to 480p and <10 seconds for embeddable GIFs.
- Audio in preview — Remotion Studio supports audio playback in preview. Rendered audio requires ffmpeg.
Design Principles
- Frame-based thinking: Every visual state is a function of the current frame number. No timers, no intervals.
- Composition-first: Split video into logical blocks. Each scene is its own component.
<Sequence> - Spring over easing: gives physically accurate motion. Only use
spring()with easing when spring doesn't fit.interpolate - Props for content: Never hardcode strings, colors, or data inside components. Pass via props to enable reuse.
- Type everything: All composition props have TypeScript types enforced via (Zod) or explicit interfaces.
z.infer<typeof schema>
Cross-Reference
concept-to-video