Why is the text in my Remotion video blurry, and how do I render it crisp?
Soft text in an exported Remotion video is usually a pixel-density problem, not a compression one. Use output scaling, then CRF, then check JPEG quality, colour space and the codec. With the CRF defaults for every codec.
If the text in your exported video looks soft, the reflex is to lower the compression. That is usually the wrong first move. The Remotion quality guide lists the real causes in a deliberate order.
1. Pixel density, the surprising one
Take a 1920 by 1080 video with text in it, and embed it on a web page at width="1920" height="1080". On a high-density display such as a MacBook, the device has 2x pixel density but the video has 1920 by 1080 pixels, so each video pixel is twice as large as a device pixel. The text is less sharp than it would be on a low-density display. To match that sharpness you would need to render a 4K video.
Fix: use Remotion's output scaling to render at a higher pixel density without changing your composition:
npx remotion render --scale=2
The composition stays 1920 by 1080, and the output is 3840 by 2160, rendered at twice the density. This is the single biggest improvement for text-heavy video.
2. CRF, the main compression dial
The Constant Rate Factor controls quality. Lower is better quality and a larger file. Every codec has its own range and its own default, so the same number means different things:
| Codec | Best quality | Best compression | Default |
|---|---|---|---|
| H.264 | 1 | 51 | 18 |
| H.265 | 0 | 51 | 23 |
| VP8 | 4 | 63 | 9 |
| VP9 | 0 | 63 | 28 |
| AV1 | 0 | 63 | 30 |
So 23 looks very good on H.264 and terrible on WebM. Set it with --crf on the CLI or Config.setCrf() in the config file.
npx remotion render --crf=14
Hardware acceleration: if you enable it, you cannot set a CRF. Use --video-bitrate instead. The two are mutually exclusive.
3. JPEG quality
By default Remotion screenshots each frame as a JPEG at quality 80 on a scale of 0 to 100. Raise it with --jpeg-quality, or switch to PNG with --image-format=png, which is slower. PNG is also the format you need for a transparent video.
4. Colour accuracy
Export in bt709 for more accurate colours. The docs say this becomes the default in Remotion 5.0.
5. GIFs
GIFs only support a 256 colour palette, which is a large quality loss in itself. Make sure you are on at least v4.0.138 for the best colour accuracy, and choose a different format if the palette is not acceptable.
6. x264 preset
For H.264, --x264-preset controls the tradeoff between quality, speed and compression.
Recipe for crisp text
npx remotion render --scale=2 --crf=16 --jpeg-quality=95
These are starting values, not official recommendations. This renders at 2x density with a better CRF and JPEG quality. Expect a slower render and a larger file, since higher resolutions make renders slower (see why Remotion renders are slow). Tune it down to the point where the text still looks right in the place your viewers will watch.
Check it worked
View the result on the same kind of screen your audience uses, at the size they will see it. A render that looks sharp on a standard monitor can look soft on a Retina display, which is the case this guide is about.
Check sharpness on the real output

In GenMotion you preview the composition frame by frame and export from that same project, so you judge text on the real output instead of reasoning about CRF. GenMotion does not render Remotion projects: it builds Three.js and HyperFrames videos. Remotion alternatives, compared honestly.
Related answers
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.
Why does my video render look different from the preview?
The principle behind every preview-versus-render mismatch in code-to-video tools: a frame must be a pure function of its time. Here is what breaks that, how HyperFrames and Remotion each enforce it, and how to test for it.
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.
How to create a product launch video with Remotion
Build a 12 second, four scene product launch video in Remotion: scaffold, fonts, one React component per scene, Studio, stills and a real render. Every file and command was run on Remotion 4.0.533.
Sources
This answer as plain Markdown, for agents: /answers/remotion-blurry-text-in-exported-video.md