← All case studies
DesktopOfflinePerformance

Cross-platform spreadsheet

A spreadsheet that runs as a desktop application on Windows, Linux, and macOS. Functions the built-ins do not cover are written in JavaScript and called from a cell like any other.

Started
April 2026
Development time
8 weeks
Platforms
Desktop
Industry
Data analysis and office tools
  • 57ms

    to recalculate one million formulas across all available cores

  • 3.5×

    faster recalculation once the engine moved to a work-stealing thread pool

  • 1.4GB

    of memory for a sheet of ten million formulas, on an ordinary laptop

  • 3

    platforms from one build: Windows, Linux, and macOS

The challenge

The application has to run on three platforms, stay within a laptop's memory, and let people add formulas of their own.

The solution

A sheet with millions of formulas opens on an ordinary laptop, an edit recalculates only what it touches, and a function the built-ins lack is written in JavaScript and used like any other.

  • Native on three platformsOne build for Windows, Linux, and macOS, in a native window.
  • Incremental recalculationAn edit recalculates only the cells that depend on it.
  • Compact dependency graphA column of repeated formulas is stored as one dependency.
  • User-defined functionsA JavaScript file adds functions that are called from a cell like a built-in.

Engineering decisions

  • Rust
  • Tauri
  • Svelte
  • TypeScript
  • The dependency graph implements TACO (Efficient and Compact Spreadsheet Formula Graphs, 2023): a column of shifted formulas is one edge with an offset, which is what keeps a large sheet in memory.
  • A topological evaluator runs independent cells on a work-stealing thread pool. A cell only writes itself, and nothing reads it until its counter reaches zero, so one atomic per cell is enough.
  • Moving from Tokio to the Forte thread pool cut a ten-million-cell recalculation from 3.8 s to 1.1 s in debug builds.
  • Extensions register functions by name with typed arguments and a return type. A range arrives as a two-dimensional array, and a returned error becomes a cell error.
  • Tauri puts a Svelte interface in a native window, so one codebase covers the three platforms.

Let's talk about your project.

Schedule an online call (optional)

We use what you write here only to reply to you.