willWilliam Victor/AI engineer/Madison, WI
15 projects

I build thingsthat

Riftbound Self-Play

I trained a model that plays Riftbound.

My first version spent most of its time running games, so I rebuilt the game loop in Rust. Now I can train and test new versions a lot faster, and I can replay any match move by move.

How I built it →
  1. I give my model the board and the moves it's allowed to make, and it picks one.

  2. It plays both seats, so every match it finishes turns into more training data.

  3. Running games was the slow part, so I rewrote that loop in Rust, and training got a lot faster.

  4. I train on the finished matches, and then the new version goes and plays again.

Riftbound card art © Riot Games.

A year of on GitHub

Each square is one day. Darker squares mean more contributions. My longest streak was 55 days in a row.

Open GitHub →
5,037contributions in the last year
639in the last 30 days
216active days
to to Full yearLatest 26 weeks

Jul 14 was my biggest day: 113 contributions.See it on GitHub →

Where I work now

  1. Handshake AII started at Handshake in January making tasks for AI training data, which is mostly writing prompts and rubrics, building tasks that test how well models handle everyday computer stuff and web research, and comparing model answers to see which one's better. After a while I got moved up to reviewing other people's tasks. Then on one of the bigger projects they needed really high quality work, so they picked a small group of people to be golden taskers, and I was proud to be one of them. A lot of the details are under NDA.Jan 2026 – Present

The log

15 of 15 · newest first
01
Rust / PythonAug 2026

Riftbound Self-Play

It plays both sides of every match, and every game it finishes turns into training data for the next version. My first version spent most of its time just running games though, so I rebuilt the game loop in Rust. It uses the CPU way better now, and I can train and test new versions a lot faster. And when something goes wrong I can replay the match move by move and see exactly what happened.

The Bento Sprint Kanban board
Next.js11

Bento Sprint

This was my first full product, and it took a year of teaching myself to get it here. It's a task board for student clubs, with teams, Kanban boards, and announcements, and it posts updates to their Slack, Discord, or Notion so nobody has to copy stuff over. The demo is live if you want to click around.

13
RustJul 2025

LUNA

I wrote LUNA in Rust because I wanted to understand how computer-use agents actually work under the hood, and I wanted to see how far I could get with computer vision I wrote by hand instead of ML models. It finds buttons, text fields, and icons with edge and rectangle detection, figures out what to do from a plain English command, and runs every action through a safety layer that blocks destructive commands and rate limits everything. The vision and safety parts are real and tested. Screen capture and actually moving the mouse are still stubbed out, so that's the next thing to build.