Sealed before tip
A business analyst, Claude Code and an NBA forecast that is graded in public, misses included.
By Uğur Altunbaş · Nov 9, 2026
Every night of the NBA season, Clutch puts one number on every game: the chance that the home team wins. Before the game tips, that number is written to a public Git repository, hashed and chained to the file before it, so I can't quietly change it later. After the final, the Ledger grades it in public, on the same games as ESPN's BPI, the market's final price and the simplest rule there is: pick the home team. I'm a senior business analyst and an AI product owner. I built Clutch with Claude Code as my developer.
Why I built it
I love the NBA, and software is my job. At work I decide what a product should do and write it down so that developers can build it. Clutch is what happened when I did that for myself.
I wanted one number per game that keeps score on itself. An NBA season is full of predictions, and hardly anyone goes back to check them. So the rule came before the app: every number is sealed before tip, and every number is graded after the final, in public.
One number, sealed before tip
Clutch's call is one probability per game. It can move during the day as injury news comes in. The one that counts is the last one before tip, and after tip nothing new is written for that game.
Each time a number changes, a scheduled job writes the night's numbers to a file in github.com/uguraltunbas/clutch-receipts. Every file carries the SHA-256 hash of the file before it, so the files form a chain. A few numbers are only for Pro readers before tip. Those go in as a hash of the numbers plus a random salt, and the numbers and the salt are published after the final, so you can check that what I show you later is what I had before the game.
You don't have to trust me on any of it. shasum -a 256 on a file gives the hash that the next file points to, and the repository explains how to check a whole night. The first seal went in on October 3, before a preseason game.
Graded in public
The hardest benchmark for an NBA forecast is the market's final price, so that is what I tested against. Before this season I replayed two full seasons, 2024-25 and 2025-26, month by month: every game predicted by a model fit only on the games before it. About 1,300 games a season. The score is the Brier score. It grades the probability itself, not just the winner. A coin flip scores 0.250, and lower is better.
| Brier score (lower is better) | 2024-25 | 2025-26 |
|---|---|---|
| The market's final price | 0.2010 | 0.1971 |
| Clutch's call | 0.2017 | 0.1977 |
| My model alone | 0.2063 | 0.1994 |
| ESPN BPI | 0.2062 | 0.2020 |
| Home team every game | 0.2481 | 0.2470 |
Read plainly: tested on two seasons, Clutch's call was more accurate than ESPN's BPI in both, clearly in 2025-26 and within the noise in 2024-25. It was level with the market's final price, not ahead of it. My model alone was only level with BPI.
So my model didn't beat the market, and Clutch doesn't claim it does. What it does instead is blend the two. A day before a game, my model carries about 48% of the number. Just before tip it carries about 2%, because by then the market has priced the same injury news and more. The Ledger grades both parts separately, so you can see my model lose to the market on the nights it does.
This season started on Oct 20, 2026. After the first 188 graded games, Clutch's call had 136 right, the market's favorite 135, my model alone 128 and the home team 99. ESPN's BPI had a number on 183 of those games and got 130 right; Clutch got 134 of the same 183. A few weeks is noise, and the Ledger says so on the page. Come back in March.
How an analyst and Claude Code build it
There is no server. Python jobs run on a schedule on GitHub Actions. They fetch the night's games, the injury report and the market's prices, write the numbers into a Postgres database and seal them. The iPhone app and the web app are one codebase that reads those rows. The game simulation and the What-If lab run on your phone.
I don't write the code. I do what I do at work: I decide what Clutch should do, write down what counts as right, check every change in the simulator and the browser, and say yes or no. Claude Code writes the code and the tests. Since September 1 there have been more than 1,400 commits across Clutch's four repositories, and about 95 in 100 of them name Claude as co-author. More than 5,400 automated tests run before anything ships.
None of this way of working surprised me. I work with software and AI every day.
What I'd tell another analyst
If you write specs for a living and want to build your own product this way:
- Write it like an analysis. Before anything is built, write down what counts as right: the acceptance criteria, the limits, the words that must never appear. Claude writes the code; what to build is yours. For Clutch, one of those rules is that you can never put money on a game in it, and a test fails the build if a single word from that world shows up in the app's text.
- "Done" isn't enough. Ask for proof. For every change: the tests, a preview, a screenshot. Don't accept anything you haven't looked at yourself.
- Guard rails first. Keep production writes, releases and builds in your own hands. Claude can't write to Clutch's production database, deploy a server function or start an App Store build. For those it hands me one script that checks itself first, and I run it.
- Measure honestly. Decide the comparison before you see the result, and publish whatever comes out. For Clutch that meant writing on the page that my model didn't beat the market, and keeping every graded game as it was graded.
Try it
- app.clutchledger.com: tonight's games. Make your call on one, no account needed. It locks at tip and is graded after the final; sign in afterwards if you want to keep it on your record.
- The Ledger: every graded game, with ESPN's BPI, the market and the home team beside Clutch.
- How it works: the model, the blend and the two-season test.
- The seals: every number before tip, and how to check one.
- Open data: Clutch's sealed numbers as plain files.
- The iPhone app is on the App Store.
Uğur Altunbaş, Istanbul
This season's numbers on this page are rebuilt from the Ledger every morning. I wrote this page with Claude's help, the same way I built Clutch.