Totals follow every edit
An owned engine parses formulas into the shared AST. Dependents recalculate. The language is closed: no reference from text, and nothing reaches the host except the clock you pass.
- Formulas


Solution · Sheets
An owned formula engine, a keyboard grid, and CSV that will not inject formulas.
Status: in development

Try this
Use Reset to return to the starting example.
Enter or F2 edits the cell. Escape cancels. Control or Command plus Z undoes; Shift plus Z or Y redoes. Control or Command plus C copies; V pastes.
| Row | A | B | C | D |
|---|---|---|---|---|
1 | Work item | Quantity | Unit price | Total |
2 | Design workshop | 3 | 120 | 360 |
3 | Prototype materials | 8 | 24.5 | 196 |
4 | User interviews | 5 | 42 | 210 |
5 | Project total | 766 | ||
6 | ||||
7 | ||||
8 |
8 rows
Project budget loaded. Select a cell or use the controls to explore the formula engine.
Enter or F2 edits the cell. Escape cancels. Control or Command plus Z undoes; Shift plus Z or Y redoes. Control or Command plus C copies; V pastes.
| Row | A | B | C | D |
|---|---|---|---|---|
1 | Work item | Quantity | Unit price | Total |
2 | Design workshop | 3 | 120 | 360 |
3 | Prototype materials | 8 | 24.5 | 196 |
4 | User interviews | 5 | 42 | 210 |
5 | Project total | 766 | ||
6 | ||||
7 | ||||
8 |
8 rows
{
"format": "texuli-sheet",
"formatVersion": 1,
"meta": {
"title": "Project budget"
},
"sheets": [
{
"id": "budget",
"name": "Budget",
"rows": 8,
"columns": 4,
"cells": {
"A1": "Work item",
"B1": "Quantity",
"C1": "Unit price",
"D1": "Total",
"A2": "Design workshop",
"B2": 3,
"C2": 120,
"D2": "=B2*C2",
"A3": "Prototype materials",
"B3": 8,
"C3": 24.5,
"D3": "=B3*C3",
"A4": "User interviews",
"B4": 5,
"C4": 42,
"D4": "=B4*C4",
"A5": "Project total",
"D5": "=SUM(D2:D4)"
}
}
]
}If the interactive demo cannot load, use the static preview above.
Validate a workbook and keep every edit in a framework-free model.
Package: @texuli/sheets
Evaluate formulas and recalculate every dependent cell.
Package: @texuli/sheets
Work the accessible grid and formula bar from the keyboard.
Package: @texuli/sheets
Import and export CSV. Export neutralizes formula injection.
Package: @texuli/sheets
Solution
Sheets
Packages
@texuli/sheetsFormula engine, workbook model, CSV and grid viewSubpaths: ./formula · ./model · ./csv · ./viewBuilt on
@texuli/data (Data views)texuli (Styled components)@texuli/core (Texels and the URL policy)@texuli/date (Date arithmetic)
Build with Sheets
pnpm add @texuli/sheetsimport { createWorkbook, displayValue, loadUntrustedSheet } from '@texuli/sheets/model';
const loaded = loadUntrustedSheet("{\"format\":\"texuli-sheet\",\"formatVersion\":1,\"meta\":{\"title\":\"Office budget\"},\"sheets\":[{\"id\":\"costs\",\"name\":\"Costs\",\"rows\":20,\"columns\":4,\"cells\":{\"A1\":\"Desk\",\"B1\":120,\"A2\":\"Chair\",\"B2\":80,\"B3\":\"=SUM(B1:B2)\"}}]}");
if (loaded.ok) {
const workbook = createWorkbook(loaded.sheet, { now: () => Date.now() });
console.log(displayValue(workbook.value('costs', 2, 1)));
}
import { csvToSheet } from '@texuli/sheets/csv';
const imported = csvToSheet("item,amount\nDesk,120\nChair,80", { name: 'Orders' });
if (imported.ok) {
console.log(imported.sheet.sheets[0]?.name);
}
<script lang="ts">
import { loadUntrustedSheet } from '@texuli/sheets/model';
import { SheetView } from '@texuli/sheets/view';
import '@texuli/tokens/base.css';
const loaded = loadUntrustedSheet("{\"format\":\"texuli-sheet\",\"formatVersion\":1,\"meta\":{\"title\":\"Office budget\"},\"sheets\":[{\"id\":\"costs\",\"name\":\"Costs\",\"rows\":20,\"columns\":4,\"cells\":{\"A1\":\"Desk\",\"B1\":120,\"A2\":\"Chair\",\"B2\":80,\"B3\":\"=SUM(B1:B2)\"}}]}");
let sheet = $state(loaded.ok ? loaded.sheet : null);
</script>
{#if sheet}
<SheetView bind:sheet now={() => Date.now()} />
{/if}
Verified by apps/website/tests/solutions/sheets-quickstart.test.ts
Load a workbook, evaluate formulas, and show the grid, step by step in the Sheets docs.
Add @texuli/sheets from npm (pre-1.0, in development).
Agents emit a spreadsheet as data through the spreadsheet catalog id. The host app checks it with validateDraft and the sheet check before painting; the remote MCP server refuses spreadsheet nodes. The packages are in development.
spreadsheetspreadsheet: In developmentCatalog component that carries a whole sheet in its sheet prop.
validateDraftvalidateDraft: In developmentCatalog check; spreadsheet nodes pass only with the checkSheet hook from the sheets model.
skills/texuli/blueprints/SKILL.mdskills/texuli/blueprints/SKILL.md: In developmentSkill stage J: forms, canvases, sheets and data sources as agent data.
Svelte 5 packages published on npm (pre-1.0).
Kotlin Multiplatform renderer on the JVM, built in this repository.
Native renderer target.
Native renderer target.
An embeddable spreadsheet with formulas and CSV.

