Request only the worksheet projection in view.
OPEN SOURCE SPREADSHEET INFRASTRUCTURE
Make the spreadsheet a product capability, not a black box.
A spreadsheet UI for real workflows: keep the viewport bounded, move computation to a Worker, and choose the workbook backend that fits your product.
Framework-agnostic UI core · Solid reference implementation · Rust/WASM workbook engine
Move formula calculation off the main thread.
Keep the UI distinct from the data source.
01 / PRODUCT THESIS
Built for your product workflow, not a desktop Excel remake.
01
Set a boundary before the data gets big.
Viewport projection lets the renderer work with visible cells instead of expanding a full workbook into the browser.
Explore viewport projection →02
Keep computation in the background.
A Rust/WASM workbook can run in a Web Worker while the main thread keeps scrolling, editing, and keyboard input responsive.
See the runtime boundary →03
Keep control of your data.
The framework-agnostic UI core reads and writes through a backend port that can meet your product where it is.
Read the architecture →02 / EVALUATE BY JOB
Start with the question you need to answer.
The homepage does not list every capability. Pick a real task and go straight to its running demo and explanation.
Give operations, finance, or sales an editable business surface.
See the full workbench: selection, editing, formulas, filters, comments, and worksheet structure share one UI state.
Feel the scroll first, then inspect the projection boundary.
Observe how the UI asks for a bounded window instead of expanding every workbook cell into the DOM.
Start with a formula case you can explain.
Validate lazy calculation, dynamic arrays, or custom functions against the workbook behavior you expect.
03 / INTEGRATE
Choose the starting path your stack actually has.
Solid has the formal UI binding. React and Vue are controlled-projection references, while custom systems begin at the backend port.
import { SpreadsheetGrid } from
'@einfach/solid-excel/vnext'
const backend = createStaticSpreadsheetBackend({
sheets: [{ id: 'plan', name: 'Plan' }],
matrix: revenuePlan,
})
<SpreadsheetGrid
sheetId="plan"
viewport={viewport}
backend={backend}
/>