| name | remotion |
| description | Remotion video generation: create product demo videos, animated release notes, and explainer videos as React components — render to MP4/GIF programmatically |
Remotion Skill
When to activate
- Creating a product demo video from code (no video editor needed)
- Building animated release notes or changelogs
- Generating an explainer video for a feature or process
- Creating a data visualisation video from dynamic data
- Automating video generation in a CI/CD pipeline
When NOT to use
- Recording a screen — use Loom or OBS
- Editing existing video footage — use DaVinci Resolve or Premiere
- Real-time video streaming
- Simple GIF — use a GIF tool for static animations
Instructions
Project setup
npm create video@latest
npm install remotion @remotion/cli @remotion/player
src/
remotion/
Root.tsx ← registers all compositions
compositions/
ProductDemo.tsx ← your video compositions
ReleaseNotes.tsx
index.ts
npx remotion studio
npx remotion render ProductDemo output/demo.mp4
npx remotion render ProductDemo output/demo.gif --codec=gif
Product demo video
Generate a product demo video composition.
Product: [describe]
Duration: [X seconds]
Scenes: [list what to show]
import { AbsoluteFill, useCurrentFrame, useVideoConfig, spring, interpolate } from 'remotion'
export const ProductDemo: React.FC = () => {
const frame = useCurrentFrame()
const { fps, durationInFrames } = useVideoConfig()
const scene1End = fps * 3
const scene2End = fps * 7
const scene3End = fps * 12
const opacity = spring({
frame,
fps,
config: { damping: 200 },
from: 0, to: 1,
})
const translateY = interpolate(
frame,
[0, 20],
[50, 0],
{ extrapolateRight: 'clamp' }
)
return (
<AbsoluteFill style={{ backgroundColor: '#0a0a0a' }}>
{frame < scene1End && (
// Scene 1: Hero
<AbsoluteFill style={{ justifyContent: 'center', alignItems: 'center' }}>
<div style={{
opacity,
transform: `translateY(${translateY}px)`,
color: 'white',
fontSize: 72,
fontWeight: 900,
fontFamily: 'Arial Black',
}}>
Product Name
</div>
<div style={{ color: '#f97316', fontSize: 28, marginTop: 16 }}>
The tagline goes here
</div>
</AbsoluteFill>
)}
{frame >= scene1End && frame < scene2End && (
// Scene 2: Feature demonstration
<FeatureScene
frame={frame - scene1End}
fps=
=
=
/>
)}
)
}
export const RemotionRoot: React.FC = () => (
<>
<Composition
id="ProductDemo"
component={ProductDemo}
durationInFrames={360} // 12 seconds at 30fps
fps={30}
width={1920}
height={1080}
/>
</>
)
Generate the composition for my product.
Animated release notes
Generate an animated release notes video.
Version: [e.g. v2.0]
Features: [list of new features with descriptions]
Duration: [X seconds per feature]
import { AbsoluteFill, Sequence, useCurrentFrame, spring } from 'remotion'
const FEATURES = [
{ title: "Dark Mode", description: "Toggle between light and dark themes", icon: "🌙" },
{ title: "Bulk Export", description: "Export multiple items at once as CSV", icon: "📦" },
{ title: "Team Permissions", description: "Role-based access for every team member", icon: "🔒" },
]
const SECONDS_PER_FEATURE = 4
export const ReleaseNotes: React.FC = () => {
const frame = useCurrentFrame()
return (
<AbsoluteFill style= '#', ', ' }}>
{/* Version badge */}
v2.0 Release
{FEATURES.map((feature, i) => (
))}
)
}
: .<{ : [] }> = {
frame = ()
opacity = ({ frame, : , : { : }, : , : })
scale = ({ frame, : , : { : }, : , : })
(
)
}
my features list.
Rendering and export
npx remotion render ReleaseNotes output/release-v2.mp4 \
--codec=h264 \
--crf=18 \
--scale=1
npx remotion render ReleaseNotes output/release-v2.gif \
--codec=gif \
--scale=0.5 \
--every-nth-frame=2
npx remotion render ProductDemo output/clip.mp4 \
--frames=0-90
npx remotion render ReleaseNotes output/release.mp4 \
--props='{"version":"2.1","features":["New dashboard","Dark mode"]}'
import { renderMedia, selectComposition } from '@remotion/renderer'
const composition = await selectComposition({
serveUrl: 'http://localhost:3000',
id: 'ReleaseNotes',
})
await renderMedia({
composition,
serveUrl: 'http://localhost:3000',
codec: 'h264',
outputLocation: 'output/release.mp4',
})
Example
User: Create a 15-second product demo video for a SaaS invoicing tool. Show: 1) logo intro, 2) create invoice screen, 3) send and track, 4) CTA.
Claude's output:
export const InvoicingDemo: React.FC = () => {
const frame = useCurrentFrame()
return (
<AbsoluteFill style={{ backgroundColor: '#f8fafc' }}>
<Sequence from={0} durationInFrames={60}>
<LogoIntro />
</Sequence>
<Sequence from={60} durationInFrames={150}>
<CreateInvoiceScene frame={frame - 60} />
</Sequence>
<Sequence from={210} durationInFrames={150}>
<SendTrackScene frame={frame } />
)
}
Render: npx remotion render InvoicingDemo demo.mp4 --fps=30