Pick a season, type (Regular/Preseason/Postseason) and week, then click "Load Slate." Click a game to see player stat lines and projections. Preseason note: preseason games load and display, but preseason stats are excluded from projection baselines — starters play a series or two and those averages would poison Week 1.
Phase 1 · Live Data Plumbing (Historical Mode)
Loads real games straight from ESPN — real teams, real players, real stat lines. Pick a season, season type and week, then click a game for its matchup board: both teams side by side in depth-chart order (2 QB / 3 RB / 6 WR / 3 TE, plus anyone a book posted a line for), actual stat line (once played) next to the model's projection, injury status, market lines after a Pull Odds, and a DEFENSE block with sacks / INT lines. Weather is the Open-Meteo forecast for the kickoff hour when kickoff is within 7 days (labeled); otherwise the nearest available hour, also labeled. Season type matters: the opponent-defense multiplier only applies if Defense Ranks have been built for the same season AND type; if they haven't, a warning banner says so and the projections shown are baseline × weather × form only.
Only games you have opened are built, so only those can be exported.
T54 · TD & Defense props
For the week picked on the Games tab. Touchdown and sack probabilities come from usage share and the game line, fit on 2024 and tested on 2025. Interceptions and kickers are shown for the full picture only — no model beat a flat league rate on them. Pull Odds first to see book prices beside each number; Save ALL Targets saves these with the week so they can be graded.
For the week picked on the Games tab. Uses this app’s own Rankings (defense rank, weather, recent form, game script, injuries are already inside them) and the TD & Defense build. Order: Load Slate → Pull Odds → Rankings: Build All Positions → TD & Defense: Build → here: Import DK Salaries → Build Pool → Build Lineups. Tournament mode optimizes each lineup against a simulated slate where teammates’ and opponents’ outcomes move together the way 2024–25 games did. A Showdown salary file (one game, captain + 5) switches the tab to Captain mode automatically.
Import DKSalaries.csv to start.
Phase 0 · Stadium Table + Weather
All 30 NFL venues with the ported weather engine. Click "Test" to pull live conditions. Domes show as climate-controlled; retractable roofs are flagged.
Phase 3 · Path B · Leaguewide Projection Rankings
Ranks every QB, RB, WR, and TE by projected output. Now (offseason): ranked by season baseline + recent form (no opponent exists yet). When a real matchup exists — pick a week that has games, or once the 2026 schedule is live — it automatically folds in each player's actual opponent defense & weather (the full model), no rebuild needed. Heads-up: this is the heaviest build — ~32 rosters + a game log per player (150+ players), so the first run takes a few minutes. Everything caches; re-runs are instant. Build Defense Ranks first (same season) so matchup weeks can use them.
Mark OUT (this week, manual):
Pick a season, optionally a week for matchups, then Build Rankings.
Phase 2 · Defense Engine (Option A)
The core matchup edge. This computes true yards allowed by summing what every opponent did against each defense, game by game — ranking all 32 by pass yards allowed, rush yards allowed, and total yards. Rank 1 = stingiest. These feed the Phase 3 matchup multiplier, each matched to the right prop: Passing/receiving props use Pass D; QB & RB rushing use Run D. Same engine for any season: point it at a completed season now, or the current season later — it sums whatever games have been played, so ranks sharpen each week once 2026 kicks off. Heads-up: the first build of a full completed season fetches ~130+ games and can take a couple of minutes; it caches so re-runs are instant.
Pick a season and click "Build Defense Ranks." This fetches all 32 teams once and caches the result.
📊 Weekly Tracking
Saved snapshots of your built Rankings, one per season/type/week/position. Once a week's games are
final, press Verify vs nflverse to cross-check your saved
projections against nflverse — a free, independently
maintained NFL stats project — so you have a second source confirming (or catching drift in)
what ESPN reported, not just a copy of ESPN's own numbers.
⚙ Sportsbook Odds Setup
Same the-odds-api.com account as your MLB app works fine here — sport is selected by a parameter,
not by key. The key is stored in sessionStorage only, under a name separate from the
MLB app's, so clearing one never clears the other. It is wiped when you close this tab, never written
to disk, and never included in a backup export. You will re-enter it each session — deliberate,
so a key in localStorage never rides along in a shared file.
Books marked [ref] are priced and shown but do not enter the
consensus median. Hard Rock (FL) is reference-only on purpose: it is the book you bet into, so it is
the thing being compared, not part of the yardstick. Caesars and Fanatics require a paid
plan. Pinnacle is an EU book scraped from their public site, so it can lag — a sharp anchor, not
a live price.
Read this before you trust a gap.
This model outputs a projected yardage number, not a win probability, so the
vs Market column is a yards gap (model minus the book's line) —
it is not a de-vigged edge like the MLB app computes. Turning a yards gap into a true
cover-probability edge needs a variance model this app does not build yet. Treat a big gap as a smoke
detector for your own math first, a betting signal a distant second.
Adds six markets per game (anytime TD, 2+ TDs, pass TDs, pass INT, field goals, kicking points): a 16-game week goes from ~96 to ~192 credits per pull. Untick to keep the old cost.
Player props use the event-odds endpoint: 1 call per game, cost = markets ×
regions. One Pull Odds fetches six markets for every game on the loaded slate
— pass yds, rush yds, rec yds, receptions, sacks, defensive INT — so a 16-game NFL week
× 6 markets × 1 region = ~96 credits per pull. Your 20,000-credit tier
still covers a full season of weekly pulls many times over.
The historical endpoint costs 10× per call and is deliberately not used here:
a live pull taken close to kickoff is the closing line, captured once, stored locally forever.