Sheetwrite

Open source · MIT · v0.5.1 · Rust/WASM engine

The spreadsheet engine for your web app.

A real calculation engine and a canvas Grid in your page. Edit, recalculate, and page through a billion cells. Your application keeps the data, the UI, and the server.

Illustration of how Sheetwrite works. The live examples run the real engine.
0.6 ms
median interaction at 1,000,000 rows
7.1×
median speed against Handsontable, same capture
1,000,000,000
addressable cells in the performance example
4
adapters: Vanilla, React, Vue, Svelte
How we measured →

How it works

Three layers. One clear line of ownership.

The Grid handles input and painting. The engine stores cells and recalculates. Your application decides what to save and where.

Read the runtime-ownership model →

What you can build

Real workbooks, not a table with formulas on top.

Every card opens a live example that runs the real engine in your browser. See all showcases →

  1. Performance & scaleAddress 1,000,000 rows × 1,000 columns. The Grid requests only the tiles on screen and keeps memory inside a fixed cache.Open the live example →
  2. Formula analysisGROUPBY, PIVOTBY, FILTER, LAMBDA, statistics and finance. Results spill, and other formulas read the spill with A2#.Open the live example →
  3. CollaborationClients commit in order through your server. Duplicates, gaps, and conflicts recover with explicit protocol steps.Open the live example →
  4. Database & documentsSnapshots and append-only commits in your storage. Pending edits survive a reload and drain in order.Open the live example →
  5. XLSX & CSVImport and export workbooks with formulas and styles. Every lossy case returns a named warning, not a silent change.Open the live example →
  6. Host-owned rowsYour store keeps the records. Sort, filter, and edit the Grid, and every delta names the same record ID.Open the live example →

See it happen

The hard parts of a spreadsheet, handled.

Three short stories about work that a table component leaves to you. Each one links to the live example that runs it for real.

One formula. The answer takes the space it needs.

FILTER spills its result into the cells below. When a source value changes, the spill grows, and every formula that reads E2# follows.

Try the formula showcase →

Start in minutes

Mount a Grid in the framework you already use.

One engine, four entry points. The adapters share one lifecycle: create on mount, apply live option changes, and destroy on unmount.

Build your first grid →
import { createGrid, initSheetwrite } from "@sheetwrite/core";
import "@sheetwrite/core/styles.css";
const grid = createGrid(host, {
activeSheet: "sales",
sheets: [
{
id: "sales",
name: "Sales",
{ key: "product", header: "Product", width: 180, type: "text" },
{ key: "amount", header: "Amount", width: 100, type: "number" },
],
},
],
},
data: {
product: ["Notebook", "Pen", "Folder"],
amount: new Float64Array([12, 4, 9]),
},
},
});

New in 0.5

Pick the formula engine that fits your download budget.

Default@sheetwrite/wasm

Included by the core package. The standard function set and the smaller download.

await initSheetwrite();
Full@sheetwrite/formulas

The same engine with the analysis families: grouping, pivots, LAMBDA, statistics, regression, finance, regex, and matrices.

await initSheetwrite(undefined, formulas);
  • Array arithmetic and spill references in both engines
  • Large undo through compressed restores and atomic sync batches
  • Host-owned rows with stable IDs and per-record deltas
  • Faster formula kernels, bulk loading, and streamed CSV and XLSX imports
  • Read what is new and the upgrade checklist →

Results you can check

Measured, not promised.

Median interaction ratios against Handsontable 18.1.2 in one saved browser capture. Every interaction must return the correct result; failed runs stay failed.

  • 1k rows6.5×median of 14 interactions
  • 10k rows6.4×median of 14 interactions
  • 100k rows8.2×median of 14 interactions
  • 1M rows7.1×median of 14 interactions

Bar length uses a log scale from 1× (as fast as Handsontable) to 10×.

Browser
Chromium 153.0.8010.12
Rounds
10 counterbalanced
Commit
49e05e2
Captured
2026-10-17
See the full method and every result →

Put a real spreadsheet in your product.

Start with the core package. Add the full formula engine or XLSX exchange when you need them.