
Every year, Moscow's full-scale war against Ukraine spreads further into Russia itself: drone strikes are becoming more frequent, and are reaching ever more regions. Novaya Gazeta Europe has created a map of attacks on Russian territory since the beginning of 2022. It updates every 15 minutes and can be used to track attacks in real time.
Our algorithm aggregates posts from over 700 Telegram channels and uses AI to identify military incidents among them. Most incidents on the map involve Ukrainian attacks, though we also include other events, such as cases where Russia has accidentally struck its own territory.
Each incident shown on the map is based on at least two reports about the same event (such as a drone attack), published within 24 hours of each other and referencing the same location. For more on our methodology, see the expandable section below.
The goal of our map is to provide a broad picture of military incidents on Russian territory. Complete accuracy is not possible: our AI system makes mistakes (errors appear in roughly five percent of descriptions and locations), and we cannot verify everything reported in the news. The map also contains some duplicate entries (also around five percent).
We recommend independently verifying any information you find on the map. Errors can be reported using the button inside each incident card.
Key findings:
Broadly speaking, our algorithm works like this:
-We continuously pull posts from more than 700 Telegram channels, including Russian opposition, pro-government, and regional outlets, as well as channels run by Russian regional governors, state agencies, and Ukrainian media.
-Each post is reviewed by AI, which determines whether it describes a military incident, and if it does, extracts the incident type and location.
-Posts describing the same event at the same location are grouped together and counted as a single incident.
Military incidents are detected using a language model. In the first stage, the model assesses whether a post describes a specific military event that has occurred on Russian territory or in annexed Crimea (other occupied territories are not included). Only direct combat actions qualify: drone strikes with confirmed impact, missile strikes, air defence interceptions, artillery shelling, airstrikes, ground operations, and naval attacks. Air raid alerts without consequences, threat warnings, and similar posts are excluded.
In the second stage, the same model extracts structured information: the precise location, region, incident category, and a short description. Where a single post mentions multiple locations or types of attack, these are recorded as separate events.
We capture locations as precisely as the source allows. If a post names only a city, all drone attack reports from that city on that day are treated as one incident. If specific districts are mentioned, each is marked separately on the map.
The model then checks each identified event for accuracy, confirming that the incident category and region are genuinely supported by the source text, and establishing when the event took place.
Events reported more than a day before a post’s publication date are discarded. We screen for this using keyword detection (“a week ago”, “last month”, etc.) as well as the Gemini language model.
Once military incidents have been identified, a separate deduplication algorithm merges posts describing the same event. Two posts are treated as describing the same incident if they share the same incident type and location, and were published within 24 hours of each other.
Where both posts include a specific location, we verify proximity using the Google Maps API — locations are considered identical if they fall within three kilometres of each other — and also compare place name similarity. Spelling variants such as “Shebekino” and “Shchebekino” are treated as the same place even if the API returns different coordinates.
Where a post gives only a region rather than a specific location, we compare event description embeddings — vector representations generated via the OpenAI API. Posts with sufficiently similar embeddings are treated as describing the same event.
Despite this multi-layered deduplication process, some duplicates remain. We manually reviewed a sample of incidents from one week each in October 2024, October 2025, and January 2026. Across those periods, the algorithm identified 806 events after deduplication; manual review confirmed that 95% were genuine unique incidents. We also found that around 5% of events contained errors in their description or location; these, too, could not be eliminated entirely.