Projects
Things I've built, from AI developer tools to browser games. Each has a case study: why I built it, how it works, the tradeoffs and what was hard.
BeyondDiffA PR bot that finds the callers, docs and tests your diff forgot about.in progress
- README.mdA GitHub App that reads a pull request and tells the author what the change left unfinished outside the lines they touched, such as callers that will break, docs that are now wrong, untested code and files that usually change together. It's for teams on Python or JavaScript/TypeScript who review PRs on GitHub.
- NOTES.md
- Keeps a Neo4j graph of the repo current on every push, with calls resolved by SCIP first and tree-sitter as the fallback.
- Each PR gets one comment listing breaking callers, stale docs, companion files and tests worth running.
- Every finding must cite lines or graph paths, and a skeptic agent re-checks it before it's posted.
- stack
- Python 3.12
- Neo4j
- tree-sitter
- SCIP
- FastAPI
- LangGraph
- OpenAI-compatible chat API
- OpenTelemetry + Phoenix
- Docker Compose
- pytest
- linkscase study
repo
ModelMuxCoding CLIs behind a Chat Completions API, execution blocked.in progress
- README.mdClaude Code and Codex behind a self-hosted, OpenAI-compatible Chat Completions API, for developers who want to plug coding CLIs into apps that already use the OpenAI SDK, LangChain or LiteLLM.
- NOTES.md
- Claude Code and Codex behind one OpenAI-compatible Chat Completions API.
- Execution is switched off, and any execution event kills the process group.
- Validated tool calls and JSON Schema output, with one bounded retry.
- stack
- Python
- FastAPI
- asyncio
- Pydantic
- Docker
- Claude Code
- Codex CLI
- JSON Schema
- pytest
- GitHub Actions
- linkscase study
repo
OshiSlide the puck to the target. Fewest moves wins.shipped
- README.mdA Ricochet Robots-inspired sliding puzzle for the web. Get the puck to the target in the fewest moves, with daily puzzles, solution replays and tools for making new boards.
- NOTES.md
- Plays without JavaScript. Moves live in the URL and the server checks every solution.
- A BFS solver in a worker streams its progress to the puzzle editor over SSE.
- Daily puzzles, archives, replays and solution comparisons, stored in Deno KV.
- stack
- TypeScript
- Deno
- Fresh 2
- Preact
- Preact Signals
- Deno KV
- Tailwind CSS
- Vite
- Playwright
- linkscase study
repo
live
Doodlesy!Draw together, guess the word, and race the clock.archived
- README.mdA free multiplayer browser game for drawing and guessing words together. Players share a room, take turns drawing, and earn points for guessing fast.
- NOTES.md
- Rooms by six-digit code, with a lobby, chat and live scores in Firestore.
- Drawings travel between players over Socket.IO as canvas snapshots.
- Three timed rounds, scored by how fast you guess.
- stack
- React
- JavaScript
- Firebase Firestore
- Socket.IO
- Node.js
- Express
- HTML Canvas
- Material UI
- Framer Motion
- Howler
- linkscase study
repo
live