Remotion
Create videos programmatically with React using Remotion. Scaffold projects, write compositions, and render MP4s. Zo-optimized wrapper around official Remotion agent skills.From its SKILL.md
npx -y skills add thevibethinker/vibe-thinker-skills --skill remotionAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
4.9 KB, ~1.2k tokens by cl100k_base, as published. Nobody here has run it
When to Use
Use this skill when:
- Creating programmatic videos from code (not generative AI video)
- Building data-driven video content (charts, stats, personalized videos)
- Producing batch videos from templates + data
- Creating animated social content (TikTok, Reels, Shorts)
- Building product/explainer videos with precise control
Quick Start
1. Create a New Project
python3 Skills/remotion/scripts/remotion_cli.py new my-video --template blank
cd Sites/my-video
2. Write Your Composition
Edit src/Composition.tsx - this is your video defined as React components.
3. Preview in Studio
python3 Skills/remotion/scripts/remotion_cli.py studio my-video
4. Render to MP4
python3 Skills/remotion/scripts/remotion_cli.py render my-video --output output.mp4
Core Concepts
Compositions
A composition defines your video's dimensions, duration, and fps:
<Composition
id="MyVideo"
component={MyComponent}
durationInFrames={300} // 10 seconds at 30fps
fps={30}
width={1920}
height={1080}
/>
Frame-Based Animation
ALL animations MUST use useCurrentFrame(). CSS animations are FORBIDDEN.
const frame = useCurrentFrame();
const { fps } = useVideoConfig();
const opacity = interpolate(frame, [0, fps], [0, 1], { extrapolateRight: 'clamp' });
Sequences
Use <Sequence> to time when elements appear:
<Sequence from={30} durationInFrames={60}>
<Title />
</Sequence>
Rule References
Read these for detailed patterns (loaded from upstream Remotion skills):
| Rule | Description |
|---|---|
references/animations.md | Frame-based animation fundamentals |
references/timing.md | Springs, easing, interpolation curves |
references/compositions.md | Defining compositions, stills, folders |
references/sequencing.md | Timing and ordering elements |
references/videos.md | Embedding videos - trim, volume, speed |
references/audio.md | Audio handling - import, trim, volume |
references/assets.md | Images, fonts, static files |
references/transitions.md | Scene transitions |
references/text-animations.md | Typography animation patterns |
references/charts.md | Data visualization patterns |
references/display-captions.md | TikTok-style captions |
CLI Commands
# Project management
python3 Skills/remotion/scripts/remotion_cli.py new <name> [--template blank|hello-world]
python3 Skills/remotion/scripts/remotion_cli.py studio <name>
python3 Skills/remotion/scripts/remotion_cli.py render <name> [--composition ID] [--output path]
python3 Skills/remotion/scripts/remotion_cli.py list
# Rendering options
--composition ID # Specific composition to render (default: first)
--output PATH # Output file path (default: out/video.mp4)
--fps N # Override FPS
--width N # Override width
--height N # Override height
--codec CODEC # h264, h265, vp8, vp9, prores (default: h264)
Common Patterns
Fade In/Out
const frame = useCurrentFrame();
const { fps, durationInFrames } = useVideoConfig();
const fadeIn = interpolate(frame, [0, fps], [0, 1], { extrapolateRight: 'clamp' });
const fadeOut = interpolate(frame, [durationInFrames - fps, durationInFrames], [1, 0], { extrapolateLeft: 'clamp' });
const opacity = fadeIn * fadeOut;
Spring Animation (Natural Motion)
const scale = spring({
frame,
fps,
config: { damping: 200 }, // Smooth, no bounce
});
Staggered Elements
{items.map((item, i) => (
<Sequence key={i} from={i * 10}>
<Item data={item} />
</Sequence>
))}
Data-Driven Video
type VideoProps = { title: string; stats: number[] };
export const DataVideo: React.FC<VideoProps> = ({ title, stats }) => {
// Animate based on props
};
// In Root.tsx:
<Composition
id="DataVideo"
component={DataVideo}
defaultProps={{ title: "Q4 Results", stats: [10, 20, 30] }}
// ...
/>
Integration with Zo
Batch Rendering
Use /zo/ask to render multiple videos in parallel:
for row in data:
# Each call renders with different props
await render_video(row)
Output Location
Projects live in Sites/<name>/ for consistency with Zo's site system.
Rendered videos output to Sites/<name>/out/.
Constraints
- No CSS animations - They won't render correctly
- No Tailwind animation classes - Same issue
- Frame-based only - All motion from
useCurrentFrame() - CPU-intensive - Rendering takes time; complex videos = longer render
- Node.js required - Remotion needs Node environment (already available in Zo)
What ships with it: 31 files
89.1 KB alongside SKILL.md, 1 of them executable
references/
- 3d.md2.2 KB
- animations.md790 B
- assets.md1.6 KB
- audio.md3.7 KB
- calculate-metadata.md2.9 KB
- can-decode.md1.5 KB
- charts.md1.7 KB
- compositions.md3.6 KB
- display-captions.md3.6 KB
- extract-frames.md5.4 KB
- fonts.md3.4 KB
- get-audio-duration.md1.3 KB
- get-video-dimensions.md1.6 KB
- get-video-duration.md1.3 KB
- gifs.md3.8 KB
- images.md2.7 KB
- import-srt-captions.md2.1 KB
- lottie.md1.7 KB
- maps.md11.1 KB
- measuring-dom-nodes.md974 B
- measuring-text.md2.9 KB
- parameters.md2.3 KB
- sequencing.md2.7 KB
- tailwind.md422 B
- text-animations.md700 B
- timing.md3.8 KB
- transcribe-captions.md850 B
- transitions.md3.6 KB
- trimming.md1.2 KB
- videos.md3.4 KB
scripts/
- remotion_cli.pyruns10.2 KB