Skip to content

Package Surfaces

SurfacePackageRuntime
JavaScript / WASM@libraz/formulonBrowser, worker, Node
Native Node@libraz/formulon-nativeNode.js N-API addon
Pythonformulonpy3 wheel using wasmtime
CLIformulon-cli-<os>-<arch>Standalone binary
C ABIheaders and native libraryCustom hosts
MCP@libraz/formulon-mcpstdio MCP server for agents
UI shell@libraz/formulon-cellBrowser spreadsheet UI (beta)

All surfaces should expose the same calculation core. Differences should be packaging differences, not semantic differences.

Glossary: surface

A packaging boundary on top of the shared C++17 engine. Every surface speaks to the engine through the C ABI (directly or transitively). What changes between surfaces is host language, memory ownership, and IO style — never formula semantics.

Surface maturity

SurfaceMaturityNotes
WASMbroadest JS APIFull generated formulon.d.ts, browser and Node support
Pythonstable subsetwasmtime-backed wrapper, context-manager workbook lifecycle
CLIfocused toolseval, recalc, dump
Native NodeMVP subsetFaster native path, not yet full parity with WASM
C ABIbinding contractStable low-level contract for packaged surfaces
MCPagent-facing surfaceBuilt on top of WASM; allowlisted method dispatch
formulon-cellbeta UIDemonstration host for the WASM engine

When surfaces disagree

If two surfaces produce different values for the same workbook and the same profile, treat it as a bug or a documented compatibility gap. The parity runner under make parity-test exercises shared fixtures across available channels and reports both missing and mismatched results.