The chart shows monthly gains for both sides — Russian gains (up) and Ukrainian liberations (down) separately, not just the net of the two. It is calculated based on the data, mapped by Deepstate Map.
The data starts from January 2023, as 2022 mapping data was more inconsistent. It also focuses on the war of attrition stage of the Russian full-scale invasion. For a full picture of territorial change since 2022, check this chart.
After the Ukrainian counter-offensive in 2023, Russia's gains have run far ahead of Ukraine's liberations, peaking in November 2024 at 731 km². Since Autumn 2025, Ukraine has started to conduct localized counter-attacks, liberating a few tens of km² per month, while in net terms still losing territory.
Scope is territory inside Ukraine's internationally recognised borders. Crimea and the pre-2022 LPR/DPR footprint are excluded so the series isolates post-2022 movement; Ukraine's 2024 Kursk incursion (Ukrainian-held Russian territory) is a separate ledger and is excluded entirely.
What it shows — DeepState is a Ukrainian OSINT project publishing an interactive map of the Russo-Ukrainian war, updated daily. The map distinguishes occupied, liberated, and contested (grey-zone) territory.
What it's based on — The territorial control depicted on the map is based on geolocated footage, open-source reports, community submissions, and direct communication with Ukrainian units.
Who's behind it — It is created and maintained by NGO DeepstateUA, which has employees and a volunteer team of over 100 people. The founders of the project are Roman Pohorilyi and Ruslan Mykula.
Alignment to the sides of the war — Throughout the full-scale war, DeepState positions itself as a fact-based project. The map has partnerships with the Ukrainian Ministry of Defence and General Staff, and the project also has a closed map solution for the Ukrainian defence forces. DeepState has publicly stated that during Ukrainian offensive operations, it delays map updates for operational-security reasons. Yet it has contradicted the official position of the General Staff and spoken out publicly about Russian advances that the General Staff hadn't communicated prior.
General data risks and usefulness — The map data — like any source heavily based on OSINT — tends to be a lagging indicator.
01SnapshotFor each completed calendar month, take the month-end snapshot — DeepState's last map of that month — and fetch its full GeoJSON polygon, not just a headline number. The raw daily map isn't kept; only the cleaned monthly polygon is stored, as the record of the exact geometry this chart was built from.
02CleanNormalise the raw snapshot into a tidy table: validate the geometry, deduplicate, and key each polygon to its month-end snapshot and capture time.
03Compare two monthsCompare each month-end map against the previous month’s: area newly inside the occupied zone = taken by Russia, area no longer inside = liberated by Ukraine. Areas are geodesic km², which vary roughly 0.06% from DeepState’s own summary figures.
04Exclude baselineWork from the post-24 Feb 2022 occupied zone only — Crimea and the pre-2022 LPR/DPR footprint are excluded so the series shows only what is moving. Ukraine’s 2024 Kursk incursion and other territory outside Ukraine’s borders are dropped.
05Round & publishRound to a sensible precision, write a one-row-per-period view, and refresh the Datawrapper chart.
No editorial changes logged yet. Last updated 2026-06-30.
Data updates · last 5
Per-day values aren’t mirrored here yet. The full series is available as a CSV.
Data dictionary
Columns in the downloadable CSV — the exact output of this chart’s processed view. Periods without a usable upstream snapshot are absent rows, never interpolated or carried forward.
Column
Type
Unit / format
Description
month
text
YYYY-MM
Calendar month, keyed to the month-end snapshot. Series starts Jan 2023 (Jan 2023 still diffs against its Dec 2022 predecessor); the 2022 mobile-war months are excluded.
gained_km2
number
km²
Territory Russia newly occupied this month — area inside this month-end’s occupied zone but not last month’s. Positive; plots up. Geodesic km² (WGS84).
lost_km2
number
km²
Territory Ukraine retook this month. Emitted negative so the chart diverges downward; the area liberated is |lost_km2|. gained_km2 + lost_km2 = the month’s net change.
These columns are the exact output of this chart’s database view, verified against the published CSV. DeepState publishes its own terminology for the raw map — where they differ, their definitions are authoritative for the upstream data.
Reuse this work
You’re free to
Republish the chart on your own site, in print, in a paper.
Restyle the chart — change colours, fonts, layout.
Remix the data with other sources to build something new.
Use the chart commercially. <mark>Make sure you check the terms of primary data source — {source} publishes under its own terms.</mark>
The only ask
Credit the original source (DeepState) and the processed dataset (this site).
Link back to this page when republishing online.
Don’t imply DeepState or this site endorses your republication.
All charts and processed datasets on this site are released under Creative Commons Attribution 4.0 (CC-BY 4.0). The underlying source data is licensed by its respective provider — DeepState publishes under its own terms.
Citations
Please cite both this processed dataset and, most importantly, the original DeepState source. The DeepState's work should be recognised. Two-part citations look like this:
In-text
P. Krasnomovets (2026)
Full citation
P. Krasnomovets (2026). "How many km² does Russia capture and Ukraine liberate each month." Processed from DeepState Map. Retrieved from https://visua.no/en/charts/deepstate-gross-flows/
BibTeX
@misc{krasnomovets2026deepstategrossflows,
author = {Krasnomovets, P.},
title = {How many km² does Russia capture and Ukraine liberate each month},
year = {2026},
source = {DeepState Map},
url = {https://visua.no/en/charts/deepstate-gross-flows/}
}
Download
Everything used to produce this chart. The CSV and PNG come straight from Datawrapper; the processed series and source data are linked from the pipeline repository.
<iframe title="How many km² does Russia capture and Ukraine liberate each month" aria-label="Bar chart" id="datawrapper-chart-vXMnF" src="https://datawrapper.dwcdn.net/vXMnF/" scrolling="no" frameborder="0" loading="lazy" style="width: 0; min-width: 100% !important; border: none;" height="400" data-external="1"></iframe>
Use the unversioned dwcdn.net/vXMnF/ path — the daily refresh always serves the latest version. Full snippet from Datawrapper →
For scripts & agents
Every chart is built to have .csv and .meta.json siblings at a stable URL — no auth, no rate limits for reasonable use. Pages are plain HTML, so the methodology above is readable without JavaScript.
Dataset (CSV)
https://visua.no/data/deepstate-gross-flows.csv
Latest full series. Stable URL — re-fetch daily, content updates in place.
Schema, source, processing steps, key points, license. Machine-readable version of this page.
Site index for agents
https://visua.no/llms.txt
Plain-text index of every chart, dataset URL, and methodology page on the site.
Questions, corrections, source ideas
Using this chart in a story or a paper and something’s unclear? Spotted an error? Know a data source worth tracking? I read (almost) everything — usually same-day.