Project

Iran Escalation Dashboard

A public tracker of military and diplomatic actions involving Iran, built from English-language news coverage. Each article is scored against a fixed rubric and then clustered into an event with its media links; the escalation index takes the median of per-article scores across five conflict axes.

Methodology

Every in-scope article receives its own score on a 0–10 ladder that spans routine diplomacy to existential escalation. The headline index per conflict axis is the unweighted median of article scores in a trailing seven-day window. It resists single-outlet spikes, weights no outlet more than another, and breaks down cleanly by outlet.

  1. Ingestion

    01RSS ingestion

    Fetch articles from feeds & licensed APIs.

  2. 02Data preprocessing

    Canonical article per story, routed to one of six conflict axes.

  3. Scoring

    03LLM scoring (local model)

    Per-article score on the 0–10 rubric ladder.

  4. Aggregation

    04Per-axis median

    Unweighted 7-day median + corroboration count.

  5. 05Postgres · index_points

    Daily point per axis (value, momentum, n).

  6. Publishing

    06Static JSON export

    /api/index.json on every pipeline run.

  7. 07Finished Dashboard

    Client-fetched charts + data tables.

The pipeline in seven steps — from raw feeds to the published index.

Current state (October 2026): the corpus is single-outlet. Only The Guardian — via its licensed Open Platform API — feeds the dashboard while other outlets are paused pending feed and permission changes, so index, corroboration and event views currently reflect one outlet.

Sources are typed by sourcing, not nationality: independent (weight 1.0) versus official relay (weight 0.5). Military claims from any party's official channels, whether IDF, IRGC, MoD, or intelligence services, are unverified by default until independently corroborated; an IDF-sourced Israeli outlet and an IRGC-sourced Iranian outlet are treated identically. A secondary corroboration indicator (mean of source weight × claim coefficient) sits next to each index value. A high median with low corroboration means the conflict is hot but claims are thin or one-sided.

Scores carry model name and rubric version; any change triggers an explicit, logged re-score rather than silent drift. No full article text is stored long-term: each source runs under a documented ingest mode (full body, excerpts only, or metadata only), Guardian content arrives via its official Open Platform API with a 24-hour retention cap, and a documented takedown procedure covers removal requests.

The scoring ladder (rubric v1)

ScoreBand
0No Iran-related military or diplomatic action (excluded)
1Routine diplomacy
2Diplomatic friction
3Significant diplomatic act
4Military posturing
5Indirect / proxy engagement
6Limited direct action
7Retaliation cycle
8Sustained campaign
9Major escalation
10Existential / great-power

The score reflects the highest action stated as fact in an article. Rumors and speculation score one band lower and are marked unverified.

Data view · /api/index

Escalation index by axis

Median of per-article scores (0–10) in a trailing 7-day window. Momentum compares the current value with one week earlier; corroboration is the mean source-weight × claim-coefficient in the same window. Select an axis card to open its full history with adjustable time range.

Data view · /api/events

Events

Incidents clustered from coverage, newest first. Each event aggregates its reporting articles and media links (links only; no media bytes are stored).

Data view · /api/sources

Per-outlet comparison

Under maintenance.

Per-outlet comparison is paused while only one outlet — The Guardian, via its Open Platform API — feeds the dashboard. It resumes when other outlets' feeds and permissions are re-enabled.


Each view fetches one of three typed JSON endpoints: /api/index,/api/events, and /api/sources. Their contracts mirror the Postgres tables index_points, events (with member articles and media), and sources + source_stats_daily. The pipeline exports them as static JSON on every run (workers/pipeline/src/export-site.js), so the deploy stays fully static. Guardian headlines and excerpts are provided via The Guardian Open Platform (attribution per its terms of use); as of September 2026 all other outlets are paused pending feed and permission changes, and when re-enabled will be ingested under their respective feed, robots.txt, and permission policies. No full article text is displayed or stored long-term. Scores, summaries, and the escalation index are LLM-assisted analysis of public reporting; they are not official information and not a forecast.

The Guardian Open Platform