Case study
A trainer for defensive positioning in Lethal League Blaze. It runs on a 2D physics engine I wrote from scratch, and its daily puzzle was scored against a consensus of expert players.
A new puzzle every day for more than 90 days in a row, generated and rotated with no manual work.
The problem
Defence in Lethal League Blaze is a geometry problem that players solve by instinct. Given every angle an attacker could hit from, where do you stand to cover them all? There was no way to practise that on purpose, only the reps a match happens to give you. Dojo is a sandbox where you place characters and simulate ball trajectories. It also ran a daily puzzle where the whole community attempted the same scenario.
My role
Just me, on concept, design, engineering and operations. Puzzles were generated automatically, and I worked with community experts to source the answers that decided what was correct.
What's technically interesting
The ball reflects off stage boundaries and character hitboxes. The bounce triggers on the ball's leading edge instead of its centre, which is what makes the simulated paths match what players see in the game. Paths render as SVG, with arrow markers set back from each bounce point. On top of that, each character has special moves that launch or curve the ball, move the character, or create hazards.

A positioning puzzle has no single correct answer you can calculate, so the scoring didn't try. Up to five hand-picked expert players submitted answers ahead of time. Outliers were dropped and the rest were averaged into the official answer. Player submissions were scored by their distance from it in pixels and grouped into tiers. The decision record for this is below.
Capture pending
Puzzles were generated automatically, with random defender start positions and parry-guard logic so every scenario was solvable without anyone checking it. Weekly Vercel cron jobs worked out the expert consensus, moved the queue along, and pinged the next week's experts through Discord webhooks, all behind a shared cron secret. That kept a new puzzle going out every day for more than 90 days without me touching it.
Capture pending
47 Vitest test files cover business logic, API routes and components, across about 40K lines of source. There's a 30KB domain model with a glossary of the game's terms, and 11 ADRs record decisions like SVG over canvas, Vercel with Neon, and expert consensus. Migrations run before every build, and Husky and lint-staged check every commit.
Stack
Proof