Skip to content
Last updated: 9 min ago

Transparency

Methodology

Last revised: June 2026

The Global Tension Index is an analytical indicator of how much reporting by major news outlets points to rising or falling geopolitical tension, set against the number of active armed conflicts. It summarises news flow relative to the past year. It is not a prediction of war or of any specific event, and it should not be read as a probability.

1. Data sources

  • Public RSS feeds from BBC News (World), Al Jazeera, The Guardian (World), DW, France 24, The New York Times (World), Financial Times (World), CBS News (World), ABC News Australia, Sky News (World) and The Independent (World). These provide the headlines shown on the map and in the signal columns.
  • GDELT DOC 2.0 API (free, public): topic queries restricted to reputable outlets (Reuters, Associated Press, BBC, Al Jazeera, NYT, Guardian, WSJ, Financial Times, DW, France 24, Washington Post). GDELT limits request rates, so queries rotate (two per run) and may be temporarily unavailable.
  • GDELT 2.0 Event files (free, public): machine-coded world news events. We sample four 15-minute files per day (00:00, 06:00, 12:00 and 18:00 UTC). These provide a 12-month calibration history.
  • UCDP/PRIO Armed Conflict Dataset (Uppsala Conflict Data Program, free download): the count of active state-based armed conflicts and wars in the latest data year, checked daily.

Each source is checked on every run. If a source fails or is rate limited, the failure is logged and skipped; the site keeps showing the last known data. We never fill gaps with invented or placeholder items: every headline shown comes from a real fetched article and links to its publisher.

2. Collection, de-duplication and retention

  • Ingestion runs every 10 minutes.
  • Articles are de-duplicated by normalised URL and by near-duplicate title similarity (similarity ratio above 0.88).
  • Only articles published in the last 7 days are accepted. Classified articles are kept for 15 days so the 14-day component can be computed. Headlines older than 7 days are not displayed.
  • We store only the headline, outlet, link, publication time and our own classification. We do not copy article text.

3. Relevance filter and AI classification

A lightweight keyword filter first discards items that are clearly unrelated (sport, culture, business). Remaining new articles are sent once to a large language model (Anthropic Claude Sonnet), using only the headline, the short feed description and the outlet name. Results are cached and articles are never reclassified. Relevant topics are interstate conflict, major geopolitical tension and active armed conflicts of regional or international significance, including civil wars. The model returns a strict JSON object with:

FieldMeaning
is_relevantTrue for interstate conflict, major geopolitical tension or significant armed conflict
country_codesISO 3166-1 alpha-2 codes of the countries involved
regionOne of a fixed list of world regions
categorymilitary, nuclear, sanctions, diplomacy, cyber, territorial, alliance, other
directionescalation or de-escalation
severity1–10 geopolitical significance (shown as the impact badge)
confidence0–1 confidence in the classification
neutral_summaryOne neutral sentence written in the model's own words

Items marked irrelevant, or with confidence below 0.50, are discarded. Map coordinates come from a static table of country centroids, never from the model. At most 40 new articles are classified per run; any backlog is processed in later runs, newest first.

4. The Global Tension Index formula (version 2)

The index combines a structural component (how many armed conflicts are active and how intense they are) with two news-flow components (72 hours and 14 days). News flow is expressed as a percentile relative to the last 12 months, so 50 means "typical for the past year" and values near 100 mean "among the most intense days of the year".

Index = max( Floor, 0.38 × Structural + 0.62 × (0.55 × Flow72h + 0.45 × Flow14d) )
Floor = 0.38 × Structural

4.1 Structural component (weight 38%)

Structural = 100 × ( 0.5 × min(1, active_conflicts / 80) + 0.5 × min(1, wars / 20) )

Active conflicts and wars (conflicts with at least 1,000 battle-related deaths in the year) come from the latest UCDP/PRIO Armed Conflict Dataset, refreshed daily. If the download fails, we use the last stored value or, if none exists, a documented static fallback (data year 2025: 65 active conflicts, 13 wars, from dataset v26.1). Because this component reflects ongoing wars such as those in Ukraine and the Middle East, it keeps the index elevated even when news volume is low. The index can never fall below this floor.

4.2 News-flow signal (per article or event)

w_i = severity_i × confidence_i × source_weight_i × 0.5^(age_hours_i / half_life)

E = Σ w_i (escalation),  D = Σ w_i (de-escalation)
net = E − min(0.4 × D, 0.4 × E)

De-escalation counts at 40% of its weight and can never remove more than 40% of the escalation total. Source weights: Reuters, AP and BBC 1.0; Financial Times, NYT and WSJ 0.95; Guardian, Al Jazeera, DW, France 24, Washington Post and ABC Australia 0.9; Sky News and CBS 0.85; others 0.8.

4.3 Flow72h and Flow14d (weights 34% and 28% of the index)

  • 72-hour component: a 72-hour window with a 24-hour half-life, reacting quickly to new developments.
  • 14-day component: a 14-day window with a 7-day half-life, so long-running conflicts do not fade from the index after a few days.

Each component is the average of two percentiles, each between 0 and 100:

  1. GDELT event percentile: from the sampled GDELT event files we compute a daily conflict intensity: the sum over conflict events (material conflict at full weight, verbal conflict at half) of articles × |Goldstein scale|, minus cooperation under the same 40% rule, divided by all event-related articles (so changes in overall news volume do not distort it). We then take today's 72-hour (or 14-day) decayed average and rank it against the same measure for each of the previous 365 days.
  2. Verified-signal percentile: the net value of our AI-classified headlines over the same window, ranked against its own hourly history over the last 30 days. This term is used once at least 7 days (168 hourly snapshots) of that history exist. Until then, the component uses the GDELT percentile alone.

If the GDELT history is unavailable (fewer than 180 days stored), a documented fallback is used instead: Flow72h = 100 × (1 − e^(−net72/60)) and Flow14d = 100 × (1 − e^(−net14/150)).

4.4 Smoothing, levels and history

  • Live values are smoothed: index_t = index_(t−1) + 0.3 × (raw_t − index_(t−1)), recomputed every 10 minutes, and never below the floor.
  • Levels: 0–24 Low, 25–49 Elevated, 50–74 High, 75–100 Critical. Because news flow is ranked against the past year, the scale is relative to recent history: "High" means tension above the recent norm, not an absolute measure of danger.
  • With today's structural level (about 73), a typical news day places the index around the mid-to-high 50s. A quiet period stays above the floor (about 28). Readings of 75 or more require news flow that is clearly above normal on both time scales.
  • An hourly snapshot is stored for the 7- and 30-day charts. History before the version 2 launch (6 November 2026) was rebuilt with this exact formula, using one unsmoothed point every 6 hours.
  • The 24-hour change compares the current value with the snapshot from about 24 hours earlier.

5. Map and hotspots

  • Each country with recent relevant reporting is shown as a circle. Colour is the confidence-weighted average severity of its escalation items (1–3 Low, 4–5 Elevated, 6–7 High, 8–10 Critical; green if only de-escalation is reported). Size reflects aggregate impact (sum of severity × confidence): small below 6, medium below 18, large otherwise.
  • Hotspot score per region = decayed sum of escalation severity × confidence over 72 hours, shown on a 0–100 scale as 100 × (1 − e^(−score / 40)). The top 5 regions receive a soft halo on the map.

6. Limitations and bias

  • Relative scale: news flow is ranked against the past 12 months. If the whole year was tense, a "typical" reading already reflects a tense world; the structural component partly corrects for this.
  • Sampling: GDELT history uses four 15-minute samples per day, not every event. Day-to-day values are noisy and daily, not hourly.
  • Machine coding: GDELT events are coded automatically and include errors and duplicates.
  • Annual conflict data: UCDP data is published once a year, so the structural component changes slowly and lags new wars.
  • Media coverage bias: outlets cover some regions and conflicts far more than others. Under-reported crises appear smaller than they are.
  • Language bias: we only process English-language reporting.
  • Model errors: AI classification can misjudge relevance, direction, severity or the countries involved, and summaries may occasionally be imprecise. Always read the original article.
  • Availability: a source outage or rate limit can temporarily reduce coverage.

Changelog

  • 6 November 2026, version 2: replaced the constant 20% baseline with a computed UCDP structural component (38%) and a floor; added a 14-day component next to the 72-hour one; capped de-escalation at 40% (it was 60%, uncapped); replaced fixed saturation with percentile calibration against 12 months of GDELT event history; broadened relevance to significant armed conflicts; lowered the confidence threshold from 0.55 to 0.50; rebuilt the chart history with the new formula.
  • Version 1: a 72-hour news sum with saturation, plus a 20% constant baseline.

7. Reporting errors

If you see a misclassified item, a broken link or a factual problem, please write to [CONTACT EMAIL] with the headline and the issue, or use the contact page. We review every report and refine the method over time.