Jonathan Woodley

Fair Weather Index

2026Live

Everyone has a different idea of a good day. This one asks you for yours, then replays three years of real observations against it and tells you where on Earth it happens most.

The problem with a climate average

"Best weather" rankings almost always answer a question nobody asked: they average a year into one number, then rank places on it. That buries the thing people actually care about: how often is it genuinely pleasant, by my standard, and when in the year does that happen?

Fair Weather Index inverts it. You set the terms: temperature or feels-like, dew point, humidity, wind, gusts, rain, cloud cover, visibility. Every station-day in the archive is scored pass or fail against those terms, and the map paints the share of days that cleared them.

What you are looking at

The world lattice is 40,586 land dots at roughly 60 km spacing, held in longitude and latitude and projected fresh every frame. A row at latitude φ gets 360·cos(φ)/s columns, so every cell covers the same patch of ground wherever it sits. That equal-area property is what the whole app rests on. Without it, high-latitude countries would silently count for more, simply by being drawn larger.

Both world views preserve it. The globe is orthographic; the flat map is Equal Earth. Switching between them does not move the standings, because a dot means the same amount of ground either way.

The dot-matrix globe turned to Europe, showing fair-weather scores in green and teal across the United States and Europe, with the rest of the world in grey.
The same terms, the whole period.
The same globe with a different set of terms applied, producing a markedly different colour distribution.
Change the terms and the map changes with them.

Grey means no data, not bad weather

The archive covers the United States and Europe. Everywhere else is drawn grey: it is land, it is not weather. The border between a coloured United States and a grey Mexico is where the dataset stops, not where the climate changes.

This is the decision the project is most opinionated about. Interpolating a colour across Africa from an airfield a thousand miles away would have produced a prettier map and a dishonest one.

Under the hood

2,281 stations were harvested and thinned to 961: the keeper in each cell of about 55 miles, chosen on an even geographic spread. The cell is sized in ground distance rather than degrees, since a degree of longitude is half as wide in Norway as in Spain, and a fixed-degree cell would have weighted Scandinavia double. Each reading is quantised to one byte in obs.bin, laid out day-major so a single day's frame is one contiguous read; 255 always means "not reported".

Dot positions come from precomputed sines and cosines, so spinning the globe costs a few multiplies per dot instead of four transcendental calls, and far-side dots are dropped on the sign of their cosine before anything else touches them. A separate preview script reuses the app's own geometry, ramps and scoring to rasterise the map to PNG without a browser, which is how an upside-down projection got caught in the first place.

A close-up of a single US state on its own lattice, resolving mountain terrain against plains.
A close-up interpolates the same stations more finely. The Colorado Rockies show up plainly, but the close-up adds no information the stations don't have.

Going in close

Click a country and the map rebuilds on a lattice for that country alone, using Lambert azimuthal equal-area centred on it, which works anywhere a conic tuned to one country does not. In the United States, where the source has subdivisions, one more click opens a state, and below that a click selects a single airfield.

What it will not tell you

Being straight about the limits is part of the design, and the app says so on its own pages:

A two-ink timeline trace for a single reporting station across the year.
The standings ring reads the year as 365 spokes, answering when a place is fair: something the map alone can't show.
Role
Design, data pipeline, and front end
Data
Xweather daily station summaries
Period
Aug 2023 – Jul 2026, 1,089 days
Stations
961 after thinning, across 32 countries
Stack
Vanilla JavaScript, Canvas, Node build pipeline
Hosting
Caddy behind a Cloudflare Tunnel