all3pts: What to Watch This Weekend, With the Odds

all3pts.com answers one question for a US soccer viewer: what should I watch this weekend, and where? It lists every MLS, NWSL, and Premier League match by day. Each has the kickoff in your time zone, the US broadcaster, win chances, and one sentence on what is at stake. First commit September 5, 2026. I run it from First Press Studio.

The slate

The home page is the week. Each row is a match: kickoff, where to watch, the forecast as three bars, and a tag when the match earns one: must watch, high stakes, top quality. I write the stakes line in plain words with one number: "Both need this for the playoffs. A win lifts D.C. United to 21%, Red Bulls to 86%." No verdicts, no "upset," no ranks out of context. These rules live in a Never list in the design doc. Each records a reflex already corrected on the site. An agent working on a screen can spot them.

The forecast

A match page keeps the last forecast issued before kickoff. It includes the model version and the time it was issued. It never changes after that. You can hold the site to it. I use a Dixon-Coles rating model for win, draw, and loss chances. It also produces the most likely scorelines as a grid, each club's playoff odds now and after each result, and the table. I score the model against a protocol pinned before any tuning. It uses a held-out season, 2,000 bootstrap replicates, and FiveThirtyEight's archived forecasts as the reference. Across the 844 matches in the development seasons, the predicted share of each goal total from 0 to 6+ lands within two points of what was observed.

The pipeline

I use a Python pipeline to fetch fixtures, listings, lineups, and results each night. It validates them against a written contract and writes one immutable snapshot per competition to R2. The site never fetches from a provider. It is Next.js on a Cloudflare Worker through OpenNext. Each page comes from the league's current snapshot and stays until the snapshot changes. A second Worker with a Durable Object wakes at each kickoff. It reads the league scoreboard every 20 seconds while a match is under way. Each reading goes to open pages over a WebSocket. Crests, kit colors, and player headshots come from registries checked into the repo. When two kits clash, the away kit is resolved before the weekend, not at render time.

Design for agents

I built most of this site with Claude Code, so I wrote the design system for an agent to read first. DESIGN.md is the entry point: the tokens, the steps they allow, the Never list, a component index, and a pass to run before UI is done. A token lint in the verification script flags any new hard-coded value. The baseline of existing ones only shrinks. I mirror the same tokens into a Graphical theme. A test checks the mapping.