Loading...
Loading...
Earth Doom Index's Climate Threat Index pulls real-time weather and air quality data from seven cities distributed across five continents, converts each city's conditions β extreme temperatures, dangerous weather codes, oppressive humidity, and air pollution β into a per-city score, then sums everything and clips the result to a 0β30 integer. The short version: it asks whether the planet's surface is having a bad day, using seven data points to stand in for the whole.
The Climate Threat Index covers the physical environment domain of Earth Doom Index β one of four tracked alongside Society, Economy, and Solar. Its mandate is short-term atmospheric hazard: heat waves, cold snaps, tornadoes, thunderstorms, gale-force wind, suffocating humidity, wildfire smoke. It does not track long-term climate trends, glacial retreat, sea-level rise, or anything that plays out over years. If you want a graph of civilization's gradual self-immolation, you will need a different dataset. This one asks: was it bad today?
The seven-city average produces a planetary estimate in the same way that a handful of weather stations produces a national forecast β approximately, with known gaps, and with full awareness that a cyclone in one city might be completely invisible if six others are having a pleasant afternoon. That averaging effect is a feature of the design, not an oversight: it means the index rises sharply only when multiple regions are simultaneously in distress. A single catastrophic event in one city will raise the score noticeably. Seven simultaneous catastrophic events would peg it near the ceiling.
The index contributes up to 30 points to the 100-point DOOM-9000 composite score, weighted equally alongside the other three domains.
The data source is OpenWeatherMap API, specifically two endpoints hit in parallel for each city. The Current Weather endpoint returns feels-like temperature, humidity, wind speed, and a WMO-derived weather condition code. The Air Pollution endpoint returns an AQI value on a 1β5 scale, retrieved by latitude and longitude.
The seven sample cities are Seoul, New York, Mumbai, Tokyo, Sydney, Cairo, and Moscow. The selection covers East Asia, North America, South Asia, Oceania, North Africa, and the Russian Arctic β a rough attempt at climatic diversity across hot-dry, hot-humid, temperate, and subarctic regimes. It is not a scientific sample of the planet. It is seven cities chosen to disagree with each other as often as possible, so that simultaneous high scores across all of them mean something.
OpenWeather's free API tier has per-minute call limits and typically refreshes conditions on the order of minutes. The index is calculated once per day, so refresh-rate lag is not a meaningful concern. More importantly: if an individual city's API call fails, it is isolated via Promise.allSettled β one city timing out does not block or invalidate the remaining six. A failed city simply contributes zero to that day's score. This is a deliberate operational trade-off: a slightly understated score is preferable to a broken score.
Scores are built city by city, then the 7-city sum is mapped to a 0β30 output through a piecewise normalization curve. The formula for each city is:
City score = feels-like temperature (0β3) + extreme weather / wind (0β2) + heat-humidity stress (0β1.5) + air quality (0β1)
Maximum per city: 7.5 points. Theoretical maximum across all 7 cities: 52.5 points. The raw sum is then converted to the final 0β30 output via piecewise interpolation (detailed below) β not a flat clip.
Feels-like temperature uses feelsLike from OpenWeather's current conditions. Above 30Β°C, the score climbs as (feelsLike β 30) Γ· 20 Γ 3, capped at 3.0. Below β10Β°C, it climbs as (β10 β feelsLike) Γ· 20 Γ 3, also capped at 3.0. The cap is reached at 50Β°C (or β30Β°C) β temperatures near the human habitability threshold where staying outdoors becomes survivable only briefly. Between β10Β°C and 30Β°C the contribution is zero β the index does not penalize a comfortable day.
Extreme weather and wind speed are scored separately and then the maximum of the two is used, preventing double-counting when a hurricane is also generating a dangerous weather code. Wind speed follows a step function: hurricane-force at 32.7 m/s or above scores 2.0, storm-force at 24.5 m/s scores 1.5, high wind at 17.2 m/s scores 0.8, and everything below that scores zero. The weather code mapping is the more granular of the two signals and is detailed in Section 4.
Heat-humidity stress is scored in three tiers, capturing the combination that makes heat genuinely dangerous rather than merely unpleasant. The top tier β feels-like at 32Β°C or above with humidity at 85% or above β scores 1.5 and approximates the WBGT 35Β°C habitability threshold beyond which even a healthy person in shade survives only a few hours. The middle tier (feels-like β₯ 30Β°C and humidity β₯ 90%) scores 1.0. The lowest tier (feels-like β₯ 28Β°C and humidity β₯ 85%) scores 0.5. Below those combined thresholds the contribution is zero.
Air quality normalizes the AQI level directly: (aqi β 1) Γ· 4. AQI 1 (Good) contributes 0.0; AQI 5 (Very Poor) contributes 1.0. Linear steps in between.
Final 0β30 conversion β The seven city scores are summed without averaging. The raw sum is then mapped to the output score via:
SCORE_BREAKPOINTS = [(0,0), (3,3), (8,8), (14,14), (22,20), (30,26), (40,30)]
Each pair is (raw sum, output score). Values between breakpoints are linearly interpolated; raw sums above 40 are clipped at 30. The breakpoints are tuned so that single-city events stay in single digits, raw 22 (5+ cities under simultaneous strong stress) reaches 20 (DANGER), raw 30 (multi-city extreme β comparable to the 2003 European heat wave reproducing across several continents at once) reaches 26 (CRITICAL), and raw 40+ (all seven cities under simultaneous extreme conditions β a planetary scenario in the spirit of 1816's "Year Without a Summer" following the Tambora eruption) reaches 30 (DOOM).
OpenWeather condition codes follow a WMO-derived classification scheme using codes from 200 to 800. The index treats the following codes as threat events:
| Code | Description | Points |
|---|---|---|
| 781 | Tornado | 2.0 |
| 762 | Volcanic ash | 1.8 |
| 504 | Extreme rain | 1.8 |
| 711 | Wildfire smoke | 1.5 |
| 771 | Squalls | 1.2 |
| 503 | Very heavy rain | 1.2 |
| 511 | Freezing rain | 1.2 |
| 731Β·751Β·761 | Sand/dust storm | 1.2 |
| 200~232 | Thunderstorm group | 1.2 |
| 502 | Heavy rain | 0.8 |
Any code not on this list contributes zero to the weather-code signal. Drizzle, mist, overcast skies, scattered clouds β all of these are meteorologically real but not scored as threats.
The 30Β°C lower bound for heat scoring is grounded in WHO heat-stress guidelines, which broadly identify temperatures above 30Β°C as the range where physiological heat strain begins to affect unacclimatized individuals. It is not a precise clinical threshold β it is the nearest round number that fits the data model and produces a score that rises meaningfully during actual heat events without screaming every summer afternoon in Cairo.
The β10Β°C cold threshold deserves a separate note. It is not symmetric with the heat threshold for scientific reasons β it is an operational calibration to prevent Moscow and New York from contributing permanently elevated cold scores during their respective winters. Below β10Β°C the cold signal starts climbing; above that, cold-climate cities are treated as operating within their normal envelope. This is a deliberate choice to keep the index sensitive to genuine cold anomalies rather than predictable seasonal baselines.
The 30-point ceiling is anchored to a specific conceptual reference: the kind of planetary-scale climate emergency that historical memory associates with 1816, the "Year Without a Summer" β the year following the Tambora volcanic eruption, when global temperatures dropped roughly 0.7Β°C and crop failures and famine struck multiple continents simultaneously. That is the climate-domain analogue of "nuclear war" for Society or "Great Depression" for Economy: not a single dramatic event in one place, but a planet-wide convergence of conditions that would register across every monitoring station at once. The piecewise normalization curve is calibrated so that score reaches 30 when all seven cities β Seoul, New York, Mumbai, Tokyo, Sydney, Cairo, and Moscow β are simultaneously experiencing extreme conditions across multiple sub-signals. Whether that calibration is right is, as with everything in this project, an open question awaiting operational data. This is, ultimately, a toy project β one that takes its numbers seriously enough to document them carefully, while remaining aware that seven cities is not a planet, and one bad afternoon in Tokyo does not constitute a global climate emergency.
μ°¨νΈ λ°μ΄ν° λΆλ¬μ€λ μ€...
Related Topics