Russia's War Against Ukraine Skip to dashboard

Russia's war against UkraineBETA

tinyurl.com/ukrainedashboard · daily figures ↓

Daily figures
Report published —
Activity covered —
Time in Kyiv —
Weather at the front Open-Meteo —
Loading data…

What stands out

Yesterday's figures against each category's own history.

Headline figures

Yesterday in detail

Compared with each figure's trailing 7-day average.

Casualties of Russian affiliated forces

GSUA
Reported yesterday —

Casualties per day

—

Combat activity

GSUA

Preliminary figures for today appear here after the 22:00 Kyiv evening report.

Combat engagements per day

—

Equipment per day

GSUA
—

All equipment per day, by type

—
DronesLand-basedOther (aircraft, ships, missiles)

Russian air attacks overnight

GSUA
Intercepted or suppressed—

Drone interception rate

—

Locations hit or affected by debris

—

Independently confirmed

Third party

Russian strikes

GSUA

Ukrainian strikes

GSUA

Russian equipment losses

Sorted by how unusual yesterday was for each category. Click any column to re-sort.

GSUA
Russian equipment losses by item
Item Record Latest day vs day before 7-day avg Latest vs avg Last 7 days vs previous 7 Daily record Since invasion

Page image

The dashboard page as an image

Share

What stands out

Area change

ISWDeepState

Details

Key targets hit

GSUA

Contact

Questions, corrections or suggestions about the dashboard are welcome. Send me a message on social media:

Guide to the figures

Record — top-10 days

Every daily figure is ranked against every other day of the war for that same category. A tank figure is only ever compared with other tank figures, so a small absolute number can still be historically high.

★ Record
The highest single day ever recorded for that category, or a match of it.
Top 10
Among the ten highest days of the war for that category.
#38
Inside the top fifty — worth noticing, but not remarkable.
#412
An ordinary day by that category's standards.

The Record column only shows a badge when the latest day is among the ten highest of the whole war, or among the ten highest of the current year (outlined badge). Gold never carries direction. Green and red carry direction only.

Key targets hit

The headlines of the General Staff's “Уражено …” (“Hit: …”) posts about Ukrainian strikes, mostly deep strikes inside Russia and occupied territory, translated to English and sorted into categories such as oil and fuel, defence industry, radars or drone sites. The date is the day of the post; the strikes themselves are usually from the night before. A headline can name several targets, so it can carry several categories. Click the box for the list of recent days, filter by category, and follow each item to the original post.

Where the data comes from

A filled badge — GSUA — marks figures reported by the General Staff of Ukraine's Armed Forces. These are Ukrainian claims and are not independently verified. A dashed badge — Oryx — marks a third party, and those cards carry a dashed border. Third-party counts are slower and far more conservative, which is why the two are never mixed in one figure.

What the columns mean

Latest day
The most recent daily figure, covering the activity date in the ribbon above.
vs day before
Absolute change against the preceding daily figure.
7-day avg
Mean of the seven most recent daily figures.
Latest vs avg
How far the most recent day sits above or below that average.
Last 7 days
Sum of the seven most recent daily figures.
vs previous 7
Percentage change against the seven days before those.
Daily record
The highest single-day figure ever recorded for that item.
Since invasion
Cumulative total reported since 24 February 2022.

Timestamps

The report date is when this page was compiled. The activity date is the day the General Staff figures cover. The time shown beside the weather is when the weather itself was retrieved from Open-Meteo by script — it says nothing about when the casualty figures were published.

Caveats

Casualties count killed and wounded together; the estimated-deaths line applies a fixed share derived from released data. Equipment figures are field reports, which run well ahead of the visually confirmed counts — both are shown so the gap stays visible.

Where the page gets its data

Three transports, tried in the order listed in CONFIG.sources. The first that answers wins, and the snapshot baked into this file is the last resort, so the page never renders empty.

data.json
A static file published beside this page every morning. It is built from the spreadsheets by the Ukraine dashboard auto-update Apps Script. The spreadsheets stay entirely private — their IDs never appear here. Recommended.
Published CSV
Sheets → File → Share → Publish to web, one tab at a time, format CSV. Only the tabs you tick become public and the document stays unshared. Paste each URL into CONFIG.csv.
gviz
The legacy path. It needs the whole document shared as “anyone with the link”, which exposes every tab in it, not just the five the page reads. Leave spreadsheetId empty to disable.

The shape of the data

Column order never matters — headers are matched by name, case and punctuation ignored.

meta       key | value
           keys: reportdate, activitydate, activityiso,
                 weatherupdated, areaasof, weather (JSON)
headline   id | label | value | unit | dec | exact | delta | deltaUnit
           | deltaLabel | invert | note | source | lead | goodNote
metrics    id | group | label | sublabel | value | unit | dec
           | delta | deltaUnit | deltaLabel | invert | plain
equipment  id | label | sublabel | record | recordNote | rank
           | total | day | chgDay | last7 | chg7 | avg7 | vsAvg | aggregate
series     date | troops | equipment | <item id> ...
           one extra column per equipment id (uav, tank, arty …)
           feeds the category picker on the equipment chart

rank is the position of that day's figure among all daily figures for that category, 1 being the all-time high. Leave it blank and the badge falls back to the record comparison. source takes gsua or a third-party name such as ISW.

A data.json file carries the same information already assembled, plus a generated timestamp that the status line shows. Anything it leaves out keeps the snapshot's value, so a partial file is safe to publish.

Key targets map

GSUA
Located settlement (size = number of hits)
Approximate location
Russian-occupied Ukraine
Loading the map…
How the places were found
  • Each “Уражено” post is read in full, and every target is placed at the settlement, facility or region the post names. Dates are when the post appeared; the strikes are usually from the night before. These are Ukrainian claims, not independently verified.
  • Located: the settlement was found in the GeoNames gazetteer inside the region the post names.
  • Approximate (dashed ring): a town, refinery or airfield placed from general knowledge, or a small village that is not in the gazetteer or shares its name with others nearby. These can be off by several kilometres, small villages by more.
  • Ships at sea and targets with no place named are listed but not drawn. Occupied area: DeepStateMap, .

Russian activity map

GSUA
Combat engagements per day
Place named in the reports (size = days named)
Approximate location
Russian-occupied Ukraine
Loading the map…

Locations are approximate. Places are matched by name from the General Staff reports, so a village that shares its name with another can end up in the wrong spot, and dashed rings can be several kilometres off.

How the map is made
  • Each morning General Staff report (08:00 Kyiv) is read in full. Every place it names is put on the map with its front direction and the kind of activity. Dates are the day of the fighting, the day before the report.
  • Attack counts per direction are the numbers stated in the reports. Air strikes and shelling are mostly the Sumy and Chernihiv border areas, which the reports list separately.
  • Located places were matched to the GeoNames gazetteer near the expected spot on that direction. Approximate places (dashed ring) were placed from general knowledge, usually because several villages share the name, and can be off by several kilometres.
  • Occupied area: DeepStateMap, .

Beyond the battlefield

Civilian casualties

UN HRMMURussian authorities