| Basic animation | useCurrentFrame() + interpolate() | Always clamp with extrapolateRight: 'clamp' |
| Spring animation | spring({ frame, fps }) | { damping: 200 } for smooth, no-bounce motion |
| Composition | <Composition id, component, durationInFrames, fps, width, height> | Always set explicit dimensions |
| Dynamic metadata | calculateMetadata on <Composition> | Set duration, dimensions, props before render |
| Sequencing | <Sequence from, durationInFrames> | useCurrentFrame() returns local frame (starts at 0) |
| Series | <Series> with <Series.Sequence> | Sequential playback; negative offset for overlaps |
| Transitions | <TransitionSeries> with fade(), slide(), wipe() | Total duration = sum of scenes minus transition durations |
| Audio/Video | <Audio> / <Video> from @remotion/media | Use staticFile() for local assets |
| Captions | createTikTokStyleCaptions() | Token-level word highlighting via page.tokens |
| Images | <Img> from remotion | Never use native <img> or Next.js <Image> |
| GIFs | <AnimatedImage> from remotion | Synced with timeline; playbackRate for speed control |
| Fonts | @remotion/google-fonts or @remotion/fonts | Call loadFont() at top level; blocks rendering until ready |
| 3D content | <ThreeCanvas> from @remotion/three | Must set width/height; useFrame() from R3F is forbidden |
| Text measurement | measureText(), fitText() from @remotion/layout-utils | Load fonts first; match properties for measurement and render |
| Parameters | Zod schema on <Composition schema> | Top-level must be z.object(); exact Zod version required (check Remotion docs) |
| Transparent video | --pixel-format=yuva420p --codec=vp9 | WebM for browser; ProRes 4444 for editing software |
| Maps | Mapbox with useCurrentFrame() | Set interactive: false, fadeDuration: 0; render with --gl=angle --concurrency=1 |