Weather data is fetched from Open-Meteo, which serves both live forecasts and the Copernicus ERA5 reanalysis archive (1940–present). Upcoming stages use the forecast API; completed stages use the ERA5 archive.
Stage times are computed in race-local time — Europe/Paris, or Europe/Madrid for the Spanish stages — which is what determines each stage's "today"/upcoming/completed state.
Each completed stage's "Time on course" line — winner vs. last classified rider for road stages, fastest vs. slowest ride for the two time trials — comes from official published race results, displayed as-is alongside the measured conditions above. We don't compute an exposure window or a temperature range from it; it's shown for readers to weigh against the numbers themselves, not as a derived statistic.
We estimate Wet Bulb Globe Temperature using the Minard (1961) combination — WBGT = 0.7·Tnwb + 0.2·Tg + 0.1·Ta — the same combination used by Cvijanovic et al. (2026, via ECMWF's thermofeel library). Our natural-wet-bulb and black-globe sub-terms are a documented simplification, not a full port of the iterative Liljegren et al. (2008) model, so treat WBGT values as estimates, not certified measurements. WBGT is always shown in °C — it's a regulatory index (the UCI High Temperature Protocol publishes its thresholds in °C), so it doesn't convert with the °C/°F toggle.
For each stage's finish town (and mountain-pass sample point, where relevant), we pull ERA5 daily maximum temperature for every year 1974–2023, within ±7 days of the stage's calendar date. The anomaly shown on every stage card is today's observed or forecast max minus that 50-year mean, at the same location. Decade means and the "then vs now" day-count comparison are drawn from the same 50-year window.
Elevation comes from the Open-Meteo Elevation API, itself based on the Copernicus DEM 2021 release GLO-90 (90m resolution), available worldwide under a free license (attribution: the Copernicus program, via doi.org/10.5270/ESA-c5d3d65, and Open-Meteo). We sample ~200 points per stage along the route and cache the result as static data — it's a one-time fetch, since real terrain never changes.
The route between waypoints is a straight-line (geodesic) approximation, not the actual road: no openly-licensed, key-free, production-permitted routing API was available (OSRM's and Valhalla's public demo servers are both explicitly documented as non-commercial testing/fair-use only, not for production; OpenRouteService requires an API key). A single long chord between two sparse points can cut across terrain the road never touches — we found this directly on stage 2, where a plain Tarragona-to-Sitges chord crossed open water. For stages where that happened, we densified the path with real intermediate towns from published route descriptions (names/order only, never fetched from or referencing ASO's own profile graphics), so each individual chord stays short enough to track the real road reasonably well. A validation pass flags any stage with a long run of identical elevation samples — a sign of a chord sampling the wrong terrain (or, for a run of exactly 0m, open water) — so this class of error doesn't silently slip back in. A second check cross-references each stage's cached maximum against every known climb/col elevation already on record, flagging anything more than 150m over — the overshoot class a repeated-value check can't see, since a smooth chord crossing the wrong terrain doesn't produce identical samples.
Even after hand-placing waypoints along the real roads (villages, junctions, and col summits roughly every 8-12km, sourced from published route descriptions), a handful of stages in the most rugged terrain still exceed that tolerance by several hundred meters — a straight line between two correctly-placed real towns can still pass near a ridge the actual road avoids. We disclose this rather than hide it: those stages' shape is a close approximation, not a survey-accurate one, and the validation pass keeps reporting the exact overshoot so it stays visible rather than silently drifting.
Elevation resolution and weather resolution are different things. The band's shape comes from ~200 real elevation samples; its color comes from only the 3-4 points we have actual weather for (start/col/finish), interpolated between them along the route. A gradient between two hot readings doesn't mean every meter in between was measured — it means we don't have a reading there, so we interpolate.
Vertical scaleis proportional to each stage's real relief (the gap between its lowest and highest sampled point) against a single fixed reference: the race's largest real range, stage 20's Bourg-d'Oisans-to-Alpe-d'Huez route via the Col du Galibier (2,180m). A stage with half that relief draws at roughly half the band height, so stages are visually comparable to each other, not just internally consistent with themselves. A 10%-of-chart-height floor keeps genuinely flat stages' real texture visible instead of a dead flat line, and a matching ceiling means nothing is ever drawn taller than the chart itself — a stage would need more relief than the queen stage to hit that ceiling.
Fill colorcomes from the same temperature ramp everywhere on the site, anchored to 10–42°C — the plausible range for European summer racing, not a generic thermometer scale. Our hottest observed/forecast readings so far top out around 39–41°C, so a genuine 35°C+ scorcher now reads deep in the ramp's red end, while a mild, about-average day stays pale. The same domain and ramp drive the band, the legend, and the share-card images — never renormalized per stage.
ERA5 is a reanalysis— a physically-consistent gridded reconstruction of past weather, not a network of individual weather stations. Each grid cell (~28km for ERA5, ~11km for the finer ERA5-Land product) represents an average over that whole area, which can differ from a single station's reading — especially in coastal cities, where a grid cell partially averages in the adjacent sea.
We checked this directly: for Barcelona, the official 1991–2020 climate normal (AEMET) puts the July mean daily max around 28–29°C. Our ERA5 figure for the exact same period and month comes out to 26.8°C— about 2°C cooler. We also tried the finer-resolution ERA5-Land product (26.75°C) and an explicitly-pinned ERA5 model (27.0°C); neither closed the gap. This is a known, documented characteristic of gridded reanalysis data for coastal locations, not a bug in our pipeline — we independently verified that our "observed" and "baseline" numbers come from the identical data source and grid cell (a separate check found them byte-identical across 3,319 days compared).
Why the anomaly is still trustworthy:the anomaly compares today's value to ERA5's own50-year average at that exact grid cell — the same offset applies to both sides of the subtraction, so it cancels out. What it means is: absolute baseline numbers on this site describe "ERA5's climatology for this location," not an official government climate normal for the named town — we phrase them as "the 50-year average at this location (ERA5)" for that reason, never as "the average temperature in [town]."
One more thing a careful reader might notice: the 26.8°C validation figure above won't exactly match a given stage's displayed baseline for the same city. That's intentional, not an inconsistency — the validation figure averages the whole month of July over 1991–2020, matching how a published climate normal is defined. Each stage page instead shows a tighter ±7-day window around that stage's specific date, over the full 1974–2023 record — because what matters for a given stage is "is today unusual for this date," not the whole month. For Barcelona specifically, narrowing to the ±7-day window around July 4 accounts for about 0.8°C of that difference (early July runs cooler than the July average), and using the full 50 years instead of just 1991–2020 accounts for another ~0.2°C (older decades were cooler, which is the whole point of showing the trend).
Methodology inspired by Cvijanovic, I., Begg, J.D., Mistry, M.N., Petrova, D., Brimicombe, C., Sultan, B. (2026). "The future of European outdoor summer sports through the lens of 50 years of the Tour de France." Scientific Reports, 16, 2644.
UCI High Temperature Protocol thresholds: uci.org.
How Hot Is the Tour? is built by FrontRunners, a charity working to protect the future of sport. FrontRunners helps athletes, teams and sporting bodies understand and respond to the ways climate change is, and will, affect sport from the grassroots to the elite level. This site is an independent project. Corrections and questions: info@frontrunners.org.au.
This site was developed using Claude (Anthropic's AI model) for code, research, and data-pipeline work, under human direction and review. Every computed number passed a human-verified audit: baselines validated against published climate normals, observed temperatures checked against reported conditions, and every displayed figure required to reconcile arithmetically on the page. The full methodology, data sources, and known limitations are published on this page.