← All work

aCoach

An AI coach that reviews a ranked League of Legends game for about ten cents, and every sentence it writes points at a timestamp it can prove.

Paste a Riot ID, pick a game, and aCoach writes a review of it: the three things to fix, then one section per moment that mattered, each with what happened, why it cost you, and what to do instead. It reads Riot's match and timeline data, not video. The whole pipeline costs about ten cents a game, and the cost is printed at the bottom of every review.

aCoach match page: a Defeat header for Ahri mid versus Syndra, a 6.0 performance score, a gold-difference bar, and a scoreboard for all ten players with KDA, damage, gold, CS, vision and items
The match page, built from Riot data only. Scores are lobby-relative and role-aware. This is the seeded demo game.

Deterministic below, probabilistic above

The design rule is that the model never decides what happened. Pure functions do.

The top row is pure functions over a normalised game, tested on synthetic timelines. The model only answers questions and writes.
  • Detectors for deaths, backs, lane swings, objectives, roams, vision, fights and builds turn the timeline into moments. Each has synthetic-timeline tests, plus two real games checked in as fixtures with assertions.
  • A question bank (YAML, versioned by hash) asks typed questions about each moment. Most are answered straight from the data. A few go to a model.
  • The writer gets evidence rows, not the game, and the validator rejects any sentence that doesn't trace back to one.
  • An eval harness scores reviews against golden games, and a cost ledger records every model call.
aCoach timeline tab: a scrubber at 25:10, a minimap with all ten champions, a team gold difference chart with event markers, and a filtered event feed
The timeline tab plays the game back. Champions move on the minimap, the gold chart marks events, and clicking a moment opens its evidence.

What else is in there

A match page with five tabs (overview, timeline, builds, runes, stats), a profile page with rank history that grows each time you visit, a job queue in Postgres using SKIP LOCKED with backoff and a reaper, a daily cap per Riot ID, PostHog events, and a demo command that builds a whole review from a synthetic game with no API keys, which is how the screenshots here were made. Mid lane only for now, NA only, ranked solo only. Those are deliberate.