Benchmark

ONDA vs Remotion, measured.

The same 1080p composition, rendered on the same machine, with the same encoder. ONDA draws natively on the GPU; Remotion drives every frame through a headless browser. The numbers below are from the repo's reproducible suite — higher fps is better.

26 fps

Remotion, per worker

Holds ~26 fps whether the scene has 6 nodes or 201 — you pay the browser tax, not for the drawing.

217 fps

ONDA GPU, the heavy scene

Renders the 33× heavier scene only 1.4× slower than trivial. Cost tracks the graphics, not the browser.

How it's measured

Same scene. Same machine. Same encoder.

onda-bench's cluster(i) and Remotion's <Cluster i> use identical geometry and scatter formula, so the two stay directly comparable as the scene scales from trivial to complex.

  • Apple M4 PromacOS, same machine for both
  • 1920 × 1080120 frames, one warm-up
  • libx264identical encoder on both engines
  • The scene: a clustertwo translucent discs, an accent bar, a title and a subtitle. repeats scatters N identical clusters — from 1 (6 nodes) to 40 (201 nodes, heavy overdraw + 80 text runs).
  • Steady-statemeasured after warm-up; small run-to-run variance

Raster throughput · draw only

Remotion's cost is flat. ONDA's tracks the scene.

Pure drawing throughput, before any encode. On a trivial scene ONDA already pulls ahead; on a complex one the gap widens — because Remotion pays a fixed browser tax per frame while ONDA only pays for what it actually draws.

Trivial scene 1 cluster · 6 nodes · Remotion's best case

ONDARemotion
ONDA · CPU (all cores)
865.6 fps
ONDA · GPU (Vello)
298.0 fps
ONDA · CPU (1 thread)
101.8 fps
Remotion · default pool
85.5 fps
Remotion · 1 worker
26.8 fps

Complex scene 40 clusters · 201 nodes · heavy overdraw

ONDARemotion
ONDA · GPU (Vello)
217.4 fps
ONDA · CPU (all cores)
116.3 fps
Remotion · default pool
56.7 fps
Remotion · 1 worker
25.7 fps
ONDA · CPU (1 thread)
11.7 fps

Honest caveat: ONDA's CPU reference rasterizer is software and overdraw-bound, so it falls behind on heavy scenes — use the GPU path for those. The GPU renders the 33×-heavier scene only 1.4× slower than trivial.

Full pipeline · render → MP4

What an export actually costs

End-to-end: GPU render, readback, and the same libx264 encode both engines use. One single-threaded ONDA process still beats Remotion's whole multi-worker pool.

Trivial scene 1 cluster · full export → mp4

ONDARemotion
ONDA · Vello + libx264
145.8 fps
ONDA · Vello + HW encode
98.7 fps
Remotion · default pool
83.9 fps
Remotion · 1 worker
26.9 fps

Complex scene 40 clusters · full export → mp4

ONDARemotion
ONDA · Vello + libx264
107.6 fps
ONDA · Vello + HW encode
80.5 fps
Remotion · default pool
58.9 fps
Remotion · 1 worker
26.1 fps

With libx264 on both, one ONDA process exports ~5.4× faster than a Remotion worker on the trivial scene and ~4.1× on the complex one — and ~1.7–1.8× faster than Remotion's whole pool, single-threaded. Hardware encode is slower here: VideoToolbox's per-call overhead loses to libx264 on short clips (it pays off at 4K / long renders), so libx264 stays the portable default.

The trajectory

Measured multiples today. A 100× architectural ceiling.

The per-thread gap already grows with scene complexity. The 100× figure is the realized goal on real workloads — it comes from what this microbenchmark doesn't capture: cold-start (ONDA ~ms vs a Chromium launch + bundle + warmup), a real-time GPU present, and offloaded codec work. It's a target, not a single-scene result.

  1. 3.8× trivial scene per thread · ONDA CPU vs a Remotion worker
  2. 8.5× complex scene per thread · ONDA GPU vs a Remotion worker
  3. 100× target architectural ceiling complex × GPU present × cold-start × concurrency — not a single benchmark

Reproduce

Run it yourself

No performance claim without a benchmark. The full harness lives in the repo — clone it and run both engines on your own hardware.

benchmark
# ONDA (Rust, CPU + GPU backends) — args: <frames> <clusters>
cargo run --release -p onda-bench -- 120 1      # trivial
cargo run --release -p onda-bench -- 120 40     # complex

# Remotion (React → headless Chromium → screenshot → encode)
pnpm --filter benchmark bench 1
pnpm --filter benchmark bench 40

# ONDA full export (Vello raster + readback + encode → mp4)
pnpm --filter benchmark bench:onda 120 1
pnpm --filter benchmark bench:onda 120 40

Numbers on this page are steady-state on an Apple M4 Pro and vary a little run-to-run and by hardware, scene and configuration. Full method, tables & source →

Render your first frame without a browser

Clone the repo, write a composition, ship a video. The source is all public.

Get started