How to Fix "Remotion Render Failed"
This error message is a wrapper — the actual cause is almost always one of four specific problems, and the fix depends on which one you've hit.
"Render failed" isn't a single bug — it's Remotion surfacing whatever went wrong underneath, and the console output right above that line almost always names the real cause. Read that first.
1. Missing or unresolvable assets
The most common cause. Remotion runs in a browser during Studio preview, where relative paths like ../assets/logo.png can resolve against your dev server. During an actual render, everything gets bundled, and that same relative path often no longer points anywhere.
import { staticFile } from "remotion";
<Img src={staticFile("logo.png")} />Files referenced with staticFile() from your public/ folder resolve consistently in both preview and render — that's what it exists for. If you're seeing "could not find" or "ENOENT" errors, this is almost always the fix.
2. Codec or media decode errors
If the failure mentions a specific media file and a decode error, the source video or audio is in a format or codec the renderer's underlying browser can't play — common with unusual codecs from screen recorders or older camera exports. Re-encoding the source to standard H.264/AAC MP4 with FFmpeg before importing it into your composition resolves this in most cases.
3. A delayRender that never resolves
If a component calls delayRender() — commonly for loading audio data or waiting on an async fetch — and the corresponding continueRender() never fires, Remotion waits and eventually times out with a failure. Check every delayRender call has a matching continueRender in every code path, including error branches.
4. Out-of-memory on long or heavy renders
Very long compositions, or ones with many simultaneous video layers, can exceed available memory during rendering, especially on CI or constrained environments. Rendering in smaller chunks (using Remotion's built-in frame range options) or increasing the render machine's available memory are the two practical fixes.
Why this keeps happening on new compositions
Every one of these is a structural mistake in the composition's code — and every time an AI coding agent writes new composition code from scratch for a new video, it can reintroduce any of them. That's the actual pattern worth noticing: the fix for any single instance is straightforward, but the fix for the failure recurring is not writing new structural code each time.
A locked, pre-rendered template has already hit and fixed these failure modes once. NULLFRAME's templates only ask an AI to fill in content — never to write composition code that could reintroduce them.
See the templatesCommon questions
Where do I find the actual error behind "render failed"?+
Does this happen more with AI-generated Remotion code?+
Can I get more detail by rendering with verbose logging?+
--log=verbose on the CLI surfaces significantly more detail about what step failed.