Why does my HyperFrames render look different from the preview?
Preview and render run the same runtime, so a real difference has a specific cause: fonts, remote media, a cold-seek state problem, the wrong entry file, or a variable that never arrived. Here is how to find which.
The design goal is that they match, and the docs say why they should: preview and render run the same runtime, and capture waits until the composition is fully loaded. So when they differ, one of a short list of things is different. Check in this order.
1. Fonts
The most common visible difference. Fonts and Chrome versions differ between computers, so a local render can shift by a pixel from one machine to the next, and a font that your machine resolves may not resolve the same way elsewhere. Embed the font with @font-face rather than relying on a system font. See the fonts answer.
2. Remote media
Remote media can fail because of permissions, expiring URLs or cross-origin restrictions. Prefer a local project asset. Confirm the path, the filename capitalisation, and whether the file was moved or renamed.
3. An element that only exists in sequence
If something is hidden and revealed by a tween, a render worker that seeks directly to a later frame restores the authored hidden state instead of what the preview showed. Elements stay invisible, or appear early. See the cold-seek answer.
4. You are not looking at the same file
If check, snapshot and render all look blank or wrong, you may be rendering the scaffold instead of your composition. See the wrong entry file answer.
5. A value that arrives in preview and not in render
One confirmed case: data-variable-values passed to a sub-composition were injected by preview and snapshot, but render left the variables empty and painted the JavaScript defaults, silently and with exit code 0. It was reported against 0.7.42 and closed on July 8, 2026. If your composition uses variables on sub-compositions and an old version, compare a rendered frame, not a snapshot.
6. Browser-specific effects
The docs' own checklist for this symptom is fonts, remote media, browser-specific effects and the actual exported file. If an effect such as a blur or a filter looks different in the render, rule out your machine first with a Docker render, which pins the Chromium version.
What is not a difference
Speed. Preview plays in real time and can stutter. Render never drops a frame. Do not "fix" a stuttering preview by degrading the composition, because the render will be perfect regardless.
Tiny pixel noise between parallel workers. A default multi-worker render can produce a handful of plus or minus one pixel level differences at worker chunk boundaries. If you need bit-exact output, use --workers 1.
Check it worked
npx hyperframes render --docker --output output.mp4
If the Docker render matches your preview, the difference was your machine. If it does not, the difference is in the composition: go back to causes 3 to 5. For a wider view of the principle behind this, see why a render looks different from the preview, for any tool.
One runtime for the preview and the file

In GenMotion the editor preview and the export are the same HyperFrames page. The export drives it frame by frame in an offscreen window and ffmpeg encodes the frames into the MP4, on your own machine, so there is no second renderer for the preview to disagree with.
Related answers
Why do my fonts look wrong in a HyperFrames render, and what is FONT_FETCH_FAILED?
A font that looks right in preview can fall back, change weight or fail the render outright. Embed the font with @font-face, understand what the compiler does with a named Google Font, and know why Arial and Segoe UI behave differently from Helvetica.
Why is an element invisible in my HyperFrames render but fine in preview?
A render worker seeks straight to a frame and restores the authored state, not whatever the preview last showed. Elements that start hidden need their visible end state stated explicitly, and a fromTo shows its from-state before it starts.
Why did HyperFrames check pass and render exit 0 when my video is wrong?
HyperFrames can produce a valid-looking MP4 from a composition that is structurally fine and visually wrong. Here is the class of bug, what has been fixed to fail loudly, and what to verify yourself.
What are the HyperFrames determinism rules, in one checklist?
Same composition, same video, every time, as long as nothing in a frame reads the clock, an unseeded random number or the network. The rules, the reason for each, and the lint codes that enforce them.
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.
Sources
- HyperFrames: Deterministic Rendering
- HyperFrames troubleshooting: the render looks different from preview
- HyperFrames: Fix a slow preview or render
- hyperframes#2064: render drops data-variable-values in sub-compositions
This answer as plain Markdown, for agents: /answers/hyperframes-render-looks-different-from-preview.md