Performance
Benchmarks
Editor and reader measurements from the recorded August 27, 2026 run. Compare the workload and feature differences alongside the numbers.
Hard test
500 blocks on a 4× slower CPU
| System | Ready ms | Type p50 / p95 ms | Change | Long tasks ms |
|---|---|---|---|---|
| WidgetsPage builder | 172 | 77 / 79 | 2.1 KB | 59 |
| PuckPage builder | 1,159 | 785 / 787 | 98 KB | 3,211 |
| BlockNoteText blocks | 353 | 195 / 197 | 706 B | 288 |
| Craft.jsPage builder | 1,288 | 250 / 253 | 172 KB | 5,407 |
| GrapesJSPage builder | 1,181 | 37 / 39 | 214 KB | 1,743 |
| LexicalText reference | 145 | 60 / 61 | 161 KB | 59 |
| Plain ReactHand-built reference | 138 | 136 / 139 | 89 KB | 0 |
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.
Normal test
100 blocks on the native CPU
| System | Ready ms | Heap MiB | DOM | Type p50 / p95 ms | Change |
|---|---|---|---|---|---|
| Plain ReactEditor | 41 | 1.76 | 565 | 11.7 / 12.0 | 17.6 KB |
| Plain ReactViewer | 46 | 1.76 | 565 | — | — |
| LexicalEditor | 46 | 2.36 | 215 | 10.0 / 30.3 | 32.2 KB |
| WidgetsEditor | 47 | 2.23 | 665 | 8.9 / 32.0 | 2.1 KB |
| WidgetsViewer | 47 | 1.95 | 665 | — | — |
| PuckEditor | 268 | 10.90 | 907 | 69.7 / 71.4 | 19.5 KB |
| PuckViewer | 63 | 2.84 | 566 | — | — |
| BlockNoteEditor | 78 | 4.10 | 421 | 42.5 / 43.8 | 706 B |
| Craft.jsEditor | 75 | 4.54 | 565 | 37.2 / 38.1 | 34.4 KB |
| GrapesJSEditor | 125 | 13.22 | 132* | 6.6 / 6.9 | 43.0 KB |
The GrapesJS DOM count excludes its iframe canvas. The viewer rows have no input or change callback by design.
Downloads
Production payload, gzip KiB
| System | Initial | Lazy JS |
|---|---|---|
| Plain ReactEditor | 61.2 | 0 |
| Plain ReactViewer | 60.9 | 0 |
| LexicalEditor | 133.5 | 0 |
| WidgetsEditor | 68.1 | 100.9 |
| WidgetsViewer | 63.5 | 0 |
| PuckEditor | 242.4 | 119.7 |
| PuckViewer | 188.3 | 120.4 |
| BlockNoteEditor | 338.0 | 108.0 |
| Craft.jsEditor | 90.4 | 0 |
| GrapesJSEditor | 312.4 | 0 |
Published pages
Viewer-only cost
| Renderer | Initial | 100 ready | 500 at 4× | Heap |
|---|---|---|---|---|
| Plain React | 60.9 KB | 46 ms | 129 ms | 1.76 MiB |
| Widgets | 63.5 KB | 47 ms | 142 ms | 1.95 MiB |
| Puck Render | 188.3 KB | 63 ms | 189 ms | 2.84 MiB |
Heap is the 100-block native result.
Measured
What the 600 runs cover
Evidence
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.