Work
I build web platforms on Cloudflare, Android software down to the camera layer, and local tools that keep your data on your own machine.
Things I built
aviation.foundation
A maintained public registry of aviation funding, not for profit.
- Cloudflare Workers
- D1
- R2
Scholarships and grants across eight career tracks, gathered in one place and kept current rather than published once and abandoned. Over $3M tracked.
Serverless mail that never holds a message, and airman identity verified cryptographically instead of by trust.
For non-profits
Websites and staff tools for the organisations that run on volunteers.
- Next.js
- Payload CMS
- Cloudflare
A bilingual website and staff office for a Toronto monastery, and the audit and migration plan for a second temple’s WordPress site.
Paperweight
Small Android tools, made to feel like objects.
- Kotlin
- Jetpack Compose
- Android
A compass, a clock, mail, a wallet, an authenticator. Each is one flat colour over a quiet panel, and every control presses the same way.
dawd
Custom guitar rig.
- macOS
- Core Audio
- terminal client
The audio engine runs in the background with no interface at all. A separate terminal program connects to it to change patches, levels and routing.
Splitting them means the thing making sound never waits on the thing drawing pixels. Quit the control surface mid-song and the rig keeps playing.
Upmark
This was supposed to keep me consistent.
- Flutter
- Android beta
Most training apps make you plan. Upmark works out what you lift next from what you lifted last, so the screen between sets has one number on it.
Mobile app, progression engine, and a web side that stays out of the way.
CamHook
Replaces what the camera sees, underneath apps that never asked.
- Android 16
- C++
- camera HAL
Android hands an app its camera frames through a layer almost nobody touches. CamHook sits in that layer and swaps the frames out, both the live preview and the photo that gets saved, before the app above ever sees them.
The app is unmodified and unaware. No hooks in the app process, no patched APK, no accessibility trick.
Chronicle
Rebuilds my day from countless signals.
- Self-hosted
- private
Location history, phone events and computer activity go in; a readable account of an ordinary day comes out.
It runs on my own hardware and talks to nothing. That constraint is the point of it.
Timeline Extractor
Years of location history recovered from an undocumented database.
- Python
- protobuf
Google Maps keeps timeline data on the device in a format with no documentation and no export. I read the protobuf structure back out of the bytes and built a local tool that turns it into something openable.
Everything happens on your machine. Nothing is uploaded to check it.
ragtag
Local retrieval over your own exports, books and transcripts.
- Go
- Python
- five platform binaries
Point it at message archives, notebooks or a pile of PDFs and ask in plain language. Hybrid retrieval runs locally, so the corpus never leaves the machine it lives on.
It ships as a single binary for five platforms, because the people who need this most should not have to install a toolchain first.
Tools
- Web
- SvelteKit
- Next.js
- Payload CMS
- Cloudflare Workers
- D1
- R2
- Mobile
- Kotlin
- Jetpack Compose
- Flutter
- Systems
- C++
- Android camera HAL
- Core Audio
- Data
- Python
- Go
- protobuf