← marketplace
creatorsframeworksha:2d8c69e132b4c255manual
remotion-fundamentals
Use when authoring videos as React components — Composition registration, durationInFrames + fps timing, useCurrentFrame, Sequencing, and rendering to MP4 via the Remotion CLI or Remotion Lambda.
Tutorials · creator-attached
One-line install
curl --create-dirs -fsSL https://skillmake.xyz/i/remotion-fundamentals -o ~/.claude/skills/remotion-fundamentals/SKILL.md
The hash above pins this exact content. The file we serve at /api/marketplace/remotion-fundamentals-2d8c69e1/raw always matches sha:2d8c69e132b4c255.
4,285 chars · ~1,071 tokens
--- name: remotion-fundamentals description: Use when authoring videos as React components — Composition registration, durationInFrames + fps timing, useCurrentFrame, Sequencing, and rendering to MP4 via the Remotion CLI or Remotion Lambda. source: https://www.remotion.dev/docs/the-fundamentals generated: 2026-05-07T21:42:51.078Z category: framework audience: creators --- ## Tutorials - https://skillmake.xyz/v/remotion-fundamentals.mp4 ## When to use - Authoring videos as React components instead of After Effects timelines - Programmatic video generation from data (per-user reels, weekly recaps, dashboards) - Server-side rendering of MP4s from a CI pipeline or webhook - Composing multiple animated layers with React state and props ## Key concepts ### Composition The top-level unit Remotion renders. Registered in the Root component with a unique id, fps, durationInFrames, width, height, and a component reference. A project can hold many Compositions; the CLI selects one by id at render time. ### useCurrentFrame Hook that returns the integer frame index Remotion is currently rendering. All animation in Remotion is a pure function of this number — no setTimeout, no requestAnimationFrame, no Date.now(). Determinism comes from the frame loop, not wall clock. ### interpolate / spring Helpers for mapping the current frame to numeric values. interpolate(frame, [inFrame, outFrame], [from, to]) for linear; spring({frame, fps, config}) for natural motion. Combine with useVideoConfig() to get fps. ### Sequence + Series Composition primitives for time-windowing. <Sequence from={30} durationInFrames={60}> only mounts its children for that frame range. <Series> chains sequences without manual offset arithmetic. ### render targets npx remotion render renders locally with headless Chromium; @remotion/lambda renders distributed across AWS Lambda for long videos at scale; Remotion Studio gives a dev preview with timeline scrubbing. ## API reference ``` registerRoot(Root) — entry point ``` Tells Remotion which component holds the Composition registry. Required at the top of remotion.config.ts or src/index.ts. ``` import { registerRoot } from 'remotion'; import { Root } from './Root'; registerRoot(Root); ``` ``` <Composition /> registry props ``` Register a renderable composition. id is the CLI selector, fps + durationInFrames define timing, width/height define resolution. ``` <Composition id="MyVideo" component={MyVideo} durationInFrames={150} fps={30} width={1920} height={1080} /> ``` ``` useCurrentFrame() + interpolate() ``` Drive any prop from frame number. Combine with extrapolateLeft/Right: 'clamp' so values don't run past the keyframes. ``` import { useCurrentFrame, interpolate } from 'remotion'; const Title = () => { const frame = useCurrentFrame(); const opacity = interpolate(frame, [0, 30], [0, 1], { extrapolateRight: 'clamp' }); return <h1 style={{ opacity }}>Hello</h1>; }; ``` ``` npx remotion render <id> out.mp4 ``` Render a Composition by id to an MP4 file via headless Chromium. --concurrency, --crf, and --codec are common flags. ``` npx remotion render MyVideo out/video.mp4 --concurrency=8 --crf=18 ``` ``` <Sequence from={X} durationInFrames={Y}> ``` Mount children for a frame window only. Frame numbers inside are relative to the sequence's start (frame 0 inside Sequence = global frame X). ``` <Sequence from={30} durationInFrames={60}> <Title /> </Sequence> ``` ## Gotchas - Animation must be a pure function of useCurrentFrame — Math.random or Date.now will break frame-stable rendering. Seed any randomness with the frame. - Audio assets that exceed durationInFrames are silently truncated; check durationInFrames === Math.ceil(audioDuration * fps). - Lambda rendering caps at 30 minutes per render and 10 GB output by default — split long videos into chunks and concat. - useEffect runs per-mount, not per-frame; use useMemo + useCurrentFrame for per-frame computation. - delayRender + continueRender is the only way to make Remotion wait for async data (fonts, fetch); forgetting continueRender hangs the renderer. --- Generated by SkillMake from https://www.remotion.dev/docs/the-fundamentals on 2026-05-07T21:42:51.078Z. Verify against source before relying on details.
File: ~/.claude/skills/remotion-fundamentals/SKILL.md