Pathfinding by denoising instead of search. A U-Net trained from scratch takes a 23×23 maze and a field of noise, then walks a thousand reverse diffusion steps until the noise resolves into a path from start to goal. It runs live in the browser.
Projects
Work that got far enough to be worth looking at, most recent first. The ones with a paragraph are where I spent the most time.
A mobile workspace for working with AI. Each space pairs a conversation with a document the agent can edit directly, so the result of the work outlives the chat that produced it.
React Native · Expo · Next.js · AI SDK

A standardized harness that asks language models to write chess engines, then plays the engines against each other. Roughly three thousand games of round-robin turn a subjective question into an Elo number.
Python · C++ · Next.js · SQLite

Visual search that finds the artwork a sports photograph resembles, across 78,826 public-domain works from five museum collections. It combines structure, semantics, composition, colour, and pose rather than relying on a single embedding.
Python · PyTorch · YOLO · Next.js

A Discord app that catches you up on a channel in one command. It ran in production for three and a half years, across 675+ servers with a combined 775K+ members.
Python · PostgreSQL · OpenAI

A controlled comparison of LoRA and RLVR on mathematical reasoning, run end to end so the two can be measured against each other on the same model and the same data.
Python · PyTorch · TRL · PEFT

A neural network library written from scratch — backpropagation, Adam, RMSProp, with no autograd library underneath. Published on PyPI and written to be read as much as imported.
A UCI chess engine in C++, written with a friend over about a year. It taught me how much performance hides in details you would not think to look at.


