Accidentally Awesome Labs Case AAL–002
Cover · 01
01 / 10

Native desktop app2026

dat0

There's life after row 1,048,576.

A native desktop workbench that opens CSV, Parquet, JSON and SQLite in place, keeps every transform as a replayable recipe, and packs the whole analysis into one .dat0 file.

Role
Design + engineering, app + site
Timeline
Apr 2026 → now
Platform
macOS · Linux · headless CLI
Status
Pre-release · dry run green
dat0.app landing page, built as the app's own workbench, showing the spreadsheet row limit Exhibit A
W 1280 × H 960 · @2× CASE NO. AAL–002
dat0.app — the landing page is built as the app itself (concept render)

dat0The brief

The problem

Spreadsheets stop at row 1,048,576. Warehouses want your data uploaded. Notebooks are hard to hand over. Analysts in regulated fields need big files, full lineage, and data that stays on the laptop.

What got built

  1. Opens files in place, with no import step
  2. Sorts, filters and edits compile to SQL; sources untouched
  3. One .dat0 file: data, recipe, queries, lineage
  4. Replay, diff and export from a headless CLI
dat0.app privacy section headed 'Not a promise. A code path.', with a table of guarantees and the source files that enforce them Exhibit B
W 1006 × H 422 · @2× CASE NO. AAL–002
dat0.app — privacy guarantees, with the source files that enforce them

dat0Hard part 1 of 4

Changing engines mid-flight.

Obstacle

Three months in, the UI toolkit still had no accessibility tree and kept forcing workarounds.

Fix

Prototypes first: the new toolkit had to repaint a 1M × 40 grid within 33 ms. Then a UI-free core was split out, test suites were ported in parallel, and the app cut over from GPUI to Dioxus.

11 silently dropped behaviours caught by the ported tests
Proof
CASE NO. AAL–002

dat0Hard part 2 of 4

The browser has a ceiling.

Obstacle

The grid renders inside a WebView, and WebKit caps page layout near 33.5 million pixels — every row past about 1.29 million was unreachable.

Fix

Cap the scroll canvas at 30 M pixels and map rows proportionally beyond it, while only ~40 row elements ever exist in the page — however big the table.

9 ms p95 scroll-to-paint at 1 M and 10 M rows
Proof
CASE NO. AAL–002

dat0Hard part 3 of 4

One file. Sealed.

Obstacle

Handing over an analysis means handing over data, steps and context — usually an email with five attachments.

Fix

A written spec for .dat0 — Parquet plus JSON with SHA-256 checksums — a replay engine sandboxed to one directory, a diff engine, and a CLI to export, inspect, unpack, replay and diff.

5 CLI verbs: export · inspect · unpack · replay · diff
Proof
CASE NO. AAL–002

dat0Hard part 4 of 4

Counting colours to ship.

Obstacle

The Linux AppImage opened a blank window on a new Ubuntu and needed a newer glibc than older distros ship.

Fix

Build on 22.04, bundle only what's needed, lean on the system WebKit — and a smoke test that counts the colours on screen.

~4,100 colours in a healthy window (~200 when blank)
Proof
CASE NO. AAL–002

dat0Blueprint

One Rust process, many windows; each window gets its own DuckDB engine and memory budget.

Stack

Core
Rust 2024 · DuckDB 1.4 · Arrow via DuckDB · tokio
UI
Dioxus 0.7 · System WebView · CodeMirror 6 · plotters
Format
ZIP · Parquet · JSON Schema · SHA-256
Ship
Universal macOS · Notarization · AppImage · Signed updates
dat0 architecture One Rust process opens many windows, each a Dioxus UI in the system WebView backed by dat0-core and its own DuckDB engine with a memory budget. Files are read in place; MotherDuck is optional. A headless CLI and the dat0-format crate seal, replay and diff analyses. API keys live in the OS keychain. dat0 binary one Rust process Windows ×N Dioxus · WebView dat0-core sessions · grid OS keychain API keys Headless CLI replay · diff dat0-format Parquet + SHA-256 DuckDB engine 1 GiB per window MotherDuck optional Files in place CSV · Parquet · JSON headlessper windowread in place
  1. Process
    • dat0 binaryone Rust process
    • Windows ×NDioxus · WebView
    • dat0-coresessions · grid
  2. Engine
    • DuckDB engine1 GiB per window
    • dat0-formatParquet + SHA-256
    • Headless CLIreplay · diff
  3. Data
    • Files in placeCSV · Parquet · JSON
    • MotherDuckoptional
  4. OS
    • OS keychainAPI keys
Not to scale DWG. AAL–002

dat0Receipts

Every budget, on the record.

  1. 2,002 tests passing, 0 failing
  2. 84.7% line coverage
  3. 9 ms p95 scroll at 10 M rows
  4. 750 ms cold launch · budget 1,000
  5. 107 MB idle memory · budget 200
  6. ~107k lines of Rust
  7. 20 CI jobs
  8. 158 keyboard-access tests

dat0Method

Spec first. Agents in parallel. Budgets on everything.

Day one was a design spec, not code. Work moved in PR-sized plans, tests first and a retro after; Claude Code agents ran in parallel — twelve of them ported test suites during the toolkit migration. Every change clears 20 CI jobs and hard performance budgets. The site shares the app's exact measurements.

Agents

  • Claude Code
  • Claude Design
  1. spec
  2. plan
  3. build
  4. verify
  5. ship

Every change clears

  • 20 CI jobs
  • Perf budgets
  • 60 scenes × 3 themes
  • Keyboard reach
  • Signed releases
Process
CASE NO. AAL–002

dat0End of file

End of file.

Capabilities on file

  • Rust desktop architecture
  • Embedded DuckDB
  • Virtualized rendering
  • File-format design
  • Release engineering
  • Accessibility
  • Performance budgeting
  • App + site design system
Next case
CASE NO. AAL–004
MOGENCase AAL–004 No stars. Just how it felt. Open case file