Projects
Everything I've built that's worth showing, with a link to whatever actually exists — the live thing, the write-up, or the repo. If it isn't here it's on GitHub.
In production
Real businesses depend on these ones.
ClinicPrivate repoReplaced a 26-year-old practice-management system. It's the only software the clinic uses now.
A dental hospital was running three separate systems and a lot of paper — patients in one place, billing in another, treatment plans signed on prescription sheets. Nothing had really changed in 26 years. I built the replacement from scratch and it's the only software they use now: doctors, billing, labs, reporting. The hard part was never the code. Before anything could be automated, every procedure needed a fixed price and every negotiation needed bounds, which is when I learned that software makes you define the business before it can run it.
BeanDrafts support replies only from what it can cite, and refuses instead of guessing.
One person answers every support email at a small e-commerce brand, and the tools that promise to help all share a problem: a confident wrong draft is worse than no draft, because you end up re-reading everything anyway. So Bean drafts only from facts it can point at, and when it isn't confident it refuses to draft at all and hands the email back. The refusal is the product.
Open source
Built these for myself first, then put them out because they turned out to be useful.
huntMITThe whole job hunt in one local-first app. Bring your own key; nothing leaves the machine.
Every job-hunt tool hands you an ATS score it has no way of computing, and asks for your résumé and your entire search to do it. hunt runs on your own machine instead — tailoring, checks, outreach and tracking in one place. The checks say plainly what they can't know rather than inventing a number, and you bring your own key, so none of it leaves your laptop.
sourceryMITSame question, same judges, swap only the provider. Eight search APIs, 204 questions, 22,457 rated pages.
Everyone evaluates the model. Nobody evaluates the retrieval, which is strange, because for an agent doing research the search provider decides what the model ever gets to see. So: same question, same judges, and the only thing that changes is the provider. Eight of them, 204 questions, three judges reading every page that came back. The judges never see an answer, because grading the answer mostly grades your own model — an earlier version of this told me one provider wrote better answers by 2.6 points, and run it properly and that gap vanishes. One provider came out clear of the field. Most of the rest of the ranking is noise, and I'd have published it as a ranking if I hadn't put confidence intervals on it.
delta-learningMITWhat's in this video that you don't already know — a timecoded cut list, as a graph set difference.
You sit down with an hour-long talk and forty minutes of it is things you already know, but there's no way to find the other twenty. Ranking doesn't help — the operation you actually want is subtraction. So this puts what you already know into the same graph as the video and returns a timecoded cut list of only the new parts. Built it in a day at a hackathon and won, then parked it, because I couldn't name anyone other than me who wanted it.
LibStackOffline-capable reading viewer. Write queue in the browser, syncs back to GitHub.
nanogpt-mlxIn progressA GPT built from scratch by hand in MLX, one rung at a time.
You can import a GPT in one line and learn nothing. This is the same thing written out by hand in MLX, one rung at a time, then ported to JAX. It isn't novel and isn't trying to be — the point is that afterwards I know how it works.
claude-code-kitThe skills, subagents, hooks and rules I actually use every day.
Out of the box a coding agent knows nothing about how you work, so it keeps solving the wrong problem in the wrong style. This is six months of fixing that by hand — the skills, subagents, hooks and rules I actually use every day.
Wound down
Built them, ran them, stopped them. They're here because what each one taught me is worth more than pretending it's still going.
AtlasWound downPrivate-markets agent platform. Ran end to end on real deals. The constraint turned out to be access, not analysis.
Sourcing and underwriting commercial real estate is still people reading PDFs and re-keying numbers into spreadsheets, so I built the agent platform for it — sourcing, underwriting and outreach over a DuckDB warehouse. It ran end to end on real deals. I wound it down in May 2026 because what stood in the way was never the analysis. It was getting access to the deals at all, and no amount of software fixes that.
MailMateWound downKnowledge assistant for support teams. The idea survived; it came back as Bean.
Support teams answer the same questions over and over and the answer is always in a document nobody can find. This did retrieval over a company's own docs so an answer could always point at where it came from. It didn't work as a product. The idea did — it came back as Bean, aimed at one real inbox instead of a whole category.
nothing public to link
FundLensWound downFund research tooling over public filings. An exploration rather than a company.
Comparing funds means reading public filings that were written to be hard to compare. This was the screening tooling for that. It turned out to be more useful as a way to learn the space than as a company, and when it stopped teaching me anything I stopped.
AdMuteWound downMutes the ads you can't block on streaming platforms. Still up, no longer developed.
Streaming platforms started running ads you can't block, and the ad is mostly just loud. This mutes them. I don't develop it anymore, but admute.io is still up and it still works.