03Case study
Independent Engineering
Building products, tools, and infrastructure to test ideas firsthand.
- Where
- Self-directed
- When
- Ongoing
- Scope
- iOS · Web · Infrastructure
- Written
- 8 of 8 sections
Context
Products built outside the day job, end to end: design, code, infrastructure, distribution, and support. Nobody to escalate to and no one else to blame.
Problem
Leading engineers is easier when you still know what the work costs. Independent products are where that knowledge stays current, and where ideas get tested before they are recommended to anyone else.
Constraints
Evenings and weekends. One engineer. Real users who notice when something breaks, and in Stagger's case a tournament date that does not move.
Role and responsibilities
Everything: product, design, engineering, operations.
Technical approach
- collect.A personal cataloging app for iPhone and iPad. No accounts and no servers: the catalog lives on the device and syncs through the owner's iCloud.
- StaggerA private golf tournament PWA: live scoring, an append-only drinks ledger, and an offline queue for a back nine with no signal.
- zckr.devThe AI engineering playground: what is being built now, what shipped, and what died trying.
- acker.cloudThis site. Static Next.js, a validated content snapshot synced from Notion, and a contrast gate that blocks the build.
- Homegrown infrastructureProxmox, RAID arrays, Linux containers, and enterprise networking at home. The test bench behind everything else.
Key decisions and tradeoffs
- Offline is the normal caseStagger
- Every score save tries the server first and parks in IndexedDB when that fails. The queue separates transient failures from permanent ones, so a rejected write surfaces instead of retrying forever.
- The balance is never storedStagger
- Purchases and consumptions are an append-only log and a balance is a fold over it. The audit trail is free and the rule that matters is a database constraint, not application code.
- Privacy by architecturecollect.
- No account and no servers of ours. Data that never reaches a backend cannot leak from one.
- Numbers are derived, never typedacker.cloud
- Every count this site prints is computed from the published snapshot, so a figure cannot outlive the content that justified it.
- Accessibility blocks the buildacker.cloud
- Every colour pair is measured against WCAG thresholds before the build runs. A failing ramp does not ship.
Outcomes
collect. is in public beta on TestFlight. Stagger runs the tournament every year. acker.cloud ships as fully static HTML with every route prerendered.
Lessons learned
A real deadline is the best architecture review there is. The weekend happens on its date whether or not the sync works, and there is no rolling back a tournament.
Stack
- Swift
- Next.js
- TypeScript
- Supabase
- Postgres
- Proxmox