Performance

Benchmarks

Editor and reader measurements from the recorded August 27, 2026 run. Compare the workload and feature differences alongside the numbers.

500 blocks on a 4× slower CPU

Cold p50. Lower is better.
SystemReady msType p50 / p95 msChangeLong tasks ms
PuckPage builder1,159785 / 78798 KB3,211
BlockNoteText blocks353195 / 197706 B288
Craft.jsPage builder1,288250 / 253172 KB5,407
GrapesJSPage builder1,18137 / 39214 KB1,743
LexicalText reference14560 / 61161 KB59
Plain ReactHand-built reference138136 / 13989 KB0

Widgets opens 6.7× faster than Puck. GrapesJS types faster. BlockNote sends the smallest change. Lexical and plain React are narrower text references, not mixed page builders.

100 blocks on the native CPU

Cold p50, with typing p95.
SystemReady msHeap MiBDOMType p50 / p95 msChange
Plain ReactEditor411.7656511.7 / 12.017.6 KB
Plain ReactViewer461.76565——
LexicalEditor462.3621510.0 / 30.332.2 KB
WidgetsViewer471.95665——
PuckEditor26810.9090769.7 / 71.419.5 KB
PuckViewer632.84566——
BlockNoteEditor784.1042142.5 / 43.8706 B
Craft.jsEditor754.5456537.2 / 38.134.4 KB
GrapesJSEditor12513.22132*6.6 / 6.943.0 KB

The GrapesJS DOM count excludes its iframe canvas. The viewer rows have no input or change callback by design.

Production payload, gzip KiB

SystemInitialLazy JS
Plain ReactEditor61.20
Plain ReactViewer60.90
LexicalEditor133.50
WidgetsViewer63.50
PuckEditor242.4119.7
PuckViewer188.3120.4
BlockNoteEditor338.0108.0
Craft.jsEditor90.40
GrapesJSEditor312.40

Viewer-only cost

RendererInitial100 ready500 at 4×Heap
Plain React60.9 KB46 ms129 ms1.76 MiB
Puck Render188.3 KB63 ms189 ms2.84 MiB

Heap is the 100-block native result.

GrapesJS wins direct typing.37 ms versus 77 ms for Widgets in the hard test.
BlockNote sends less.706 B for its changed text block versus a 2.1 KB widget patch.
The slow tail is visible.At 100 native blocks, Widgets measured 8.9 ms p50 and 32 ms p95.
Payloads are not identical.Widgets and BlockNote send changed content. The other editors send their normal full state.

What the 600 runs cover

Initial and lazy downloadsCold and warm ready timeIdle and active heapDOM element countEditor activation20-character typing2,000-character pasteChange payload sizeJSON serializationMarkdown exportReplace and selectInsert, move, copy, deleteUndo and redoScroll framesBrowser long tasks

Read or download the run

Exact setup and comparison limits

Run 2026-08-27T17-52-52.090 used ten isolated Vite production builds on a 10-core Apple M4 with 16 GiB RAM. The matrix covers 25, 100, and 500 blocks; cold and warm loads; 1× and 4× CPU; and five repetitions. The full matrix produced 600 successful samples with no recorded benchmark errors.

Puck and GrapesJS include substantial editor UI. Craft.js and Widgets are lower-level page systems. BlockNote and Lexical are text-first. Plain React is a hand-built reference. These are product architectures, not feature-identical editor cores.