A billion people program logic inside spreadsheets every day. They've never had a framework. NextSheet is it: components, end-to-end types, version control in Git, deploy to any surface.
| A · region | B · units | C · price | D · revenue | E · yoy | |
|---|---|---|---|---|---|
| 1 | North America | 12,480 | $249 | $3,107,520 | +18.2% |
| 2 | Europe | 9,320 | €229 | €2,134,280 | +12.4% |
| 3 | LATAM | 4,105 | $189 | $775,845 | +34.9% |
| 4 | APAC | 6,870 | $209 | $1,435,830 | +22.1% |
| 5 | MEA | 1,244 | $199 | $247,556 | -3.1% |
| 6 | Σ total | 34,019 | — | $7,701,031 | +16.8% |
| 7 |
The spreadsheet is the most successful programming model ever shipped. It runs the world's finances, operations, science, and supply chains. It is the default interface humans reach for when data needs structure. And it scaled to a billion users without a framework, without a component model, without a type system, and without a deploy target.
Every other software discipline had its inflection point. The web got React. Backend got Rails, then Next.js, then the edge. Data got dbt. Design got Figma. The spreadsheet — the single most-used piece of structured software on Earth — still authors the same way it did in 1985.
NextSheet is the bet that this ends now. We're building the open-source framework for writing sheets like modern software: components, end-to-end types, composition from primitives, version control in Git, deploy to any backend, authored by humans and agents alike. One codebase, any surface.
A single dependency. Local-first authoring. Compiles to every surface — Google Sheets, Excel Online, .xlsx, .csv — from the same source.
# create a new project $ npx create-nextsheet-app revenue-model ✓ TypeScript ✓ ESLint configured ✓ Git repo initialized $ cd revenue-model && pnpm dev ▲ NextSheet 0.4.0 - local: http://localhost:3000 - sheet: file://./dist/forecast.xlsx - types: generating ./types/cells.d.ts ✓ compiled in 142ms
import { Sheet, Column, Row, Cell } from 'nextsheet' export default function Revenue() { const rows = [ { region: 'NA', rev: 3_107_520 }, { region: 'EMEA', rev: 2_134_280 }, { region: 'LATAM', rev: 775_845 }, ] return ( <Sheet name="Revenue"> <Column name="region" type="string" primary /> <Column name="revenue" type="currency" currency="USD" /> {rows.map(r => ( <Row key={r.region}> <Cell>{r.region}</Cell> <Cell>{r.rev}</Cell> </Row> ))} </Sheet> ) }
NextSheet doesn't replace Excel or Sheets. It treats them as compile targets, the same way Next.js treats the browser as just another one. You write components. The compiler resolves references, types the cells, and emits for whatever surface you ask.
<Sheet>, <Column>, <Row>, <Cell> — JSX with types, business rules as pure functions.amount is currency, adding it to a string is a compile error — not a #VALUE! at 3 AM.The CFO opens Excel. Marketing opens Sheets. Finance lives in audited PDFs. NextSheet compiles to every surface where your users already work — without migrating them to a new product.
A NextSheet <Chart/> emits as a native chart on the target surface: editable in Sheets, interactive in Excel, SVG in the browser. Same component, five destinations.
Every change is a PR. Every release is a tag. Every rollback is a git revert. Finally, your financial models stop living in model_FINAL_v7_JUAN_vdef.xlsx.
Cell-level diffs, not bytes. Tests over formulas. The reviewer sees which number changed and why, not a binary blob.
Every pull request generates an ephemeral .xlsx, a disposable Sheet, and a shareable URL. Your CFO reviews the model before it reaches main.
Today v0.4 is stable for Sheets, Excel, and .xlsx, with Agent API for LLMs. The next quarters build toward v1: typed formulas, collaborative runtime, and a delivery engine.
Open, versioned, written in TypeScript.
// sheets/Sales.sheet.tsx import { Sheet, Column, Row, Cell } from 'nextsheet' import { revenue, growth } from '@/data' export default function Sales() { return ( <Sheet name="Q3"> <Column name="region" type="string" primary /> <Column name="units" type="number" /> <Column name="revenue" type="currency" currency="USD" /> {revenue.byRegion.map(r => ( <Row key={r.region}> <Cell>{r.region}</Cell> <Cell>{r.units}</Cell> <Cell>{r.rev * (1 + growth)}</Cell> </Row> ))} </Sheet> ) }
| A · region | B · units | C · price | D · revenue | E · yoy | |
|---|---|---|---|---|---|
| 1 | North America | 12,480 | $249 | $3,107,520 | +18.2% |
| 2 | Europe | 9,320 | €229 | €2,134,280 | +12.4% |
| 3 | LATAM | 4,105 | $189 | $775,845 | +34.9% |
| 4 | APAC | 6,870 | $209 | $1,435,830 | +22.1% |
| 5 | MEA | 1,244 | $199 | $247,556 | -3.1% |
| 6 | Σ total | 34,019 | — | $7,701,031 | +16.8% |