Narrative Index: Ukraine and Russia

How strongly world news coverage claimed each side was gaining, day by day since the invasion, from a sample of up to 1,200 headlines a day. This measures what the press asserted, not what happened on the ground.

Showing
Averaged over
June 2025 gap
Hover the chart for figures. Click a point to open that day.

All charts

Every chart uses the date range selected above, so changing the range changes all of them together. Tick any two and press Compare to overlay them on a shared axis.

Tick two charts to compare them.

Method

Everything here is reproducible. The code, the rubric and the data are public.

Where the headlines come from

Up to 1,200 headlines a day are drawn from GDELT's Global Knowledge Graph, restricted to coverage naming both countries under an armed-conflict theme. Duplicates are removed and no domain may contribute more than three, so a wire story running in forty local papers cannot dominate a day.

About 24 percent make a scoreable claim. The rest are diplomacy, aid, refugee coverage, market reaction, or activity with no stated outcome.

How each headline is scored

Each headline is read at temperature zero against a fixed rubric, in its original language, and returns six fields: whether it makes a specific claim about either side's position, how strongly it shows Ukraine gaining, how strongly it shows Russia gaining, what kind of claim it is, and whether it comes from the publication itself, a belligerent, or an independent analyst.

Four of the five kinds count toward the index: territory, position, strike and attrition. Each describes something that happened. The fifth, capability, describes what a side holds rather than what changed, and equipment destroyed is already counted as attrition, so in practice it measures deliveries. Ukraine receives most of the aid, which left a standing lean under its line. It has its own chart below.

Excluding it costs a third of the scoreable headlines. In return, agreement with the ground-only measure rises from 0.61 to 0.75, and the months where the index pointed opposite to who was taking ground fall from 11 of 49 to 3.

The two scores are independent

They do not sum to 100. Both low means nothing is happening; both moderate means both sides are being ground down. A deadlocked front reads differently depending on why, which a single needle could not express.

Outcomes, not activity

Attacking is not gaining. An assault with no stated result is not evidence the attacker is succeeding, because captures get reported when they happen. Without this rule the index would measure who holds the initiative rather than who is succeeding, and one side attacks far more often than the other.

Stasis scores for whoever was not attacking

If a named attacker gained nothing, that is the attacker's failure and the defender's success. This applies symmetrically: a stalled Ukrainian counteroffensive scores for Russia. Where no attacker is identifiable, the day scores low on both.

How it was validated

Against real events in both directions: the Kharkiv counteroffensive of September 2022 and the Kursk incursion of August 2024 register for Ukraine, the fall of Avdiivka in February 2024 and the Kharkiv-axis offensive of May 2024 for Russia. Scoring was also checked against real multilingual headlines from the dataset itself, not examples written for the test.

Version

Scores carry the model version and a hash of the rubric that produced them. Change the rubric and older scores stop being comparable, so the pipeline refuses to write against a changed rubric rather than mixing the two, and the series is recomputed instead.

This series was scored by gemini-3.5-flash-lite at temperature 0, sampling up to 1,200 headlines a day, capped at 3 per domain. 1,650 days carry a score, from 2022-02-24 to 2026-09-17. Backfill last written 2026-09-18.

Data and downloads

One row per period. Both scores, the headline count behind each point, and the composition by claim type and source.

Download

Covers the date range currently selected.

Embed this chart

Keeps the range and view you have selected.


  

Selected periods

PeriodUkraineRussia DiffHeadlines

Limitations

Stated here rather than in a footnote, because each one changes how the chart should be read.

  • Headlines only, not article bodies. Headlines exist to compress a claim into one line, which suits this measurement, but they drop the hedging that appears in the text below.
  • Story prominence counts as well as claim strength. A wire story running in twelve languages contributes twelve times. Arguably a story covered everywhere should matter more, but you should know that is happening.
  • The source pool has shifted over time. Russian-language coverage ran at about 26 percent of the sample before the invasion and about 20 percent from 2023 onward. Any comparison across that break is partly about media access, not the war.
  • Scores are coarse. The classifier resolves to roughly five levels per side. Day-to-day moves of a few points are quantisation, not signal.
  • Successful defence is partly invisible. A headline cannot report a non-event. Nobody writes that a city was not captured today.
  • Raw levels are not comparable between the two lines. Strike coverage appears almost every day and gives Russia's line a floor. Use Difference or Vs normal for any comparison between the two.
  • Seventeen days in June 2025 are missing, permanently. GDELT suspended collection from 15 June to 1 July 2025 during an infrastructure outage on its own hosting. No data was gathered, so none exists to recover, from GDELT's archive or anywhere else. The chart breaks across those dates rather than joining them, and a smoothing window will not average over them. Switch the estimate on with the control above the chart to see a straight line drawn between the two edges: it is a guess, drawn dashed so it cannot be mistaken for a reading, and it is never included in the figures, the table or the download.
  • Supply is tracked separately, and that is a judgement. Weapons arriving are kept out of the headline index because a missile that has not been fired has changed nothing, but they plainly matter to what happens next. The chart below carries them on their own, and anyone who thinks they belong in the main number can add them back from the download.
  • It measures claims, not truth. A false claim widely reported moves the index. That is the point of the source filter, not a flaw to be corrected away.

Send a suggestion

Corrections, missing events and methodology objections are all welcome. Or write to directly.

Most useful things to send

  • A day whose score looks wrong, with the date and what you think the coverage actually said. Readers find classifier errors before I do.
  • An event missing from the timeline, with a date.
  • A case the rubric handles badly. Those have driven every revision so far.

Goes straight to an inbox. Nothing is stored on this site.