Projects
Things I have built, studied, and contributed to.
The actively maintained side projects serve real internet traffic every day, as part of my own infrastructure.
Side projects
Things I built because I wanted them to exist.
Serval
Configuration and scripts served from a URL that never moves, filled in per caller. Every revision is kept and any of them can be restored, and unlike a Gist, an edit stops the cache from serving the stale copy.
- Rust
- ·PostgreSQL
- ·Content-addressed
Letterbox
An Android mail client that does not tell the sender you opened their email. Remote images are blocked by default; the ones you allow are fetched through a WARP tunnel the app builds itself in Rust, with no proxy operator logging the request either.
- Kotlin
- ·Rust
- ·Android
Lynx
A self-hosted short-link service whose links outlive what they point at. Destinations are edited in place, every earlier one stays restorable, and a database trigger refuses deletion outright.
- Rust
- ·OAuth
- ·Self-hosted
h4ckath0n
A hackathon starter kit that begins past the login screen: passkeys already work, the server decides roles, and a weekend team spends none of its first hours on authentication.
- Python
- ·FastAPI
- ·WebAuthn
Dockerfiles
Container images for the software I self-host, rebuilt twice a day to keep every dependency current. The build fans out over workers that steal jobs from each other once their own queue runs dry; no image waits behind the slowest shard.
- Docker
- ·GitHub Actions
- ·Self-hosted
SKILLs
Reusable procedures for coding agents, written as Markdown that names no particular project. Any repository can read them; this site is one that does.
- Agents
- ·Markdown
- ·Tooling
safeTO
A safety lookup for Toronto addresses, built for CSC207. It fits a Poisson model over Toronto Police data and reports the chance of an incident; a raw count mostly measures how many people live nearby.
- Java
- ·React
- ·CSC207
Research
Code and artifacts from work in the labs.
PromptPipe
Messaging infrastructure for behavioral studies. Participants answer on WhatsApp with nothing to install, and delivery is recorded apart from responses: a prompt that never arrived stays distinguishable from one nobody answered.
- Go
- ·Study infrastructure
ABScribeX
A Chrome extension that carries the CHI 2024 ABScribe writing interface into Gmail, LinkedIn, and Reddit. Those editors strip any markup they did not author, so each variant carries its identity inside the text itself, as zero-width characters.
- TypeScript
- ·Chrome extension
- ·Human-AI writing
Focus Flow
An Android wellbeing app that never settles on a single nudge. Thompson sampling picks each prompt by how well it has worked so far, under a cooldown that keeps an early winner from crowding out the ones not yet tried.
- Kotlin
- ·Firebase
- ·HCI
Open source
Contributions to projects maintained by other people.
ebpf-docs
A documentation fix. The reference example had tgid and pid the wrong way round, as did the uid/gid page beside it: the kernel puts tgid in the high 32 bits, and the reversed shift still compiles and prints plausible numbers.
- eBPF
- ·Linux
- ·Documentation
Tailscale
A bug report. Android probes its DNS resolver on port 853, the Tailscale netstack answered only on 53, and the rest fell through to the exit node's default route, sending queries somewhere they were never meant to go. Fixed upstream.
- Networking
- ·DNS
- ·Bug report