Eric Wilson
← Selected work
// CASE STUDY · MATCH DIRECTOR HQ

MatchOps: one place to build and run a rifle match.

A match director's whole job — stages, inventory, registration, scoring, results — in one offline-first product I designed, and shipped through AI agents I direct:

4 mo
from concept to production
June to October 2026, as sole designer and product owner
Live
used at live matches
registration, scoring, and results, start to finish
MatchOps — the director's match page, showing match details, divisions, squads, and round count
THE DIRECTOR'S MATCH PAGE — A REAL MATCH. EVERY OTHER SCREENSHOT BELOW IS THE DEMO CLUB, WITH MADE-UP NAMES AND SCORES.
OVERVIEW

MatchOps by Match Director HQ is match software for clubs that run precision rifle matches: PRS-style centerfire and rimfire, and Long Gong. A director records the club's steel once and lays out stages at real distances. The matchbook comes out of that work, shooters register from a link, squad tablets score with no signal, and results go out the moment the match is complete.

Free for shooters. Used at live matches, from the first registration to the results email.

ROLE
Designer, builder, product owner
TEAM
Me, Claude, OpenAI Codex
TIMELINE
June 2026 → now
SCALE
1,400+ commits · 3 apps · 1 API
Offline first Built for nontechnical users Director · scoring · public site matchdirectorhq.com ↗
HOW IT STARTED

When I first started designing a PRS course at my club, I realized how manual all of it was. Knowing what was in inventory and what condition it was in. Building the stages and measuring them so you know how hard they are. Getting that information to competitors. Then everything around it: waivers signed, people registered, squads assigned, and something to score the match, track it, and share it with everyone afterward. Watching how other directors did it, I thought there had to be a better, more automated way. So I built MatchOps.

THE PROBLEM

A match lives in six tools and a clipboard.

Every match starts weeks before the first shot, with a director at a kitchen table working out what plate goes where and whether it's fair at that distance. The rest gets assembled from spreadsheets, documents, a stage-building tool, a scoring product, and whatever the sanctioning body wants submitted. The same number gets typed in three places, the copies drift, and the knowledge of how to run the match lives in one person's head.

10–12 h
of prep for a single monthly match, before setup
Reported by one NRL22 match director (source ↗). Sizing targets, checking round counts, and typing the matchbook are most of it.
  • Inventory and its condition tracked from memory
  • Target size in MOA worked out by hand, per stage, per distance
  • Registration, waivers, and squads on paper or email
  • Scores in a separate product, results shared days later
WHAT IT DOES

Build the match once. Everything after it comes from that work.

The stage you write is the stage the matchbook prints, the tablets score, and the results add up. Six steps, one record.

The club's target inventory, with photos
01 · STEEL — Each plate and prop recorded once, with its shape, size, and a photo. Every stage after that draws on the same list, so a plate is never two different sizes. Click to expand.
Targets in a stage, with distances typed and MOA calculated
02 · STAGES — Positions and a shot plan against real targets at real distances. Rounds, points, and MOA total as you build, and a stage with a problem is held back before it reaches a matchbook. Click to expand.
One stage page in the matchbook, as competitors read it
03 · MATCHBOOK — Start conditions, shot plans, targets, distances, and notes come straight from the stages. Shooters read it online or print it. Nothing is retyped. Click to expand.
Choosing a division while registering, on a phone
04 · REGISTRATION — Publish the match and share one link. Shooters sign in, pick a division, accept the waiver, and register from their phones. The director approves entries and builds squads. Click to expand.
A squad tablet on shot 7 of 12, offline, with scores saved
05 · TABLETS — Each squad gets a tablet. The squad leader scores shot by shot with the start timer on the same screen. Every score saves on the tablet first and sends when it finds signal. Click to expand.
The results email every competitor receives
06 · RESULTS — Complete the match and final places, overall and by division, go out by email to every competitor. Nobody waits until the next day. Click to expand.
Live scores on the public match page while squads send
05 · TABLETS — Shooters watch scores come in on the public match page as each squad's tablet sends. Demo club; names and scores are made up, here and in every screenshot above.
DESIGN DECISIONS

Four calls, and the reasoning behind each.

Nontechnical users, no reliable signal, numbers shooters will argue about, and a matchbook some of them have already built dope cards from. Each decision below came from one of those.

01
The math is computed, never typed

A director enters a plate's real size once. MatchOps works out its size in MOA at whatever distance it's placed, which is the number shooters dial and the number they argue about. Because nobody types it, it can't drift between the stage plan and the matchbook.

02
This month's match doesn't change under your shooters

Stages live in a library and are copied into a match. Edit the library and next month's match picks it up; this month's doesn't, because shooters may already be building dope cards from its matchbook. Convenient for the director, and safe for the people reading it.

03
Two tablets disagree: keep both, let a director decide

Offline scoring means two tablets can score the same shooter differently. No score is silently overwritten. MatchOps keeps both and shows them to a director, who makes the same call they'd make with two paper score sheets, with both sheets in front of them.

04
Offline first, and say so

The nearest bar of signal is often back at the parking lot, so the tablet works without one. Every score saves on the device immediately, the screen says so, and the sync is something the squad leader can see happen, not something they have to trust.

A stage held back because a target needs a distance
01 · IN PRACTICE — A stage held back because a target has no distance yet. Problems surface at the kitchen table, not at the safety briefing.
Two tablets' scores for one competitor, waiting for a director
03 · IN PRACTICE — Two tablets' scores for one competitor, side by side, waiting for a director to pick one.
HOW IT WAS BUILT

I decide. Claude plans and reviews. Codex builds.

The other case studies don't have this section because the other products weren't built this way. MatchOps was: every change goes around the same loop, and the loop is the design work I'm proudest of on this project.

The MatchOps build loop Six steps in a cycle: I decide what to build; Claude plans it and writes a brief; Codex builds it in an isolated copy of the code; Claude reviews the change; automated checks run; I approve and the pipeline deploys. The loop returns to the start. AND AROUND AGAIN · EVERY APPROVED CHANGE DEPLOYS TO PRODUCTION 01 · ME Decide what to build 02 · CLAUDE Plan it, write the brief 03 · CODEX Build it, isolated 04 · CLAUDE Review the change 05 · CHECKS Tests and lint run 06 · ME Approve, deploy
THE LOOP — the two steps with my name on them are the two that can't be delegated: what to build, and whether it's done.
THE LOOP

I decide what to build. Claude plans the work and writes a brief that names the files, the acceptance criteria, and what not to touch. Codex builds it in its own isolated copy of the code. Claude reviews the diff and the tests, automated checks run, I approve, and the pipeline deploys it.

PICKING THE MODEL

Each task goes to the cheapest Codex tier that can finish it in one pass, and the brief says why in writing. Mechanical edits go to the small model; anything that edits lines that already exist goes up a tier, because that is exactly where the cheap tiers miss.

THE TOOLING I BUILT

Custom Claude skills that encode the project's process for planning, review, and filing issues, so every session starts with the same context and the same rules. Agent instruction files in the repo. GitHub connected through MCP. Issues filed from my phone straight into the backlog.

Who did what, plainly: I set direction, approved every change, and own the result. Claude wrote the briefs and the reviews. Codex wrote most of the code. The design is mine, directed through the same tools.

WHAT WENT WRONG, AND WHAT CHANGED

The agents are fast, confident, and wrong in specific ways.

Knowing where they fail is most of the job. Three failures, and the rule each one left behind.

  • Green checks, four visual defects

    A change passed every automated check and still shipped four things that looked wrong in a browser. Every brief since ends with a list of what a person has to look at, in both themes, at phone width.

  • Tests that could never fail

    Agents wrote tests whose assertions no product change could break. The fix is to break the feature on purpose and confirm the test catches it, before the test counts as evidence of anything.

  • Three blockers in one night

    The first real use of registration found three blocking bugs that no test could see, because no test was a person with a phone at a range. All three were fixed and merged the same night, and real use before a match is now a scheduled step, not a hope.

Same discipline as the usability misses on VSP One File: publish what didn't work, and show what it changed.

THE RESULT

A real product, run at real matches, four months after the first commit.

Live
Used at live matches
Registration, squads, scoring on the tablet, and results emailed the same day, with no issues on match day.
<70 ms
Director dashboard responses, down from 2.5 s
After moving the backend from shared hosting to a dedicated server. The slowest request after the move, not the average.
1,400+
Commits since August 2026
Three apps and one API, every change reviewed before it landed.

Feedback has been positive from competitors through industry professionals. The part I keep coming back to is simpler: the match ran, and nobody needed the clipboard.