Cover art.
Rough tools,made to work.
15 builds in the log. Every one of them runs. Most started as something I didn’t know how to do yet. That’s why I keep the list.
Riftbound Self-Play
I trained a model that plays Riftbound.
The first version spent more time running games than learning from them, so I rebuilt the game loop in Rust. That change made far better use of the CPU and let me train and test new versions much faster.
Read the build →The model sees the board, weighs the moves it can make, and picks one.
It takes each seat in turn, so every match becomes another chance to learn.
Running games was the bottleneck. Rebuilding that loop in Rust made training much faster.
Each finished match goes back into training, then the next version plays again.
Riftbound card art © Riot Games.
GitHub, live
The last year on GitHub.
The same daily history GitHub shows on my profile. It refreshes here every day.
The log
15 of 15 · newest firstRiftbound Self-Play
I trained a model that plays Riftbound against itself. The first version spent more time running games than learning from them, so I rebuilt the game loop in Rust. That made far better use of the CPU and let me train and test new versions much faster. When something goes wrong, I can replay the match move by move and see exactly what happened.
Next.jsPrismaPostgresNextAuthBento Sprint
My first full product. I built the club setup, teams, Kanban boards, announcements, and Slack, Discord, and Notion integrations in Next.js 16. Prisma and Postgres store the data, NextAuth handles sign-in, and an outbox worker sends the integrations. It took a year of teaching myself, and the demo is live.
LUNA
I wrote LUNA in Rust because I wanted to understand how computer-use agents actually work. CLIP, SAM, Florence, and TrOCR read the screen. LUNA then moves the mouse, clicks, and types, with a safety check in front of every action.










