Bet Advisor

A sports forecasting and betting research tool across six leagues that says, on its front page, the closing line beats every model in it.

RunningPythonFastAPIReactTypeScriptPlaywrightCloudflare Pages
Bet Advisor

It started in August 2026 as a college football model built to find out where a model like this stops working. It’s now a research and operations tool for college football, the NFL, MLB, the NBA, the WNBA, and the NHL. It pulls data on a schedule, builds a forecast per sport, compares each one to the sportsbook, and grades every result into a ledger that can’t be edited after the fact. The nav says .S.P.O.R.T. (Sports Projected Outcome Reporting Tool). I call it Bet Advisor.

The model is a market-disagreement detector. It isn’t a better forecaster, and the site says so. Across 45 scoreable pools of settled history, the closing line was significantly closer than the model in 39 and the model was closer in none. That number is on the model status page.

Only college football is allowed to stake. Its betting rule is a frozen, versioned policy from August 7, and a full stake needs two independent margin projections to agree on the side and the size of the edge. Every other league runs at zero units until it earns a stake with prospective evidence, and a page called The Path to Live shows each league’s measured distance from that. Each signal is one of four words: Bet, Maybe, Pass, or Avoid. Unknown means Pass. A missing line says “No line” and never shows a zero.

The rules that keep it honest are in the code. New hypotheses are pre-registered before the data that tests them exists. Retracted results stay on the site next to the findings, and tests pin them so a later run can’t quietly re-derive them. Accuracy, disagreement with the market, retrospective ROI, and prospective results are four separate numbers that never get merged into one score. “Confidence” means how good the evidence is, not how likely a team is to win.

It runs on a Mac with a Python pipeline, a FastAPI backend, and a React dashboard, and it publishes a read-only snapshot to Cloudflare every morning. Every Sunday an unattended run grades the week and commits the result, losing weeks included. Week 7 closed 1-6.