Native desktop app·2026
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·The 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
- 01Opens files in place, with no import step
- 02Sorts, filters and edits compile to SQL; sources untouched
- 03One .dat0 file: data, recipe, queries, lineage
- 04Replay, diff and export from a headless CLI
dat0·Hard 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.
dat0·Hard 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.
dat0·Hard 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.
dat0·Hard 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.
dat0·Blueprint
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
- Process
- dat0 binaryone Rust process
- Windows ×NDioxus · WebView
- dat0-coresessions · grid
- Engine
- DuckDB engine1 GiB per window
- dat0-formatParquet + SHA-256
- Headless CLIreplay · diff
- Data
- Files in placeCSV · Parquet · JSON
- MotherDuckoptional
- OS
- OS keychainAPI keys
dat0·Receipts
Every budget, on the record.
- 01 2,002 tests passing, 0 failing
- 02 84.7% line coverage
- 03 9 ms p95 scroll at 10 M rows
- 04 750 ms cold launch · budget 1,000
- 05 107 MB idle memory · budget 200
- 06 ~107k lines of Rust
- 07 20 CI jobs
- 08 158 keyboard-access tests
dat0·Method
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
- 01spec
- 02plan
- 03build
- 04verify
- 05ship
Every change clears
- 20 CI jobs
- Perf budgets
- 60 scenes × 3 themes
- Keyboard reach
- Signed releases
dat0·End 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