← media · The limits of Remotion

Remotion is powerful.
Here's where it stops.

Remotion renders React components to MP4 by driving a headless Chrome, one time value at a time, capturing each frame. That model is what makes it deterministic and hash-reproducible — and also what draws its ceiling. Below are the seven walls it can't scale, each one demonstrated live in this page.

01
Architectural

Everything derives from useCurrentFrame(). There is no now.

A Remotion composition is a pure function (frame) → pixels. Any input that isn't part of the timeline — the user's camera, a websocket, a keypress, a mic — is invisible to it. The renderer sees only frame. That's the whole surface.

Remotion model CAN'T
Deterministic. Frame 42 always looks the same. Ships to prod, reproducible from CI.
Web-native CAN
requesting camera…
Live camera feed. Composed real-time into the same 9:16 canvas. Remotion can't call getUserMedia during render.
02
Design constraint

No state carries frame → frame. Physics has to be integrated from time.

Because rendering can be parallelized across workers, no useRef survives between frames on different processes. Simulations with feedback (fluids, boids, cloth) are impossible — you'd need a closed-form solution or accept a serial pipeline. Below, the left panel is closed-form (Remotion-friendly), the right is Verlet integration (needs previous-frame state).

Time-based motion Remotion OK
Position = f(time). Any frame renders in isolation. This is the sweet spot.
Physics with feedback Remotion breaks
Verlet integration — each frame reads the previous frame's positions. In Remotion you'd need a serialized worker pool, defeating parallelism.
03
Output format

The output is a video file. Videos don't have hover, click, or focus.

Once encoded, the artifact is bytes. Interactive video (branching, scrubbable overlays, tooltips) needs an app, not an MP4. Remotion's <Player> component gives you playback, but not per-frame interaction.

Rendered MP4 CAN'T
Passive. Rendered years ago. No amount of clicking changes it.
Interactive canvas CAN
tap or move
Click to detonate — particles feel the pointer. This is a game, not a video.
04
Deployment

The render pipeline needs Chrome, Node, ffmpeg, and RAM. Not always available.

Remotion drives a headless Chromium via @remotion/renderer. That means every render environment needs a working Chrome install, node_modules, and enough memory for 1080p frames. Serverless works — with cold starts and image bloat. Below: pure browser <canvas> + MediaRecorder renders to an actual video file with zero server.

Remotion render Needs server
// Node.js + Chrome install required
import { renderMedia, selectComposition } from '@remotion/renderer';
const composition = await selectComposition({
  serveUrl: './out', id: 'MyVideo', inputProps
});
await renderMedia({
  composition, serveUrl, codec: 'h264',
  outputLocation: './out.mp4'
});
Needs: node ≥ 18 · Chrome ≥ 100 · ffmpeg-static · ~4 GB RAM per 1080p worker
Browser export Zero backend
Just this HTML file. No server. Nothing installed. Ships to Cloudflare Pages / GitHub Pages / an email attachment.
05
Performance

React reconciliation is not free. At 100k elements it dominates the frame budget.

Every frame, Remotion re-renders the entire React tree. For scenes with hundreds of DOM/SVG nodes at 60fps, the reconciler cost eats the render window before the encoder does. Canvas escape-hatches exist — but you're no longer using React. Below: 5,000 particles under React (imaginary) vs. straight drawImage loop.

SVG · React model Slow at N
500 SVG circles — CPU cost = O(N) reconciliation per frame. FPS:
Canvas · raw draw Free at N
5,000 canvas points — GPU raster, no React. FPS:
06
Time model

One fixed FPS. No variable frame rate. No real-camera motion blur.

You pick fps: 30 or 60 and every frame is captured at that rate. Real cameras integrate light over shutter time — that's what makes moving objects look smooth. Remotion has to fake motion blur (compositing multiple sub-frames), which multiplies render cost. Below is a genuine per-sample accumulation you couldn't cheaply do in Remotion.

Discrete frames Choppy
Snapshotted at 30fps. Fast motion strobes. Remotion's fix is <Freeze> + averaged sub-frames — expensive.
Real-time accumulation Smooth
Accumulator blends the last N sub-samples in real time. Zero-cost motion blur, browser side.
07
Media pipeline

Audio is muxed after the fact. Sample-accurate sync needs manual offsets.

Remotion encodes video first, then remixes audio during muxing. Reactive audio (Web Audio API graphs, live filters, feedback loops, mic input) can't participate in the render — you can only supply <Audio src="…" /> and pray your offsets match your visual keyframes. Below: a real-time FFT visualizer that's inherently reactive.

File-based audio Post-mux
<Audio src="track.mp3" />
assembled post-render
no live filters
no mic input
no Web Audio graph
You pre-choose the audio, then align visuals to timestamps. Reactive audio is out of scope.
Live FFT Reactive
Web Audio Analyser node feeds visuals directly. The audio graph and the video are one thing.

So what is Remotion for?

None of these limits are bugs — they're the price of the guarantee. Remotion trades interactivity for reproducibility: the same code + same inputs = the exact same MP4 forever. That's a superpower for data-driven videos, marketing pipelines, weekly recaps, or anything you'll re-render as data changes. Web-native canvas trades the guarantee for immediacy: everything the browser can do, in the browser, live.

Reach for Remotion when…

  • The video is driven by data that changes (weekly reports, sports recaps, personalized end-of-year videos)
  • You need bit-identical outputs from CI
  • You want React DX for authoring — components, props, layout engine
  • Rendering scale is the constraint (hundreds of MP4s per day)

Reach for web-native when…

  • The user needs to see & modify their video live in-browser
  • Camera, mic, or peer input drives the composition
  • You can't run Node/Chrome on the target (mobile Safari, iframe embed, edge)
  • The video IS an app — click, tap, hover, drag are part of the experience