Skip to content
Sheetwrite

Sheetwrite / Documentation

Performance and delivery evidence

Freshness-gated benchmark and package-size evidence for Sheetwrite.

Every number on this page comes from a validated local protocol artifact captured on a clean tree; nothing is published from an unvalidated or protocol-mismatched artifact. Every expected cell carries either a validated timing or its recorded failure - a run that did not complete is shown as a failure, never converted into a timing.

Render benchmark: Sheetwrite vs Handsontable

Validated evidence. 1100/1120 engine/scenario/round runs completed across 4 workbook sizes; every completed run passed its correctness checkpoints; 20 runs did not finish and are shown as such.

Both engines drive identical scripted interactions in a controlled browser. Pick a workbook size and a metric:

Captured
2026-07-16 21:59 UTC
Commit
47f164385fd9 clean worktree
Environment
Chromium 149.0.7827.55 · 12th Gen Intel(R) Core(TM) i9-12900H
Protocol
10 rounds · raw artifact bench/results/render-scale.json
interactionlog scale — every tick is 10× — shorter is fastermedianp95
scroll-down.top-left22.8× faster
Sheetwrite1.31 ms1.34 ms
Handsontable29.9 ms30.9 ms
scroll-down.middle3.9× faster
Sheetwrite1.13 ms1.16 ms
Handsontable4.39 ms4.75 ms
scroll-smooth.same-window51.6× faster
Sheetwrite0.44 ms0.46 ms
Handsontable22.9 ms25.1 ms
scroll-right.top-left96.7× faster
Sheetwrite0.26 ms0.31 ms
Handsontable25.4 ms26.6 ms
edit-open.top-left2.3× faster
Sheetwrite0.50 ms0.52 ms
Handsontable1.14 ms1.17 ms
edit-open.middle1.9× faster
Sheetwrite0.58 ms0.60 ms
Handsontable1.11 ms1.14 ms
edit-open.bottom-right3.5× faster
Sheetwrite0.48 ms0.49 ms
Handsontable1.66 ms1.76 ms
edit-commit.middle7.2× faster
Sheetwrite0.75 ms0.79 ms
Handsontable5.43 ms5.81 ms
altering.insert-5-rows-top21.9× faster
Sheetwrite0.96 ms1.11 ms
Handsontable21.1 ms21.4 ms
altering.remove-5-rows-top22.4× faster
Sheetwrite0.90 ms1.02 ms
Handsontable20.2 ms21.9 ms
arrow-down.top-left2.6× faster
Sheetwrite0.61 ms0.62 ms
Handsontable1.55 ms1.63 ms
arrow-right.middle2.5× faster
Sheetwrite0.61 ms0.63 ms
Handsontable1.50 ms1.57 ms
formatted-paint.top-left4.7× faster
Sheetwrite0.73 ms0.84 ms
Handsontable3.47 ms3.66 ms
merge-heavy.paint15.1× faster
Sheetwrite0.26 ms0.29 ms
Handsontable3.87 ms3.92 ms
interactionrenderer heap after interaction — linear — shorter is leanerfootprintfaded = change
scroll-down.top-left1.5× leaner
Sheetwrite6.7 MB0.0 MB
Handsontable10.4 MB2.5 MB
scroll-down.middle1.6× leaner
Sheetwrite6.6 MB0.3 MB
Handsontable10.7 MB0.8 MB
scroll-smooth.same-window1.5× leaner
Sheetwrite6.8 MB0.5 MB
Handsontable10.0 MB0.6 MB
scroll-right.top-left1.3× leaner
Sheetwrite8.3 MB1.9 MB
Handsontable11.0 MB1.1 MB
edit-open.top-left1.7× leaner
Sheetwrite6.8 MB0.0 MB
Handsontable11.8 MB3.5 MB
edit-open.middle2.5× leaner
Sheetwrite6.7 MB0.1 MB
Handsontable17.1 MB5.5 MB
edit-open.bottom-right2.2× leaner
Sheetwrite6.5 MB0.1 MB
Handsontable14.1 MB0.0 MB
edit-commit.middle1.9× leaner
Sheetwrite7.6 MB1.1 MB
Handsontable14.3 MB0.8 MB
altering.insert-5-rows-top2.3× leaner
Sheetwrite7.8 MB0.5 MB
Handsontable18.1 MB5.0 MB
altering.remove-5-rows-top2.0× leaner
Sheetwrite9.0 MB0.8 MB
Handsontable18.2 MB3.2 MB
arrow-down.top-left2.1× leaner
Sheetwrite7.4 MB0.0 MB
Handsontable15.2 MB0.9 MB
arrow-right.middle2.0× leaner
Sheetwrite7.1 MB0.2 MB
Handsontable14.1 MB0.5 MB
formatted-paint.top-left3.1× leaner
Sheetwrite7.9 MB0.8 MB
Handsontable24.8 MB10.9 MB
merge-heavy.paint2.1× leaner
Sheetwrite9.9 MB1.0 MB
Handsontable20.3 MB6.2 MB
interactionlog scale — every tick is 10× — shorter is fastermedianp95
scroll-down.top-left26.7× faster
Sheetwrite1.24 ms1.29 ms
Handsontable33.2 ms36.2 ms
scroll-down.middle6.0× faster
Sheetwrite1.13 ms1.16 ms
Handsontable6.71 ms7.14 ms
scroll-smooth.same-window60.7× faster
Sheetwrite0.44 ms0.46 ms
Handsontable26.9 ms28.6 ms
scroll-right.top-left111.3× faster
Sheetwrite0.27 ms0.33 ms
Handsontable29.8 ms31.2 ms
edit-open.top-left2.4× faster
Sheetwrite0.49 ms0.54 ms
Handsontable1.16 ms1.23 ms
edit-open.middle2.0× faster
Sheetwrite0.57 ms0.59 ms
Handsontable1.14 ms1.22 ms
edit-open.bottom-right3.8× faster
Sheetwrite0.47 ms0.49 ms
Handsontable1.79 ms1.90 ms
edit-commit.middle10.7× faster
Sheetwrite0.77 ms0.79 ms
Handsontable8.28 ms8.77 ms
altering.insert-5-rows-top23.7× faster
Sheetwrite1.13 ms1.21 ms
Handsontable26.7 ms29.4 ms
altering.remove-5-rows-top29.7× faster
Sheetwrite0.99 ms1.22 ms
Handsontable29.3 ms29.7 ms
arrow-down.top-left2.5× faster
Sheetwrite0.59 ms0.61 ms
Handsontable1.49 ms1.65 ms
arrow-right.middle2.7× faster
Sheetwrite0.58 ms0.61 ms
Handsontable1.56 ms1.63 ms
formatted-paint.top-left4.7× faster
Sheetwrite0.74 ms0.84 ms
Handsontable3.47 ms3.57 ms
merge-heavy.paint13.0× faster
Sheetwrite0.29 ms0.35 ms
Handsontable3.72 ms4.00 ms
interactionrenderer heap after interaction — linear — shorter is leanerfootprintfaded = change
scroll-down.top-left1.9× leaner
Sheetwrite6.9 MB0.0 MB
Handsontable12.9 MB2.2 MB
scroll-down.middle1.8× leaner
Sheetwrite7.3 MB0.7 MB
Handsontable13.0 MB0.0 MB
scroll-smooth.same-window1.7× leaner
Sheetwrite7.4 MB0.4 MB
Handsontable12.6 MB0.0 MB
scroll-right.top-left1.1× leaner
Sheetwrite10.1 MB2.4 MB
Handsontable11.3 MB0.0 MB
edit-open.top-left2.1× leaner
Sheetwrite7.4 MB0.0 MB
Handsontable15.4 MB4.1 MB
edit-open.middle2.0× leaner
Sheetwrite7.3 MB0.3 MB
Handsontable14.4 MB1.3 MB
edit-open.bottom-right2.2× leaner
Sheetwrite7.7 MB0.4 MB
Handsontable16.6 MB2.1 MB
edit-commit.middle2.0× leaner
Sheetwrite7.8 MB0.1 MB
Handsontable15.3 MB0.0 MB
altering.insert-5-rows-top2.6× leaner
Sheetwrite14.6 MB7.0 MB
Handsontable38.1 MB26.9 MB
altering.remove-5-rows-top3.3× leaner
Sheetwrite12.2 MB0.0 MB
Handsontable40.0 MB2.6 MB
arrow-down.top-left3.0× leaner
Sheetwrite8.3 MB0.0 MB
Handsontable24.5 MB0.0 MB
arrow-right.middle2.6× leaner
Sheetwrite8.4 MB0.4 MB
Handsontable21.8 MB0.0 MB
formatted-paint.top-left3.4× leaner
Sheetwrite8.7 MB0.6 MB
Handsontable29.7 MB10.4 MB
merge-heavy.paint3.4× leaner
Sheetwrite9.9 MB0.0 MB
Handsontable33.8 MB6.5 MB
interactionlog scale — every tick is 10× — shorter is fastermedianp95
scroll-down.top-left67.4× faster
Sheetwrite1.26 ms1.37 ms
Handsontable84.9 ms88.2 ms
scroll-down.middle26.3× faster
Sheetwrite1.15 ms1.19 ms
Handsontable30.4 ms32.1 ms
scroll-smooth.same-window173.2× faster
Sheetwrite0.44 ms0.46 ms
Handsontable75.9 ms80.7 ms
scroll-right.top-left201.2× faster
Sheetwrite0.26 ms0.30 ms
Handsontable52.3 ms55.7 ms
edit-open.top-left2.3× faster
Sheetwrite0.51 ms0.69 ms
Handsontable1.17 ms1.24 ms
edit-open.middle2.7× faster
Sheetwrite0.60 ms0.63 ms
Handsontable1.59 ms1.65 ms
edit-open.bottom-right4.8× faster
Sheetwrite0.48 ms0.51 ms
Handsontable2.29 ms2.32 ms
edit-commit.middle45.4× faster
Sheetwrite0.76 ms0.80 ms
Handsontable34.5 ms38.1 ms
altering.insert-5-rows-top44.8× faster
Sheetwrite2.46 ms2.86 ms
Handsontable110.4 ms111.3 ms
altering.remove-5-rows-top42.0× faster
Sheetwrite2.58 ms2.95 ms
Handsontable108.4 ms112.7 ms
arrow-down.top-left2.5× faster
Sheetwrite0.64 ms0.65 ms
Handsontable1.61 ms1.75 ms
arrow-right.middle3.2× faster
Sheetwrite0.62 ms0.67 ms
Handsontable2.02 ms2.03 ms
formatted-paint.top-left4.3× faster
Sheetwrite0.78 ms0.89 ms
Handsontable3.36 ms3.55 ms
merge-heavy.paint22.6× faster
Sheetwrite0.29 ms0.31 ms
Handsontable6.53 ms6.81 ms
interactionrenderer heap after interaction — linear — shorter is leanerfootprintfaded = change
scroll-down.top-left2.2× leaner
Sheetwrite17.4 MB0.0 MB
Handsontable38.8 MB0.0 MB
scroll-down.middle2.5× leaner
Sheetwrite16.5 MB0.0 MB
Handsontable40.5 MB2.0 MB
scroll-smooth.same-window2.1× leaner
Sheetwrite22.2 MB6.6 MB
Handsontable47.4 MB6.9 MB
scroll-right.top-left1.7× leaner
Sheetwrite20.1 MB3.8 MB
Handsontable35.1 MB0.0 MB
edit-open.top-left2.8× leaner
Sheetwrite16.1 MB0.0 MB
Handsontable44.9 MB8.6 MB
edit-open.middle2.9× leaner
Sheetwrite16.0 MB0.5 MB
Handsontable45.9 MB13.2 MB
edit-open.bottom-right2.6× leaner
Sheetwrite16.1 MB0.7 MB
Handsontable41.9 MB10.1 MB
edit-commit.middle2.8× leaner
Sheetwrite16.7 MB1.2 MB
Handsontable46.5 MB4.3 MB
altering.insert-5-rows-top3.0× leaner
Sheetwrite57.7 MB41.6 MB
Handsontable171.4 MB141.0 MB
altering.remove-5-rows-top3.4× leaner
Sheetwrite55.9 MB0.0 MB
Handsontable192.5 MB45.3 MB
arrow-down.top-left4.4× leaner
Sheetwrite16.8 MB0.0 MB
Handsontable73.2 MB0.0 MB
arrow-right.middle3.7× leaner
Sheetwrite17.3 MB0.3 MB
Handsontable64.0 MB20.1 MB
formatted-paint.top-left3.5× leaner
Sheetwrite19.0 MB1.7 MB
Handsontable66.3 MB0.0 MB
merge-heavy.paint3.4× leaner
Sheetwrite20.3 MB0.0 MB
Handsontable68.0 MB0.0 MB
interactionlog scale — every tick is 10× — shorter is fastermedianp95
scroll-down.top-left538.0× faster
Sheetwrite1.29 ms1.34 ms
Handsontable696.0 ms728.2 ms
scroll-down.middle296.6× faster
Sheetwrite1.10 ms1.54 ms
Handsontable326.6 ms343.5 ms
scroll-smooth.same-window1522.2× faster
Sheetwrite0.45 ms0.46 ms
Handsontable686.0 ms705.3 ms
scroll-right.top-left1352.1× faster
Sheetwrite0.26 ms0.31 ms
Handsontable357.7 ms367.8 ms
edit-open.top-left2.5× faster
Sheetwrite0.52 ms0.68 ms
Handsontable1.30 ms1.37 ms
edit-open.middle3.4× faster
Sheetwrite0.51 ms0.74 ms
Handsontable1.76 ms1.79 ms
edit-open.bottom-right5.3× faster
Sheetwrite0.44 ms0.69 ms
Handsontable2.33 ms2.44 ms
edit-commit.middle475.3× faster
Sheetwrite0.74 ms0.97 ms
Handsontable352.1 ms361.0 ms
altering.insert-5-rows-toponly Sheetwrite completed
Sheetwrite19.4 ms20.4 ms
Handsontabledid not complete
altering.remove-5-rows-toponly Sheetwrite completed
Sheetwrite19.6 ms20.9 ms
Handsontabledid not complete
arrow-down.top-left2.9× faster
Sheetwrite0.58 ms0.71 ms
Handsontable1.67 ms1.75 ms
arrow-right.middle4.1× faster
Sheetwrite0.58 ms0.76 ms
Handsontable2.35 ms2.38 ms
formatted-paint.top-left4.2× faster
Sheetwrite0.87 ms1.25 ms
Handsontable3.69 ms3.83 ms
merge-heavy.paint130.3× faster
Sheetwrite0.27 ms0.31 ms
Handsontable35.7 ms37.7 ms
interactionrenderer heap after interaction — linear — shorter is leanerfootprintfaded = change
scroll-down.top-left2.4× leaner
Sheetwrite155.8 MB20.1 MB
Handsontable379.6 MB6.4 MB
scroll-down.middle3.8× leaner
Sheetwrite101.7 MB0.0 MB
Handsontable385.3 MB5.7 MB
scroll-smooth.same-window3.6× leaner
Sheetwrite108.3 MB6.6 MB
Handsontable389.4 MB4.1 MB
scroll-right.top-left3.6× leaner
Sheetwrite110.8 MB3.3 MB
Handsontable395.8 MB6.4 MB
edit-open.top-left2.4× leaner
Sheetwrite102.4 MB0.0 MB
Handsontable246.1 MB0.0 MB
edit-open.middle2.3× leaner
Sheetwrite107.9 MB5.2 MB
Handsontable244.2 MB0.0 MB
edit-open.bottom-right2.2× leaner
Sheetwrite100.4 MB0.0 MB
Handsontable220.4 MB0.0 MB
edit-commit.middle2.1× leaner
Sheetwrite106.8 MB6.4 MB
Handsontable220.5 MB0.2 MB
altering.insert-5-rows-toponly Sheetwrite completed
Sheetwrite151.2 MB46.1 MB
Handsontabledid not complete
altering.remove-5-rows-toponly Sheetwrite completed
Sheetwrite151.1 MB0.0 MB
Handsontabledid not complete
arrow-down.top-left5.9× leaner
Sheetwrite107.2 MB0.0 MB
Handsontable633.8 MB0.0 MB
arrow-right.middle6.3× leaner
Sheetwrite103.1 MB0.9 MB
Handsontable647.5 MB12.3 MB
formatted-paint.top-left6.0× leaner
Sheetwrite107.8 MB6.2 MB
Handsontable644.9 MB10.2 MB
merge-heavy.paint5.2× leaner
Sheetwrite128.0 MB0.0 MB
Handsontable669.2 MB0.0 MB
Every bar in a panel shares the ruler's scale (speed is logarithmic - each tick is 10x), so lengths compare across rows as well as within them. Bright numbers are the median run; faded numbers are the p95 run (speed) or the interaction's heap delta (memory). Rows marked as not completed are runs the engine could not finish - the recorded failure (crash, timeout, or failed correctness checkpoint) lives in the raw artifact.
Methodology - what each scenario does

Live grid in controlled headless Chromium. Ten counterbalanced rounds; all fourteen scenarios run warm per mount, and the fixture is rebuilt after any failure so crashes cannot leak state. Every scenario must prove its effect (scroll really moved, editor really opened, rows really changed) or it fails.

Bright = median round, faded = p95 round. Did not complete = recorded crash, timeout, or failed checkpoint - never a timing.

scroll-down.top-left
From the origin, jump-scroll 50 px down: a fresh row band enters the viewport and must paint.
scroll-down.middle
The same 50 px jump starting from the vertical middle of the scroll range.
scroll-smooth.same-window
Scroll 1 px without changing the visible row window: pure repaint cost, zero new data.
scroll-right.top-left
Jump-scroll 50 px right: a fresh column band paints.
edit-open.top-left
Select a cell near the origin and open its editor.
edit-open.middle
Open the editor on the center cell of the workbook.
edit-open.bottom-right
Open the editor on the last row and column - the far end of every index.
edit-commit.middle
Commit a typed value into the center cell and paint the result.
altering.insert-5-rows-top
Insert five rows at the top: every following row reindexes.
altering.remove-5-rows-top
Remove those five rows again - the inverse reindex.
arrow-down.top-left
Move the selection one cell down with the arrow key, including the selection overlay repaint.
arrow-right.middle
Arrow-key selection move at the workbook center.
formatted-paint.top-left
Repaint a viewport dense with per-cell formatting.
merge-heavy.paint
Repaint a viewport dense with merged ranges; Sheetwrite additionally proves it builds exactly one merge revision index.

Reproduce and validate with:

Controlled render evidence
bun run --filter @sheetwrite/bench bench:render:prepare
bun run --filter @sheetwrite/bench bench:render:scale

Data engine benchmark

Validated evidence. Head-to-head store operations at the sizes both engines complete headlessly; Sheetwrite additionally scales to 1M rows below.
Captured
2026-07-16 22:05 UTC
Commit
6154cca220eb clean worktree
Raw artifact
bench/results/data-results.json
operationlog scale — every tick is 10× — shorter is fastermedianp95
ingest1556.9× faster
Sheetwrite0.31 ms0.41 ms
Handsontable479.7 ms546.7 ms
windowRead13.6× faster
Sheetwrite6 µs0.01 ms
Handsontable0.08 ms0.13 ms
edit105.4× faster
Sheetwrite1.65 ms2.34 ms
Handsontable173.9 ms241.6 ms
sort1762.9× faster
Sheetwrite0.11 ms0.23 ms
Handsontable192.9 ms237.5 ms
filter4708.7× faster
Sheetwrite0.02 ms0.03 ms
Handsontable98.1 ms108.0 ms
aggregate57.7× faster
Sheetwrite3 µs5 µs
Handsontable0.19 ms0.34 ms
operationlog scale — every tick is 10× — shorter is fastermedianp95
ingest1709.6× faster
Sheetwrite2.37 ms2.61 ms
Handsontable4055.9 ms4552.8 ms
windowRead20.2× faster
Sheetwrite6 µs7 µs
Handsontable0.12 ms0.15 ms
edit662.0× faster
Sheetwrite0.70 ms1.47 ms
Handsontable466.4 ms548.1 ms
sort9977.5× faster
Sheetwrite0.18 ms0.20 ms
Handsontable1815.0 ms2713.7 ms
filter20304.6× faster
Sheetwrite0.04 ms0.05 ms
Handsontable913.4 ms2026.5 ms
aggregate72.0× faster
Sheetwrite0.02 ms0.02 ms
Handsontable1.38 ms2.01 ms

Sheetwrite alone at scale — Handsontable cannot complete these sizes headlessly:

operationlog scale — every tick is 10× — shorter is fastermedianp95
ingest
100k rows25.6 ms27.6 ms
500k rows143.1 ms143.9 ms
1M rows313.7 ms319.9 ms
windowRead
100k rows8 µs0.01 ms
500k rows9 µs0.01 ms
1M rows0.01 ms0.01 ms
edit
100k rows1.25 ms2.36 ms
500k rows0.67 ms0.85 ms
1M rows0.74 ms0.80 ms
sort
100k rows1.82 ms1.92 ms
500k rows9.97 ms10.5 ms
1M rows24.6 ms27.4 ms
filter
100k rows0.32 ms0.36 ms
500k rows1.61 ms1.75 ms
1M rows3.65 ms4.27 ms
aggregate
100k rows0.19 ms0.26 ms
500k rows1.06 ms1.48 ms
1M rows2.08 ms2.31 ms
Methodology - what each operation does

Identical columnar datasets, per-operation warmup and iteration plans. Fresh instance per ingest; window reads rotate offsets to defeat caches; sort and filter reset between runs; Handsontable edits run with rendering suspended so only its data path is timed.

Memory = JS-heap delta around one ingest in an isolated subprocess, plus Sheetwrite's WASM linear-memory delta.

ingest
Load the full dataset into a fresh engine instance.
windowRead
Read a 50x5 cell window at a rotating offset that sweeps the whole sheet.
edit
1,000 single-cell edits.
sort
Sort by the numeric amount column.
filter
Substring filter over the city column.
aggregate
Numeric aggregation over the amount column.

Reproduce with:

Data engine evidence
bun run --filter @sheetwrite/bench bench:data

Formula engine benchmark

Validated evidence. 26 recalculation workloads across dependency shapes; every workload passed the protocol's safety ceilings.
Captured
2026-07-16 22:06 UTC
Commit
c85226578c40 clean worktree
Raw artifact
bench/results/formula-results.json
workloadlog scale — every tick is 10× — shorter is fastermedianp95
criteria-range-edit
100,000 cells4.76 ms4.91 ms
cross-sheet-range-edit
1,000 cells1.97 ms2.11 ms
cycles
1,000 cells1.95 ms3.42 ms
diamond-edit
32 cells0.12 ms0.13 ms
distinct-range-edit
1,000 cells0.02 ms0.02 ms
error-propagation
1,000 cells0.80 ms0.86 ms
independent-first-recompute
1,000 cells2.21 ms3.01 ms
10,000 cells10.6 ms11.4 ms
100,000 cells160.7 ms165.0 ms
independent-parse-load
1,000 cells2.89 ms3.23 ms
10,000 cells10.1 ms12.9 ms
100,000 cells91.9 ms105.0 ms
linear-chain
8 cells0.02 ms0.03 ms
16 cells0.04 ms0.04 ms
32 cells0.06 ms0.07 ms
64 cells0.11 ms0.11 ms
lookup-range-edit
100,000 cells5.18 ms6.30 ms
removed-sheet-ref
1,000 cells0.65 ms0.95 ms
shared-range-edit
1,000 cells3.10 ms3.58 ms
topology-remove-add
10,000 cells11.4 ms11.7 ms
wide-fan-out-edit
1,000 cells0.68 ms0.95 ms
100,000 cells114.5 ms116.4 ms
scalar-edit-affects
0 affected3 µs3 µs
1 affected4 µs4 µs
1,000 affected0.57 ms0.59 ms
100,000 affected109.8 ms117.1 ms
Methodology - what each workload does

Each workload builds a fresh WASM cell-store of the named dependency shape and times the recalculation from one action - usually a single edit. Sizes are formula-cell counts; bright = median, faded = p95.

linear-chain
A chain A1 -> A2 -> ... -> AN; editing the head recomputes the full depth.
wide-fan-out-edit
One scalar feeds N dependent formulas; edit the scalar.
diamond-edit
Fan-out that reconverges (diamond graph); edit the apex.
shared-range-edit
N formulas aggregate one shared range; edit one cell inside it.
distinct-range-edit
Each formula owns its own range; one edit recomputes only its owner.
cross-sheet-range-edit
Summary-sheet formulas range over another sheet; edit the source.
scalar-edit-affects-N
One scalar edit invalidating exactly N dependents; N=0 touches an unrelated cell, so it prices pure dependency lookup.
topology-remove-add
Remove and re-add rows so the dependency graph itself changes shape.
cycles
Introduce a reference cycle; detection and cycle-error propagation.
removed-sheet-ref
Formulas referencing a deleted sheet must all degrade to reference errors.
error-propagation
An error value (=1/0) flows through every dependent.
criteria-range-edit
Criteria-style aggregation (SUMIF shape) over 100k cells; edit inside the criteria range.
lookup-range-edit
Lookup-shape formulas over 100k cells; edit inside the looked-up range.

Reproduce with:

Formula engine evidence
bun run --filter @sheetwrite/bench bench:formula

Delivery size

Validated evidence. Package tarball and bundler-output sizes, gated by absolute budgets in CI.
Captured
2026-07-19 10:35 UTC
Commit
848e46a0f350 clean worktree
Raw artifact
test-results/delivery-size/size-report.json
PackageTarballUnpacked
@sheetwrite/core372.4 KiB1958.3 KiB
@sheetwrite/react7.0 KiB22.0 KiB
@sheetwrite/svelte5.2 KiB14.6 KiB
@sheetwrite/vue8.6 KiB28.5 KiB
@sheetwrite/wasm180.5 KiB490.4 KiB
@sheetwrite/xlsx75.0 KiB366.1 KiB

A minimal Vite app that renders a grid ships 85.6 KiB of gzipped JavaScript.

Reproduce with:

Delivery size evidence
bun run size:report