Weather StoryMethodology

How we build Weather Story

Last updated 2026-09-14. Maintainer: Brian Tighe (btighe428@gmail.com).

What this site is

Weather Story is an almanac-style weather reference for U.S. cities and ZIP codes. Each city page combines a current forecast, 30-year climate normals, a frost-aware planting calendar, microseason context, and a short FAQ. The goal is a useful, durable reference — not a real-time weather radar or a news site.

Pages are server-rendered from public datasets. Numeric content (temperatures, precipitation, frost dates, ZIP boundaries) comes directly from the sources cited below; the prose around those numbers is generated programmatically and, for the highest-traffic cities, edited with a language model under the rules in the editorial section.

Data sources

Editorial standards

Every city page follows the same scaffold (climate intro, year-in-weather table, planting calendar, FAQ, regional context, microseason). The numeric tables are programmatic: the same source dataset always produces the same numbers.

The prose around those tables is held to three rules: cite a source for every number; never introduce facts not present in the source (no invented landmarks, neighborhoods, or events); and write in a register that respects the reader's time — short sentences, concrete nouns, no marketing filler.

We do not personalize, A/B test, or hide content from users that we show crawlers. The HTML you see in your browser is the same HTML we send to Googlebot.

Microseasons

Weather Story uses a 72-microseason calendar — the solar year divided into seventy-two five-day windows — as the editorial backbone for "what season is it, really?" on every city page. Almanac calendars of this kind have a long American tradition: farmers, gardeners, and birders have kept regional phenology logs for centuries (the Old Farmer's Almanac first published in 1792). Each microseason is a tiny phenological note — roses opening on brownstone trellises, the first magnolias dropping, salmonberry petals along the trail edges.

Each microseason is read for nine North American climate regions: Northeast Continental, Southeast Subtropical, Pacific Northwest, California Mediterranean, Mountain West, Plains Continental, Southwest Desert, Tropical Sub-Tropical, and Alaska Subarctic. Each city page renders the reading from the climate region that matches its location. The same calendar window, read through different ecologies, is visible side-by-side on the dedicated microseason pages at /microseasons.

Pollen

The seasonal calendar on each pollen page is a phenology model, not a measured pollen count. Each of the nine climate regions has hand-authored peak-month windows for tree, grass, and weed (ragweed) pollen, drawn from general AAFA and ACAAI seasonal guidance, plus a peak severity on a 0–4 scale (None, Low, Moderate, High, Very High). Each window becomes a 12-month intensity curve, strongest mid-window and tapering toward the edges. Tree and grass timing then shifts with the city's latitude relative to its region's anchor metro, using Hopkins' bioclimatic law: about 4 days later per degree north, capped at 1.5 months. The shift moves the season's start and end, not its length — a calendar month counts as in season only when the shifted season covers at least half of it. Ragweed is not shifted, because its onset is set by day length rather than latitude.

Two corrections landed on 2026-09-16, and both are visible in the numbers. First, the latitude shift above: until then it was applied as awidening of the season's edges, so any city more than about three-quarters of a degree from its region anchor gained a whole extra month at each end and modeled seasons grew with distance from the anchor. That dropped a pollen type from 524 of the 4,644 kept city-months and shortened the median season on the Allergy Index from 304 days (edition 2026.1) to 274 (edition 2026.2). Second, mountain cedar: Ashe juniper (Juniperus ashei) pollinates from mid-December through February in the Central Texas Hill Country, peaking in mid-January, and the three-wave tree → grass → ragweed calendar had no way to say so. The model now adds that winter lobe to the tree curve for cities inside the Edwards Plateau belt — 29.2 to 32.2°N, east of 101.5°W and west of the Balcones Escarpment itself, which runs from about 98.5°W at San Antonio to 97.1°W at Waco, in Texas only — at Very High severity, since a typical cedar peak of 20,000–32,000 grains/m³ runs more than ten times the 1,500 grains/m³ the National Allergy Bureau calls Very High for tree pollen. It puts December tree pollen in season in five of the kept pollen cities, so 529 city-months changed in all. It is not applied outside that belt: Dallas, Fort Worth and Oklahoma City get cedar pollen carried north on winter cold fronts, and prairie towns a few miles east of the escarpment — Seguin, Thrall — are downwind of it rather than in it; both are transport, not a local season. Sources for the window, the counts and the range are the same ones the cedar fever guide cites (Cleveland Clinic; Texas A&M AgriLife). Like everything else on the pollen pages, the cedar season is modeled, not measured.

Live daily readings (a 0–5 index per pollen type) come from the Google Pollen API only while that feed is switched on, under a hard $1.00-a-day spend cap and a 24-hour cache per location. When it is off or fails, the page shows the seasonal model alone — never an invented count.

UV index

The current reading on each UV page is the uv_index value from the Open-Meteo Air Quality API, cached for 10 minutes. Bands follow the EPA scale: Low 0–2, Moderate 3–5, High 6–7, Very High 8–10, Extreme 11+.

Burn times use a minimal-erythemal-dose (MED) model. For Fitzpatrick skin type III, minutes to first redness = 300 ÷ (UV × 0.025) ÷ 60 — about 33 minutes at UV 6. Types I–VI scale that by their reference MED (200, 250, 300, 450, 600, 1,000 J/m²) divided by type III's 300. Below UV 3 no time is given. The peak-UV window is solar noon (the sunrise–sunset midpoint) ± 2 hours — an estimate, because the feed has no hourly UV.

The month-by-month table is a clear-sky model: UV = 12.5 × cos(solar zenith angle)2.42 × (1 + 0.08 × elevation in km), using the noon sun angle on the 15th of each month and elevation from Open-Meteo's Copernicus 90 m terrain data (sea level if a city's elevation is missing). It ignores clouds and ozone.

Air quality (AQI)

The live reading on each air-quality page is the U.S. AQI from the Open-Meteo Air Quality API's CAMS global domain (Copernicus Atmosphere Monitoring Service), cached for one hour. It is a gridded model estimate, not a nearby monitor. We don't compute the AQI ourselves: the provider reports a sub-index for PM2.5, PM10, ozone, and NO₂, the overall AQI is the highest of them, and the pollutant that matches it is named the main driver. Bands follow EPA breakpoints: Good 0–50, Moderate 51–100, Unhealthy for Sensitive Groups 101–150, Unhealthy 151–200, Very Unhealthy 201–300, Hazardous 301+.

Year-by-year history comes from EPA AirData "Annual AQI by County" files for 2020–2025: median and maximum AQI, days in each category, and the pollutant that led on the most days. A city shows its county's record, matched by county FIPS code; counties missing from EPA's files, or whose names didn't match, have no history. The trend compares the average median AQI of the earlier half of those years with the later half; a change under 2 points reads as steady.

Climate normals and records

The climate pages cover 75 of the most populous U.S. cities, each matched to one NOAA GHCN-Daily station: the nearest U.S. station within 60 miles that reports precipitation and whose daily high and low record runs from 1960 or earlier through at least 2023, swapped for an airport station when one is no more than 35 miles farther away. Cities with no such station are left out.

Monthly highs, lows, precipitation, and (where the station has one) snowfall are NOAA NCEI's official 1991–2020 normals for that station, used as published. All-time records and the warming trend come from the station's full daily record, minus any value NOAA flagged as failing quality control. The warming trend is the least-squares slope of annual mean temperature, in °F per decade, using complete years only: a year counts when every month is missing at most 5 days of readings, so the in-progress year and a station's partial first year are left out. A trend is published only when it rests on at least 30 complete years with no gap longer than 10 years; if a record has a longer gap, only the years after it are used, and if those are too few the city page shows no trend. Each city page names the years its trend is fitted to and states the total change as slope × that span; a total under 0.5°F either way is described as flat. The fastest-warming ranking compares rates over one common window, 1970 to the latest complete year, and leaves out cities whose station doesn't cover it (at least 30 complete years, starting and ending within 3 years of the window's edges, no gap longer than 10 years).

Köppen labels are coarse: nine rectangular regions modeled on NCEI U.S. climate regions, gridded at 0.5°, yielding six classes. Every city in a box gets that box's class, so some are mislabeled — Denver reads as hot desert, Palm Springs as Mediterranean — and Alaska and Hawaii fall outside the grid.

Update cadence

Corrections

If you find a factual error on a city page — a frost date that doesn't match local experience, a ZIP that's mapped to the wrong city, a microclimate description that's clearly wrong — please email btighe428@gmail.com with the URL and the discrepancy. Corrections are reviewed and reflected on the next regeneration of the affected page.

License

Climate, ZIP, and city data are used under the licenses noted above. Site content (prose, design, code): © Brian Tighe. All rights reserved.