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, actual stat line (once played) next to the model's projection, injury status, and market lines after a Pull Odds. 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.
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.
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.
Player props use the event-odds endpoint: 1 call per game, cost = markets ×
regions. This app requests one market at a time (whichever prop matches the position
you're viewing — pass yds for QB, rush yds for RB, rec yds for WR/TE), so a ~14-game NFL week
× 1 market × 1 region = ~14 credits per pull. Pulling all three positions
for one week costs about ~42 credits. Your 20,000-credit tier covers a full season of
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.