2024–2026

Things I built and what they had to survive.

Four projects, in reverse order. Each one includes the constraint that shaped it — usually a device, a deadline, or a dataset that refused to behave.

All projects

4 projects
2026

Ledgerline

Reconciliation dashboard for a payments team drowning in spreadsheets.

Replaced a 40-tab spreadsheet workflow with a virtualised table that holds 200k rows at 60fps. The hard part was not the rendering — it was designing a diff view that a finance lead could read without training.

Next.jsTanStack VirtualPostgrestRPC
2025

Halftone

A print-inspired CMS for independent magazines.

Editors compose in a canvas that mirrors the printed grid, so nothing shifts between proof and press. Ships a colour-managed export pipeline and an offline-first editor.

ReactGSAPCRDTsCloudflare Workers
2025

Quiet Hours

A focus timer that refuses to gamify anything.

No streaks, no badges, no confetti. Just a session log and a weekly read-out. Built to see how far an interface can get on typography and restraint alone.

SvelteKitSQLiteWeb Audio
2024

Transit Atlas

Live map of a city bus network, built from a messy open feed.

Cleaned an unreliable GTFS feed into something a commuter could trust, then rendered 3,000 moving vehicles on canvas without dropping frames on low-end Android.

MapLibreCanvasPythonDuckDB