Why is my Remotion render stuck, and what do I check first?
A Remotion render that hangs at a percentage, or at the last frame, with no error. Four checks in order: a delayRender longer than your Lambda timeout, verbose logs, Chrome Headless Shell, and the Lambda errors field.
A hang with no error is the worst case, and Remotion's own docs have a short checklist for it. Work through it in this order.
1. Is a delayRender() outliving everything else?
If the delayRender() timeout is too big and never resolves, a render can get stuck indefinitely without an error message. This is more confusing on Lambda, whose runtime also has a timeout: if the delayRender() timeout is bigger than the Lambda function timeout, the function times out first, and the delayRender() never fails, so there is no error at all.
To debug it:
- Set the
delayRender()timeout to a smaller value, so that if it does not resolve an error message appears. - Always call
cancelRender()for any error that prevents you from callingcontinueRender().
See the delayRender answer for the full list of causes.
2. Turn on verbose logging
npx remotion render --log=verbose
This shows failures from the browser and from child processes that would otherwise be silent.
3. Make sure Chrome Headless Shell is used
Newer Chrome versions may no longer work with Remotion and can leave a render stuck, because Chrome removed the old headless mode. Remotion needs Chrome Headless Shell instead. This does not occur on Remotion Lambda.
Follow these practices:
- Do not download Chrome from a Linux package manager.
- Do not set
--chrome-executable. Let Remotion download a compatible Chrome Headless Shell for you. - Run
npx remotion browser ensureso a compatible version is ready before the first render.
4. Lambda: are you reading the errors field?
If overallProgress looks stuck on Lambda:
- Read the
errorsfield fromgetRenderProgress(), because there may be errors you are not displaying. - Stop polling
getRenderProgress()whenfatalErrorEncounteredistrue.
If one chunk is running much longer than the rest, check whether it is loading a remote video or audio file. With <Video> or <Audio> from @remotion/media, Remotion may fetch only the byte ranges it needs, and a slow or uncached range request can make one chunk wait much longer than the others. If your assets are on Cloudflare R2, serve them through a custom domain with caching on, because the r2.dev development URL does not support caching. If the response header says CF-Cache-Status: DYNAMIC, it was not served from cache. A source video with long gaps between keyframes makes this worse, so re-encoding it with a shorter keyframe interval can help.
To make a stalled media load fail before the function reaches its execution timeout, set delayRenderTimeoutInMilliseconds on the media component to a value below the Lambda timeout, and use delayRenderRetries if it should retry.
5. Too much load
A stalled browser from CPU or memory overload surfaces as a page function timeout. Lower the concurrency.
Check it worked
After each change, run a short render of a few seconds with --log=verbose rather than the full video. A stuck render should now either finish or fail with a message you can act on.
An export you can watch

GenMotion exports run on your own machine, driven frame by frame from the editor you already have open, so there is no Lambda function to time out silently and no chunk to go missing. GenMotion does not render Remotion projects: it builds Three.js and HyperFrames videos. Remotion alternatives, compared honestly.
Related answers
What does 'A delayRender() was called but not cleared after 28000ms' mean in Remotion?
Remotion waited for something to finish before capturing a frame and gave up after about 30 seconds. The causes, in order of how often they bite: continueRender never called, blocked network, too much concurrency, a large OffthreadVideo, rate-limited remote assets.
What does 'Timed out evaluating page function' mean in Remotion?
It looks like a delayRender problem and it is not. The browser stopped responding because it is overloaded. The fix is usually to lower concurrency, not to hunt for an uncleared handle.
Why is my Remotion render slow, and why does more concurrency make it worse?
Concurrency is not a dial you turn up. Too high and too low are both slow. Remotion's own performance guide, in order: video tag, concurrency benchmark, GPU effects, slow JavaScript, data fetching, codec, resolution, and Lambda.
What does 'TooManyRequestsException: Rate Exceeded' mean on Remotion Lambda?
You hit your AWS Lambda concurrency limit. New AWS accounts are sometimes capped as low as 10. How to render anyway with concurrency set lower, see your limits, and request an increase.
What does 'delayRender "Loading root component" was called but not cleared' mean in Remotion?
This one is not about your code. It means Remotion was pointed at a file that never calls registerRoot(). Pass the right entry point and it goes away.
Sources
- Remotion: Debugging stuck renders
- Remotion: Debugging failed Lambda renders
- Remotion: Debugging timeouts
This answer as plain Markdown, for agents: /answers/remotion-render-stuck.md