things I've built

Apps I've built.

The projects I've sunk the most into. A couple outgrew what I first built them for. Source is linked where it's open.

01built it solo, still maintain it

Koji

2023 → now

Draw shapes on a map and it finds the shortest route through all of them. There's a full geofence manager built in too. React on top, a Rust core doing the math underneath.

The project I've put the most into, by a wide margin. The routing's a multithreaded Rust core, with C++ for the clustering. A community benchmark on a ~5,000-stop area clocked it finding a shorter route in two seconds than the previous tool managed in seventeen minutes. When the built-in solver buckled on the biggest sets, I wrote tsp-mt, a multithreaded TSP plugin to take those over. I still reopen the whole thing to tweak parts I'd called done.

coreRust · C++
speedseconds, not minutes
the hard partdisc-cover + TSP
02founder, less active now

ReactMap

2021 → now

A real-time map frontend that a lot of communities ended up self-hosting. Thousands of live markers updating at once, and keeping that smooth is most of the work.

I started it and maintained it for years, and I'm still far and away the top contributor. The next name down sits at roughly a twelfth of the commits. I'm less hands-on now, but it's still my project. The live rendering, the filter UI, and the plugin surface other maintainers build on all came out of that work.

scalethousands of live markers
rolefounder · #1 committer
adoptionforked & self-hosted
03primary author

Dragonite Admin

2022 → now

The control panel for Dragonite, a Go scanner backend. Operators run the whole thing from here: devices, jobs, and areas on a live map instead of hand-editing config.

I'm the top contributor here too; most of the panel is mine. React 19 and react-leaflet up front, wired to a Go service behind it, and a stack of merged PRs into Dragonite itself, not just the admin but the backend it drives.

role#1 contributor
frontReact 19 · Leaflet
drivesGo (Dragonite)
TypeScriptReactLeaflet
04started small, kept building

Cardstack

2026 → now

A local-first collection tracker for the Pokémon TCG, built on a fast catalog of every card. You log what you own (each copy with its grade, condition, and price), sort it into binders, and keep the whole collection in your browser, exportable to CSV or JSON whenever you want it.

It started as a fast holo-card catalog and grew into the tracker. The part I like is the rendering split: every card, set, and series is server-rendered into a real, crawlable page with its own OG tags, so the API key never reaches the browser, while the holographic cards, the virtualized search over ~20k cards, and the local vault all hydrate on top as client islands that mirror that SSR markup. It self-hosts behind nginx and Cloudflare with stale-while-revalidate caching, and a Worker hands over the whole corpus as one gzipped blob, so search is instant once the data lands.

catalog~20k cards
your datalocal-first
the hard partSSR + islands
TypeScriptReactTanstack Start
05got her hooked, then quit

Hazel's Lab

2026

A Pokémon GO field guide I keep on the side. The reference side has type charts and move lists; the active side has live raid counters with a damage calculator and a drills mode that quizzes you until the matchup math turns into reflex.

I got my mom into Pokémon GO, then quit playing myself, so I built her a guide on how to play. Reference shelves on one wall, a practice bench on the other, all in a calmer field-notebook style. The drills rehearse matchups, weather boosts, and STAB the way flashcards would, so the calls are there when the raid timer's running.

forMom
coversraids · matchups · STAB
feelfield notebook
TypeScriptReactTanstack StartPokémon GO
more I've shipped
Simpler Workclosed source

What I'm heads-down on most days at work. It's closed source and still deep in active development, so I'll keep the details light. The link's there if you want a look.

TypeScriptReactNextJSAI
NEMap & FloMapclosed source

Sister sites running one shared codebase, split only by environment config. Both are real-time maps. Note: these links go to each homepage, not the live maps.

TypeScriptReactreal-time
Racial Data Labdefunct

Built for a research lab at Boston University. The project's wound down now, though the site happens to still be up.

ReactNextJSdata viz
The Count

A small side experiment from 2024: a chunk of recreational math behind a UI I never bothered to pretty up. The trick is out of sight: web workers split the computation across threads, so the page never freezes while it churns.

TypeScriptWeb Workers
after hours, for the jams

Game dev's a hobby I get to when there's time, so these are rough jam entries: built fast, never polished. I had a good time making them, which was mostly the point.

Pumpkin PaloozaBevy Spooky Jam

A Vampire-Survivors-style horde game for the Bevy Spooky Jam. You're Pat, a pumpkin lost in a cemetery, out to outlast the swarm and grab an SSS rank. Written in Rust on the Bevy engine, so it runs right in the browser if you want a quick go.

A-Splash-KaFish Fest

A one-week speedrun toy for Fish Fest: pilot a salmon upstream through Alaska and try to make it home in about a minute. Built in Godot. The edges are rough: the water shaders only behave in the desktop download. But that's a seven-day jam for you.

GodotGDScript

Looking for the smaller stuff?

The libraries and solvers that power these live on the packages page.

GitHub