the binder
Field Notes
Essays and project write-ups on software architecture, AI-assisted development, local-first apps, homelab, and the occasional terrible hackathon. Flip a tab, or turn the pages.
Gratin: A Recipe App That Never Phones Home
How I built Gratin, a cross-platform recipe app with no server that can read your data: one React core, Tauri and Capacitor shells, and CRDT sync.
Migrating Off Firestore
A year migrating a frontend off Firestore with dual writes, feature-flagged reads, and SSE for real-time, plus where the abstraction boundary should live.
Fixing a Slow React App
Fixing a slow React app: why memoization is a bandaid, how Redux selectors and a whole workspace in memory caused it, and what actually worked.
Clipboard Inspector
A web tool that reveals every MIME type on your clipboard, edits each in Monaco, and copies a faithful ClipboardItem back, with rich previews.
The Registry Pattern
The registry pattern: a typed lookup table of handlers behind one interface for notifications and AI tool calls, and why it isn't the service locator.
Frontend Three-Layer Architecture
Applying controller-service-repository thinking to React: view models, state management as a data-access layer, and why feature isolation is a lie.
Interface Driven Development in the Age of AI
Ship AI-generated code without regret by hiding it behind interfaces: contracts, dependency injection, and why the old Java patterns were right all along.
Local First, Offline First, and Cloud
Local-first vs offline-first vs cloud: who owns your data, why Evolu and CRDTs make local-first practical, and the Paprika problem waiting to strand you.
Error Handling with Neverthrow
Typed error handling in TypeScript with neverthrow: three ways to structure errors across layers, a namespace pattern, and exhaustive switch safety.
Controllers, Services, and Repositories
Controllers, services, and repositories in TypeScript: hexagonal architecture, why I use classes over functions, and the late-binding trap to avoid.
Picking a Language Model Small Enough to Live on Your Phone
Benchmarking small language models to run on a phone: why accuracy plateaus at 3-4B, why RAG hurt, and how a deterministic calculator beat the LLM.
Replacing Our SQL Parser
Rewriting a slow, paid ANTLR SQL parser in two days, 3-20x faster on real customer SQL, using a Ralph Wiggum loop and a corpus of production queries.
Greenkeeper: A Local Daemon That Babysits Your PRs
Greenkeeper is a local Go daemon that watches your GitHub PRs and runs your AI CLI in a git worktree when CI fails, conflicts appear, or reviews stall.
Cursor Model ROI
A sortable React dashboard comparing every Cursor model on price, cache economics, Arena scores, and speed, refreshed from upstream data on a schedule.
Anon: Anonymous All-Hands Q&A With No Server
Anonymous all-hands Q&A over WebRTC with no server and no logs, plus an in-browser AI that rewrites your question so your writing style can't out you.
Cursor Wrapped
A Spotify Wrapped-style dashboard for your Cursor usage: tokens, costs, favourite models, streaks, and shareable cards, built in a weekend with AI.
Secret Santa
Building a Secret Santa organiser with exclusion constraints and shareable links: from JWT-in-URL assignments to a Lambda and DynamoDB backend.
Spoticover: Generative Spotify Playlist Covers
Generating Spotify playlist covers with constrained randomness: colour-harmony rules, seeded generation, and one-try Spotify OAuth built mostly with AI.
Homelab 2025: Lessons in Redundancy
Losing 50TB to a RaidZ1 mistake, rebuilding on RaidZ2, and expanding to two nodes: hard-won homelab lessons in ZFS redundancy and failure modes.
TrueNAS Migration
Migrating a homelab from Unraid and Docker to TrueNAS Scale and Kubernetes: multiple storage classes, ZFS redundancy, GPU passthrough, and K3s in nspawn.
TerribleHack 2025
Running TerribleHack 2025 solo for the first time: print disasters, 17 gloriously terrible projects, and a denim trophy the winners tear apart.
TerribleHack 2024
Co-organising TerribleHack 2024 as Zac hands over the reins: destroy-your-project challenges, ice-cutlery dinners, and what makes a great maker event.
Rent Racket
Designing Rent Racket, a political landlord-satire card game, at Kiwijam '24: fast paper prototyping, tuning the rules, and laser-cutting the final set.
Mixer Mayhem
Building a crowd-controlled robotic bartender at TerribleHack 2023: peristaltic pumps, a WebSocket god-client deploy pattern, and a force-push disaster.
InfraNZ
Building InfraNZ at GovHack 2023: a 3D GIS map of Auckland's hidden public infrastructure with DeckGL, council open data, and a Rust outage API.
Bustle: A Rewards Program for Public Transport
Bustle, a GovHack 2022 concept: a loyalty and gamification layer for Auckland public transport, mapping congestion and carbon with open transit data.
ETHGlobal NYC: HouseHodl
Flying to ETHGlobal NYC after winning Web3NZ: building HouseHodl, a trustless shared-expenses app, why cross-chain broke, and napping on the venue floor.
LoanMarket - Web3 Hackathon 2025
How a team of Web3 first-timers built LoanMarket in 18 hours, sharing one KYC verification across lenders with verifiable credentials, and won best overall.