Most sports-betting models are sold or hidden. The handful that ship public weights are usually one-off academic projects that go stale after the season ends. This page is the running release-notes log for the open-source models we publish to /workshop — monthly cadence, Brier benchmarks against Vegas close, model cards, changelog entries, and direct links to fork each model into your own browser session. The point is to do the opposite of the typical model marketing: show the numbers, show the failure modes, ship the weights, and let users argue with the work rather than the brand.
What ships in every release
Each model card and changelog entry covers the same six fields, in the same order, so they’re comparable across months and across models:
- Training window: which seasons / weeks the model was trained on, with row counts.
- Feature set: enumerated features with their data sources (nflverse, NGS aggregates, BDB tracking, etc.).
- Architecture: layer sizes, activations, optimizer, hyperparameters, total parameter count.
- Holdout benchmark: out-of-sample Brier vs Vegas close, calibration plot summary (10 deciles), permutation importance for top 5 features.
- Known failure modes: where the model breaks, with examples.
- Fork link: direct route into /workshop to load weights and re-train with custom features.
The six-field discipline is the bare minimum for a model to be honestly comparable. If a published model doesn’t include all six, it can be flashy but it can’t be benchmarked.
May 2026 release notes
nfl-spread-v3.2 (TF.js dense net)
- Training window: 2021-2023 NFL regular season + playoffs, 285 weeks, ~7,200 game-rows.
- Feature set: vegas open + close (devigged), home/road EPA L8, opp EPA L8, rest days, injury index (starters out), weather composite, home/road pass-rate above expectation L4, presnap-formation aggregates (from BDB-trained transformer).
- Architecture: dense 24 → 12 → 1, sigmoid output, Adam optimizer, lr=1e-3, batch=64, 60 epochs with early stopping.
- Holdout (2024 regular season): Brier 0.2417 vs Vegas-close baseline 0.2461. Calibration deciles: 4 of 10 deciles within ±1.5%, worst decile (60-70% bin) realized 64.2%.
- Top features by permutation: vegas close (.0083), opp EPA L8 (.0028), home EPA L8 (.0022), pass-rate-over-expected (.0014), presnap formation aggregate (.0009).
- Known failure modes: weeks 1 to 3 (sample-thin EPA features), divisional games in week 18 (motivation noise), dome teams traveling outdoors in cold (weather composite undercounts).
- April changelog: added presnap-formation aggregate feature (lifted Brier 0.0009), fixed a join bug on bye weeks that was inflating opp_EPA_L8 (lifted Brier 0.0006), retired the home_pass_rate raw feature in favor of pass-rate-over-expected.
- Fork: /workshop → models → nfl-spread-v3.2. Weight footprint 92 KB.
nfl-totals-v2.1 (TF.js dense net)
- Training window: 2021-2023, 7,200 game-rows.
- Features: vegas total close, home/road plays-per-game L8, pace-over-expected, weather composite, dome flag, opp def DVOA L8, situational pace adjustment (back-to-back, short week).
- Architecture: dense 18 → 10 → 1, MSE loss on margin from Vegas total, Adam, 50 epochs.
- Holdout: Brier (binned over/under) 0.2438 vs baseline 0.2470. Calibration deciles: 5 of 10 within ±1.5%; worst decile is the 70-80% over bin (realized 73.8%).
- Top features: vegas close (.0061), pace-over-expected (.0019), weather composite (.0014), opp def DVOA (.0011).
- Failure modes: outdoor games in wind > 20 mph (the weather composite saturates and loses fidelity), final games of bye-week pairs (rest-feature interactions are sparse), Thursday games in December (combined fatigue and weather make the model conservative).
- April changelog: rolled back a short-week interaction term that improved training Brier but hurt holdout (overfit signal). Documented as a calibration-not-improvement case for users to reference.
- Fork: /workshop → models → nfl-totals-v2.1. Weight footprint 78 KB.
wr-prop-yards-v1.0 (TF.js dense net, first public release)
- Training window: 2022-2024 BDB tracking + NGS aggregates, 1,950 player-weeks.
- Features: rolling 4-week NGS aggregates (avg_separation, percent_share_of_intended_air_yards, max_speed banded), route-mix encoded as (entropy, deep_share, screen_share), presnap formation (motion_at_snap, alignment_width, rb_depth), opp coverage tendencies (two-high rate, man rate), shadow flag, vegas opening prop line.
- Architecture: dense 16 → 8 → 1, sigmoid for over/under, Adam, 80 epochs, dropout 0.15.
- Holdout (2024 weeks 12-17, 480 player-weeks): Brier 0.2362 vs Vegas opener baseline 0.2447. Improvement is largest in matchups where the opener was set Tuesday morning and adjusted little before kickoff.
- Top features: vegas opener (.0058), percent_share_of_intended_air_yards (.0021), deep_share (.0019), motion_at_snap rate (.0014), shadow flag (.0011).
- Failure modes: shadow-flag false positives on weeks where a CB unexpectedly travels, sample-thin rookies (under 4 weeks of NGS data), QB injuries that change the entire passing distribution mid-game.
- Notes: this is the first model that ships a tracking-data-derived feature transformer. The transformer itself is published separately as f_bdb-presnap-v1 so users can fork it without re-training the full WR prop model.
- Fork: /workshop → models → wr-prop-yards-v1.0. Weight footprint 304 KB (including the feature transformer).
nba-totals-v1.4 (TF.js dense net)
- Training window: 2022-2023 regular season + playoffs, 4,800 game-rows.
- Features: vegas total close, pace-over-expected, opp def rating L10, rest days, B2B flag, travel-distance bucket, home/road net rating L10, line-move from opener.
- Architecture: dense 14 → 8 → 1, sigmoid, Adam, 50 epochs.
- Holdout (2024 regular season weeks 18-24, 600 games): Brier 0.2484 vs Vegas-close baseline 0.2501. Small but consistent.
- Failure modes: All-Star break ±1 week, load-management games (no good public feature), playoff-implication games in late March (motivation noise).
- Fork: /workshop → models → nba-totals-v1.4. Weight footprint 68 KB.
Brier-vs-Vegas-close monthly table
The running monthly out-of-sample Brier benchmark for each public model. "Delta" is positive when the model beats Vegas-close (lower Brier is better):
- nfl-spread-v3.2 — Nov 2025: 0.2418 (Δ +0.0044). Dec 2025: 0.2402 (Δ +0.0058). Jan 2026: 0.2421 (Δ +0.0039). Feb 2026: 0.2438 (Δ +0.0024). Mar 2026: 0.2451 (Δ +0.0010). Apr 2026: out of season. May 2026: out of season.
- nfl-totals-v2.1 — Nov 2025: 0.2441 (Δ +0.0032). Dec 2025: 0.2429 (Δ +0.0041). Jan 2026: 0.2455 (Δ +0.0018). Feb 2026: 0.2472 (Δ -0.0004). Mar-May 2026: out of season.
- wr-prop-yards-v1.0 — first public release in May 2026; will populate next month.
- nba-totals-v1.4 — Nov 2025: 0.2491 (Δ +0.0010). Dec 2025: 0.2487 (Δ +0.0016). Jan 2026: 0.2495 (Δ +0.0007). Feb 2026: 0.2479 (Δ +0.0019). Mar 2026: 0.2486 (Δ +0.0014). Apr 2026: 0.2492 (Δ +0.0011). May 2026: postseason, partial month.
Two patterns worth flagging. First, nfl-spread-v3.2’s edge compressed through the season — common for any model as the market learns the same patterns. Second, nfl-totals-v2.1 went slightly negative in Feb 2026, which triggered the rollback of the short-week interaction term mentioned above. Negative-edge months are kept in the table on purpose; pretending the model is always positive would be misleading.
How to fork and re-train
The forking workflow on /workshop is intentionally short:
- Open the model card. Click "Load weights" — this pulls model.json + the binary shard into your browser IndexedDB. Takes 2-4 seconds for typical model sizes.
- Open the training notebook (TF.js Notebook view) and click "Reproduce holdout." This runs the holdout evaluation in your browser, takes 5-15 seconds, and produces a Brier number that should match the published value within ±0.0003.
- Edit the feature set: add features, swap features, drop features. Each feature is a brick wired to a data source.
- Hit "Retrain." Training takes 8 to 30 seconds depending on architecture and CPU. The notebook re-runs the holdout automatically and shows your Brier vs the published baseline.
- If you’re happier with your variant, save it under a new name. Submit a PR against the public model registry if you want it considered for the next release notes.
Forking is encouraged precisely because it stress-tests the published models. A community of forks finds bugs and improvement vectors the core team would miss. The whole loop sits in a browser tab on /workshop with no server upload — your weights stay on your device.
The model-card honesty contract
Three things that aren’t allowed in our release notes, by policy:
- Cherry-picked holdout windows. Holdout is always the most recent complete season (or the last 6+ weeks if mid-season). No "we beat Vegas in October 2024" claims based on a 4-week window someone happened to pick.
- Training-Brier vs holdout-Brier conflation. The only number that counts in the table is holdout. Training Brier is reported in the model card for diagnostic purposes only.
- Hiding negative-edge months. Every monthly Brier shows up in the running table, even when negative. Trust requires the bad months.
The discipline that makes this work is the test in CI: a release-notes pull request can’t merge unless the cited holdout matches the recomputed holdout from the published weights, and the running table can’t skip months. Automation enforces the contract; humans can’t edit around it.
Comparing this format to alternatives
Three other formats exist in the public model space, each with limitations:
- Academic papers (Big Data Bowl, JQAS, arXiv): high rigor, but typically one-shot, hard to fork, and stale within a year. Useful for technique transfer, less useful for ongoing betting.
- Kaggle competition notebooks: open code but no published weights, no ongoing benchmark, no clear path to use them in real bets.
- Tout-service "transparency reports": present win-loss, hide CLV, hide methodology, no fork link.
The monthly release notes format here is closer in spirit to software changelogs: small, regular, honest about regressions. The goal is for someone reading the May 2026 notes a year from now to see exactly what changed since April, why, and whether it worked. The CLV framework is the validation layer underneath — model edge is real only if it produces CLV.
Roadmap for upcoming releases
What the team is working on for the next few release cycles, in priority order:
- mlb-totals-v1.0 (targeting June 2026). Park factors, umpire features, pitcher-arsenal embeddings.
- ufc-fight-v0.9 (targeting June 2026). Style-matchup features, sig-strike pace, round-by-round sim.
- nba-player-props-v0.5 (targeting July 2026). Per-stat models (points, rebounds, assists) sharing a feature transformer.
- Calibration plots inline in every model card — currently a separate snip, will be embedded by July.
- Per-season Brier history charts in the running table, so the trend lines are visible at a glance.
The roadmap is part of the release notes on purpose — committed-in-public roadmaps are accountability. If a model on the roadmap doesn’t ship, the next release notes have to explain why.
The handoff to /tinker
Release notes are for users who want to evaluate, fork, or audit a model. For users who want to build their own model from scratch with one of the published feature transformers, /tinker is the surface. Drop the f_bdb-presnap-v1 feature into a fresh model, wire it to your own architecture, and you’re training in 30 seconds. The release notes mark which transformers and weights are recommended as starting points for new builds.
How to read a model card without being fooled
Even with the six-field discipline, model cards can mislead if you read them wrong. The four traps that catch most users:
- Brier improvement without calibration check. A model can lower Brier by getting confident predictions correct while being miscalibrated in the middle deciles. Always look at the 10-decile calibration summary, not just the headline Brier.
- Holdout size too small. A 200-game holdout has noisy Brier — improvements under 0.003 may be variance, not edge. Holdouts of 600+ games are where small improvements become trustworthy.
- Feature drift unmentioned. If the model trained on 2021-2023 and the holdout is 2024, but the league shifted (rule change, formation tendency drift), the holdout Brier can look great while the in-season Brier crashes. The known failure modes section is where this should be flagged.
- Selection effects in the published model. If 50 model variants were tried and only the best 4 were released, the published Brier overstates expected forward performance. Honest release notes flag the variant count or use a held-out-of-development sample.
The model cards on /workshop attempt to disclose all four, but "attempt" is the right word — reviewing them critically is on the user too.
Build-your-own model card
If you’re publishing a model anywhere — to a friend, to a Discord, to your own website — the six-field template scales down. The minimum honest card for a community-published model:
- Training window in plain text ("2022-2024 NFL regular season, 4,200 games").
- Three sentences on features, with data sources named.
- One sentence on architecture.
- Holdout Brier, baseline Brier, delta, with sample size.
- One paragraph on known failure modes.
- Where to download the weights (a link, a gist, a Drive folder).
That fits in 300 words and is enough for someone else to decide whether your model is worth running. Without it, your model is a vibe. With it, it’s a tool someone else can use, verify, and (eventually) tell you what’s wrong with.
What we got wrong in past releases (running list)
Transparency cuts both ways — published mistakes are part of the contract:
- Sep 2025 (nfl-spread-v3.0): shipped with a bye-week join bug that inflated opp_EPA_L8 by about 8% for two weeks every season. Caught in Nov by a forked variant. Fixed in v3.1.
- Dec 2025 (nba-totals-v1.3): included a load-management proxy that worked in training but had no in-season data source. Effectively a dead feature for live use. Removed in v1.4.
- Feb 2026 (nfl-totals-v2.0): short-week interaction term overfit training Brier by 0.0011 but hurt holdout by 0.0007. Caught in 4 weeks of in-season scoring. Rolled back to v2.1.
- Mar 2026 (wr-prop-yards prototype): feature transformer was trained on BDB 2023 only, didn’t generalize across seasons. Re-trained on 2022-2024 for v1.0 release.
The list lives at the bottom of /workshop too, so users who fork can see what to avoid replicating.
Why this is a competitive moat
The conventional intuition: hiding the model is the moat. Anyone can copy your features once you reveal them. The empirical observation, after 12 months of running this format: hiding wasn’t the moat. The moat is execution — feature pipeline maintenance, in-season data joining, holdout discipline, monthly evaluation. Other teams can copy the feature list and still produce a worse model because they don’t run the operational cadence.
Meanwhile, the public release notes attract users, forks, and bug reports, which makes the next month’s model better. The compound interest from transparency runs ahead of the cost of revealing the architecture. Most competing betting model operations are still working from the assumption that secrecy is the asset. By the time that assumption falls apart for them, the public-model approach has compounded another year of improvements.
Bottom line
Monthly release notes with consistent Brier-vs-Vegas-close benchmarks, full model cards, and forkable weights are the cheapest credibility move a betting model can make. The format takes about 90 minutes per model per month to produce and surfaces every regression, every improvement, and every wrong call. If the model is real, the table proves it month after month. If the model breaks, the table shows that too. Either way the user can act on the truth instead of the pitch. Fork any of the May 2026 models from /workshop or extend them in /tinker — the weights, the holdouts, and the failure modes are all public.
Bet responsibly — set limits, never chase losses.
Named modeling examples
A model page is more useful when the feature examples are concrete. Josh Allen rushing attempts, Ja'Marr Chase target share, Nikola Jokic assist rate, Tarik Skubal strikeout projection, Igor Shesterkin starter confirmation, and Islam Makhachev control time are all different prediction problems. A single “player form” feature cannot explain them all, so the model needs sport-specific inputs and review notes.
- NFL: separate route participation, pressure rate, and red-zone role from box-score volume.
- NBA: separate usage, minute projection, pace, and back-to-back fatigue.
- MLB: separate starter skill, handedness, park, weather, and lineup confirmation.
- NHL and UFC: late confirmations and fight-week news can matter more than a season average.
Model inputs worth naming
Use names as evidence, not decoration. The useful SEO win is that Josh Allen, Ja'Marr Chase, Bijan Robinson and Puka Nacua and Chiefs, Bills, Eagles and Lions appear inside decisions, thresholds, and internal links instead of being dumped into a keyword list.
- NFL model: route participation for Ja'Marr Chase, rushing attempts for Josh Allen, pressure rate allowed by the Bengals, and red-zone carry share for Jonathan Taylor should be separate features.
- NBA model: usage, projected minutes, rest, and pace should move Nikola Jokic or Shai Gilgeous-Alexander props differently than a one-number power rating.
- MLB model: Tarik Skubal strikeout projection, Coors Field park factor, lineup confirmation, and bullpen rest need their own columns.
- Review loop: grade entry price, closing price, bet result, and model error separately so lucky results do not hide bad forecasts.
Build or audit the workflow in Tinker and review it with CLV.
Research note board
Use this model-audit board to keep features, validation, and bet sizing from collapsing into one confidence score.
| Model layer | What to inspect | Example input | Downgrade when |
|---|---|---|---|
| Feature | Whether the variable maps to the sport and market | Josh Allen role data or PPR price movement | The feature is a proxy for something you can measure directly |
| Validation | Out-of-sample error, CLV, calibration, missing data | Chiefs market movement after injury news | Wins come without beating the close or improving calibration |
| Sizing | Bankroll, confidence interval, correlation, market limit | CLV exposure compared with related tickets | Multiple bets repeat the same thesis at full stake |
Model calibration: predicted vs observed
Predicted win probability bucket vs the empirical win rate inside that bucket on the test set. Points on the y=x reference line are perfectly calibrated; points below mean the model is overconfident in that bucket.
EV per $100 across win rate × odds grid
Expected value of a $100 stake at each combination of true win rate and market odds. Anywhere the cell is positive you have a long-run profitable bet; the magnitude shows how aggressive Kelly will size it.



