Changelog
weather.football turns weather into a number every football fan can read. This is what's live, and what's next.
Down to the games that genuinely cannot be scored
After 1.3 there were 790 games still scored on temperature and wind alone. Most turned out to be fixable, and the ones that are not are now identifiable rather than merely counted.
🧭 Three stadiums nobody had coordinates for
- 456 games had no venue at all. The Raiders in Oakland, the Chargers in San Diego and the Rams in St Louis — three franchises that moved and took their abbreviations with them, leaving their old homes in no current venue list. They now sit in a historical venue table, keyed by the abbreviation the schedule uses at the time, so adding them could not move a game that was already scored. Oakland gets a station 2.9 miles away, San Diego 2.5, St Louis 13.
- 68 more were lost to outages, not distance. A station can pass a two-season coverage probe and still have nothing at all across the afternoon a game was played — Green Bay has windows with no observation inside twelve hours — and Arizona's nearest qualifying field turned out to be an air force base reporting only sporadically. Every venue now carries ranked alternates and a game falls through to the next; 70 games are scored from a second or third choice, each recording which.
- 790 → 300. Station-graded games go 2,891 → 3,381, and the evidence base behind the component weights grows to 6,685.
🚫 And the 300 that stay
- 259 of them are the whole of 1999. nflverse records no kickoff time for a single game that season — not one, and no other column carries it. Every other year is complete. A time could be guessed from the weekday and the era's usual slate, but a three-hour error in the game window is precisely the bug this site has already found and fixed twice, so 1999 keeps its box-score temperature and wind and says so.
- The other 41 were played abroad. London, Mexico City, Munich, São Paulo. The home team's station is on the wrong continent, and the network that covers them is a separate build.
- Which is the point of counting them. "790 games we have not got to" and "300 games that cannot be measured" are different statements, and only the second is worth printing.
🐞 Found on the way
- The methodology page was under-reporting itself. The paragraph summarising how many games are scored added up two grades and called it the total — so once a third grade existed it claimed 3,895 games where 7,276 had been scored, and omitted the station grade entirely. A hand-edit to fix it was silently overwritten on the next render, because that block is generated. It now reads whatever grades exist rather than naming two.
The forecast stops guessing too
1.3 made the site's history read observed snowfall instead of inferring it. That is worth much less if the forecasts still guess — and they did: the live score took the NBM's single liquid-equivalent number and split it into rain and snow with a temperature rule, then multiplied by a snow-to-liquid ratio. Two inferences deep, for a quantity a forecaster publishes directly.
📐 NDFD publishes a depth, which is what the engine wants
- Forecast snowfall now comes from NDFD. The grids the local forecast offices sign off on carry snowfall as a depth — the same quantity the observed archive supplies and the same one the engine scores. Inside its reach the live forecast and the history are the same measurement, so the edge lookup finally compares like with like.
- It reaches about 60 hours, so it lights up on Friday for a Sunday game. Short of the eleven-day horizon, but covering the leads at which a game forecast is actually read. Beyond it the NBM split by wet bulb still stands — and that is no longer a guess either, having agreed with ERA5's own partition on 98% of games. Every dashboard row now records which of the two fed it.
- Ice accumulation is read as a flag, not a number. NDFD's ice field is an NCEP-local GRIB parameter with no published units. A number whose units nobody publishes is not a number, so it is carried as a yes/no.
🔍 Units nobody publishes
- The archive reports
units=unknownfor every NDFD precipitation field. So they were read from the raw GRIB on the NWS feed: snowfall is discipline 0, category 1, parameter 29 — "Total snowfall", in metres. Precipitation is category 1, parameter 8, in kg m⁻². Ice is category 1, parameter 227, which has no entry at all. - And the extract re-checks itself every run. Nothing downstream would notice a units change, and a silent factor of thirty-nine in a snow rate would score every snow game as a blizzard — invisibly, until December. A rate above 8 in/hr is not physical and the block is dropped; where snow and liquid are both forecast, the implied snow-to-liquid ratio is reported and flagged if it leaves the range such a ratio can occupy.
- The rehearsal was lying by omission. It shifts the extract's clock to simulate an in-season run, and it did not shift the new NDFD block — so every rehearsal would have fallen back to the NBM and quietly rehearsed the wrong path. Fixed, and the game-day rehearsal now exercises NDFD for real.
We stopped guessing what fell
Winter weather is the football people remember, and until this release the site had no snowfall observations at all. It inferred precipitation type from one line — frozen if the air was at or below 34 °F — applied to a reanalysis field averaged over a 25 km grid box. This release replaces the guess with the observation, and then re-derives the precipitation engine from what the observations say.
🌨️ Snow is observed, not inferred
- Every game now carries the present weather from the station nearest the stadium. 27 seasons of hourly METAR at 30 airports — what fell, at what intensity, and how far you could see. Median distance to the stadium is 6 miles and none is beyond 18. Six of the first-pass stations were rejected by an automatic coverage probe, including the one nearest Baltimore, which has never filed a present-weather group in its life.
- The old rule was wrong in both directions. Against 185,000 observed hours of snow or rain, a 34 °F air-temperature threshold called 2,527 hours of snow rain — snow has been observed at these stadiums at 47 °F — and 2,912 hours of rain snow, multiplying each by a snow-to-liquid ratio. Phase is now decided on the wet bulb, which is what falling snow cools itself toward. Centred at 33 °F, where the observations put it, it scores a Heidke skill of 0.946 against 0.932 for the best possible dry-bulb rule, and catches 97.9% of snow hours against 95.7%.
- 686 games changed score — 459 up, 227 down — and the ones that moved most are the ones you remember. The 2024 Steelers–Browns snow game went 25 → 53; the 2007 Packers–Bears whiteout 70 → 85; the 2017 Bills–Colts whiteout 43 → 54. Some fell: the 2019 Packers–Giants game drops 41 → 34, because the station saw flurries where the reanalysis had put down steady snow.
- Where the station saw nothing, the game is dry. The reanalysis puts a little precipitation on most games — a grid-box mean over 625 square kilometres will — and 1,656 of those games have a station that watched the whole window and filed no weather at all. The observation wins. While the precipitation term was linear this hardly mattered, since a typical 0.003 in/hr was worth a fifth of a point; under a concave term the same number is worth four, which is how we noticed.
- Intensity comes from the observer, not the gauge — on purpose. A heated tipping bucket undercatches snow in wind. Over 152 observed snow games it reads 33% of what the present-weather code implies, and just 15% once the wind reaches 10 knots. The gauge is computed alongside so the two can be compared rather than assumed.
📐 Rain saturates. Snow accumulates.
- The precipitation term had the wrong shape. It was linear in rate for both phases, which is a convenience rather than a finding. Rain fits better as a square root of its rate on three of four passing outcomes; snow fits better linear on all four. Once the ball and the field are wet, more rain adds little — whereas snow keeps covering the lines, the ball and the footing.
- The index's central winter claim survives; its size does not settle. A point of snow costs about twice a point of rain, and 96% of bootstrap resamples agree it costs more than one — but the 95% interval runs from 0.93 to 3.45, and the two halves of the archive disagree inside it. The engine's calibration sits in that interval, so nothing was changed. 134 snow games is not enough to pin a coefficient, and an earlier draft of this entry stated 2.2× more firmly than half a sample deserved.
- The whole change measurably improves the index. Correlation with scoring goes from −0.114 to −0.133, a gain whose 95% bootstrap interval is [−0.028, −0.011] and which holds in 2,000 of 2,000 resamples. The band curve still falls the whole way down — 44.0, 41.7, 39.9, 32.7 points a game — with the caveat that the new extreme band contains three games and should not be read as anything.
- The level is a choice, and we name it. The regressions fix the shape and the rain-to-snow ratio; nothing can fix what 30 points means. We set it so the worst precipitation game in the archive still reaches the cap, and explicitly declined the calibration that maximises correlation — that one is roughly twice as high, because most of what it sees is simply wet against dry, and it would flatten every rainy game onto the cap.
💨 One gust rule for the whole archive
- Two grades were scoring gusts by different rules. Reanalysis-graded games took ERA5's gust and, failing that, fell back to 1.5× the mean wind — worth up to 5.6 points on a windy game. Station-graded games took the METAR gust, and a METAR reports one only when it clears a threshold, so an absent gust was read as calm rather than as silence. Pre-2006 windy games were quietly under-scored against their post-2006 equivalents.
- ERA5's gust now covers the whole archive, so both use it. The Copernicus gust cache begins in 2006; Earthmover's copy of the same field begins in 1999. They are bit-identical where they overlap — 101,112 hours compared at Buffalo, maximum difference 0.000 mph, correlation 1.000000 — so this changed nothing after 2006 and gave the seven seasons before it a gust for the first time. Copernicus stays wired in as the fallback, because it is the first-party source and should not be forgotten just because a mirror is faster.
- 87 games moved up a band. Notable goes 219 → 253 and the high-impact edge sample 266 → 279. The replays read the same field, so the pre-2006 ones have gusts now too.
🕰️ Seven seasons that were being scored on temperature alone
- 1999–2005 now carry full inputs. The observation archive starts in 1999; the reanalysis cache starts in 2006. Those seven seasons had every input available from the station — gust, humidity, present weather — and were being scored on temperature and wind. Games scored that way fall from 3,681 to 790, and the ones that remain are pre-move venues with no station mapping and games with no kickoff time on record.
- A third grade, labelled as such. Seasons now shows STA alongside OBS and LEG. It is a separate state on purpose: a point observation a few miles away is not a 9 km reanalysis cell, and where both exist the reanalysis path is kept, so nothing already scored moved.
- The validation curve is monotonic for the first time, end to end. 44.1 → 41.6 → 40.0 → 31.7 → 30.4 points a game across all five bands. High-impact games go under the total 55.9% of the time on 279 games. The under-rate climbs too — 49.9, 55.1, 54.7, 65.0, 80.0 — though not without exception: notable sits a third of a point below minor, which on 253 games against 1,106 is noise rather than a finding, and we would rather print it than round it away.
- The evidence base nearly doubled. The component regressions now run on 6,213 games rather than 3,430. Snow moves 5 of 9 outcomes where it moved 4, and now shows on the scoreboard as well as in how the game is played.
- The Tuck Rule Game exposed a labelling failure. Light snow, three-quarter-mile visibility, 26 °F — and almost no wind, so every severity test passed it through to Fair. A game with snow falling must not be called Fair. There is now a Flurries regime below Snow Bowl for exactly this.
🔬 And a reanalysis held against it all
- ERA5 agrees snow fell, and struggles to tell you how hard. Over 6,142 windows at all thirty venues it caught 113 of 153 observed snow games (Heidke 0.703) — but among those, rank correlation with observed intensity is only 0.37 and it reads 46% of the observed rate. A 25 km box average dilutes exactly the bands football remembers. This is the clearest justification yet for preferring the station.
- The wet-bulb rule agrees with model physics 98.0% of the time. ERA5 partitions phase through the whole atmosphere and has never seen a METAR; our rule reads a surface wet bulb. Over 881 games they agree at Heidke 0.884, and a third line — whether ERA5's snowpack actually gained mass during the game — agrees on 95.9%. For the games no station watched, these are the only checks available, and they pass.
- Where ERA5 snowfall actually comes from. Neither Copernicus ARCO time-series product carries it: ERA5-Land accepts 19 variables, ERA5 single-levels 23, and snowfall is in neither. Google's ARCO-ERA5 mirror has it but chunks one whole global map per hour. Earthmover's open Icechunk store publishes a time-series-chunked copy — a year of hourly data in a 12×12 tile — and a 27-year point series reads in under a second. All thirty venues took three minutes, against a third-party HTTP API that exhausted its daily quota after eleven.
🔎 What we measured and did not score
- Visibility. Against the old linear precipitation it looked real — completion percentage down 2.9 sigma. Against the corrected term most of it dissolved: it had been picking up the misspecification, not a separate effect. What remains is under the bar we already applied to crosswind, so it is computed, archived and left out of the score.
- Freezing rain, ice pellets and blowing snow. Now decoded and stored, but they appear in 7, 7 and 4 games. Nothing can be concluded from that, and nothing is.
- Five components, one scale. With rain and snow entering separately, cap per outcome moved is 7.5 for wind, 5.0 cold, 6.0 rain, 7.5 snow, 8.0 heat — five components inside a range of 5 to 8.
🔧 And the things that fell out of it
- The browser engine had drifted from the server. It was still scoring heat on the pre-1.2 cap, so a hot game scored one number on Forecast and another on the Dashboard. Both engines now share every constant, including the new wet-bulb phase rule.
- The Index Family could not reach its own range. Snow Bowl, FG Shank and Run It were tuned against grid-box water-equivalent rates, so a genuine snow game contributed about two points of Snow Bowl's fifty-five. On an observed depth rate they span what they were designed to.
- The pre-render ran before the data it renders. Dashboard and Outlook were baked from the previous build's numbers. The rebuild order is fixed.
- The simulator asked for snow in the wrong units. Its intensity slider fed water equivalent, so the Snow Bowl preset was quietly asking for eleven inches of snow an hour. Snow is now entered as depth, the number you would read off a ruler.
The claims now match the code
An external audit went looking for the gap between what this site says and what it computes, and found one. Most of this release is closing it — including in the places where the honest number is less flattering than the one we had been printing.
🌨️ The precipitation engine was wrong
- Snow was being scored as water, not snow. Every source gives frozen precipitation as water equivalent — an inch of water is roughly a foot of snow — and the engine was reading it as depth. A real snow game (25°F, 15 mph, about 1.6 in/hr of snow) scored 42; it scores 69 now. The snow term was effectively switched off, and every snow claim on the site rested on it.
- The archive was re-scored. On Weather Replay, 10 of 24 games moved: the 2007 Browns–Bills snow game went 64 → 78, the 2010 Bears–Patriots game 69 → 76. The two most famous snow games were the two most understated.
- The published formula did not match the engine. Reproducing the precipitation equation on Methodology gave 6 points where the site awarded 30. It now matches,
gust_premiumis defined, and the roof table finally lists the retractable factor that was actually running. - Dropped a crosswind claim we had not built. The page advertised a crosswind adjustment for stadium orientation; the engine has no wind-direction term at all. It now says so, and names it as intended work.
📊 History, and what kind of number it is
- Precipitation is in the historical score. Three separate builders each left it out while the reanalysis conditions sat unused on disk. They now share one definition, so the dashboard no longer scores a game from a full forecast and then compares it against temp-and-wind-only history.
- Every historical score is labelled. 3,595 games carry full inputs; the rest were temperature and wind alone. Seasons shows a chip on every row, because they are not comparable. (In 1.3 the temp-and-wind-only count falls to 790.)
- The headline figures moved, and we moved with them. Scoring falls 44.1 → 31.7 points a game from calm to high impact (was 43.8 → 30.0). High-impact games go under the total 55.9% of the time, not 60.7% — but on 279 games rather than 15, which is the more important number.
🔭 Forecasts that reach the whole week
- The live horizon is 11 days, not 2. Forecasts now come from the weatherzarr archive rather than a point endpoint that only carried two days on most cycles. The Season Dashboard lights up games a week and a half out.
- /forecast and /friday show seven days again. Both advertised a week and rendered an empty back half; they now tier NBM with NDFD to fill it. A long-standing bug that read accumulated precipitation as an hourly rate — overstating it up to sixfold at long leads — is fixed with it.
- Kickoff windows are scored in the right hours, correcting a 4–5 hour offset that read morning air for an afternoon game.
- The 2026 forecast archive is recording. From eight days before each kickoff we save the forecast at fixed leads and never revise it. It cannot be backfilled, so it starts before the season does.
🧾 Evidence ships with the claim
- We stopped calling the validation independent. The weights were checked against the same record they are tested on; that is calibration. The first genuinely out-of-sample test is the 2026 season, now being recorded.
- Confidence intervals, and the cuts that do not flatter us. The high band is 17 games in 27 seasons and its interval overlaps the band below it. Cut to 2023–2025 alone, the relationship does not hold. Both facts are on the page.
- No headline number is JavaScript-only any more. The validation table and the figures on The Weather Edge and The Kicking Game are baked into the page — they used to render as an em-dash or a stray full stop before scripts ran.
- The homepage gauge shows a real game — the next one on the schedule, with whether its number is a forecast or climatology — instead of a made-up 43.
- Provenance corrected — the engine is NBM, not NDFD/URMA as About claimed; the reanalysis is a 9 km reconstruction sampled near the stadium, not "truth" at the exact stadium; and the windiest-games list says 2021–2025 rather than "on record".
The whole season, before a snap is played
The 2026 schedule is out, so the site now looks forward as well as back. Two new pages lay the full slate over 27 years of stadium climatology — one game by game, one team by team — and they refresh themselves every hour as kickoff approaches.
🗓️ New pages
- 2026 Season Weather Dashboard — all 272 games in one sortable grid: expected WFI, the posted total and spread, and the weather edge for each game's band. Near-term games swap climatology for a live forecast automatically. Open the dashboard →
- 2026 Team Weather Outlook — all 32 teams ranked by the weather their schedule will actually bring, with a league-relative Exposure Index, projected starting quarterbacks and each team's three roughest dates. See the outlook →
🔧 Corrections & honesty
- Kickoff windows are now scored in the right hours — the forecast window is converted from Eastern game time to UTC before it is matched against the model series, correcting a 4–5 hour offset that would have read morning air for an afternoon kickoff.
- The live-forecast horizon is stated as 48 hours, which is what the underlying NBM point feed actually carries for temperature and wind — rather than claiming eight days and quietly serving climatology.
- The nine international games are flagged, not faked — Melbourne, Rio, London ×2, Paris, Madrid, Munich and Mexico City are played away from the listed home team's stadium, so they carry no venue rating instead of borrowing one from a building on another continent.
- The Exposure Index has its own vocabulary — sheltered through most exposed. It is a league-relative ranking, so it no longer reuses the WFI severity words and can't call a slate "extreme" when every game on it projects as minor.
- Full-FBS climate coverage — the college climate table counts its own teams and drops venues whose reanalysis cache came back empty.
The foundation is live
Everything you need to answer one question — how much will the weather shape the game? — for any NFL or college matchup, past or upcoming. The scoring engine is validated against decades of outcomes; the live game-day board activates at 2026 kickoff.
🎯 The core index
- The Weather Football Index (WFI) — a transparent 0–100 score from wind, precipitation, cold, heat and roof type. Full methodology & formula →
- Independent validation — across every outdoor NFL game since 1999, scoring falls from 43.8 points/game in calm weather to 30.0 at high impact. The index never sees the score. See the proof →
- The Index Family — branded sub-indices (Field Goal Shank, Run It, Snow Bowl, Swamp Monster) with historical leaderboards. Explore the family →
📡 Live tools
- Game Forecast — the live WFI at every stadium, hourly from weather.city NBM. Open the forecaster →
- What-If Simulator — drag temperature, wind & snow and watch the index and projected scoring move; compare two scenarios. Try it →
- Interactive Stadium Map — all 32 venues by climate, weather faced, or resilience, with an animated wind overlay. Open the map →
- Friday Night Lights — type any city, state or ZIP for a high-school football weather read. Find a game →
- Global search — jump to any team, player, stadium or tool from the homepage and index.
📊 Historical analysis
- The weekly board — browse & filter every game (2021–2025) by WFI, division, weather type and the Vegas total. Browse the board →
- Seasons browser — year-by-year, color-coded weather impact for every game. Go season by season →
- Weather Replay — relive football's most brutal games with box scores and conditions. Watch it unfold →
- The Weather Edge — how the betting market under-prices weather. See the edge →
- Human Markets — a prospective study of weather vs Kalshi & Polymarket. The markets angle →
🔎 Teams, players & coaches
- Stadium Weather Impact — every venue's climate and the warm-vs-cold acclimation gap. Climate mismatch →
- NFL team profiles — all 32 ranked by Weather Football Resilience. Team board →
- Player profiles — calm/windy/cold splits, game-by-game logs with filters, career weather tax, and CSV export. Search a player →
- The Hoodie Index — coaches ranked by adverse-weather record, with downloadable weather scouting notes. The coaches →
- The kicking game — field-goal accuracy and distance in wind, cold and snow. Kicking in weather →
- College football — conference splits, out-of-conference games and the CFP dome question. The college hub →
🧭 Discoverability & polish
- SEO landing pages — a dedicated page for every stadium plus topic guides (cold-weather games, wind & field goals, windiest games).
- Dark mode — a theme toggle in the nav, site-wide.
- Mobile & accessibility — responsive layouts, scrollable tables, skeleton loading states, ARIA labels and keyboard navigation.
- Persistent navigation — categorized menu, breadcrumbs and search on every page.
On the roadmap
- The live weekly board lights up at 2026 kickoff — every NFL and college game scored from the forecast.
- Copernicus ERA5-Land reanalysis folds precipitation into the historical record, lifting the all-time ceiling beyond today's temperature-and-wind scores.
- Current-week index leaderboards — live "this week's top Snow Bowl / Field Goal Shank candidates."
- Deeper college coverage — per-venue backfill and a college weekly board.
- Richer scouting reports — team- and matchup-level weather intelligence.
Have a request? weather.football is built in the open, powered by weather.city.
Not affiliated with the NFL or NCAA. Historical data from nflverse & cfbfastR; forecasts from weather.city.