Every morning at 05:00 UTC, OSNT.IN publishes one brief on the Russia-Ukraine war, written in English from Ukrainian, Russian and Western open sources. Each statement in it says who said it, and under each statement sits the material it rests on. This post explains what that promise covers, what it does not cover, and how to use it.
What attribution means here
Attribution means the brief tells you who made a claim, not only what the claim was. "Russia fired 21 ballistic missiles at Kyiv in three waves, per Zelensky" is an attributed line. "Russia fired 21 ballistic missiles at Kyiv" is not, and our rules do not allow it.
Three rules sit under every brief, and they are published on the methodology page:
- Every claim names its source.
- Civilian harm is attributed to the source that reported it. A casualty figure is always a named source's figure.
- A contested claim is labelled as a claim. Russian official statements are presented as claims, never as fact.
What attribution does not mean is that we checked the claim against the world. OSNT.IN does not send anyone to a strike site, does not confirm casualty figures, and does not rule on which account is true. Each public brief opens with that sentence: it reports who said what, with links, and does not rule on which claim is true. The brief is a map of the record. Checking a claim against its primary source stays with the reader, and the links are there so the reader can do it.
What you see under a statement
Under each development and each side's account, the brief lists the posts and articles behind it. Each entry shows:
- the outlet or channel;
- a label for what kind of source it is, such as Ukrainian official, Ukrainian media, Russian state media, Russian milblogger, independent Russian media or international media;
- the time of publication in UTC;
- a link to the original.
A label says what a source is. It does not say how far to trust it. We do not grade outlets, and quality words like "premium" were taken out of the product in v0.7.0-beta.
Posts in Ukrainian or Russian carry an English line marked "OSNT machine translation". It is a translation of the post, made once per version of the post, not a summary of it.
Some entries carry a mark:
- relays: the post passes on someone else's report, for example "according to monitoring channels". The mark is detected from the original wording, and detection misses some cases.
- edited: the post changed after we first collected it.
- deleted: the post was gone when we checked again. We record that it was gone, not why.
For Telegram we keep the text, the time of posting, the time we collected it, and each version we saw, so the brief can show what a channel said even after the channel changes it. More in our post on Telegram sources.
When the chain of sources has a gap
Two marks tell you where our chain of sources stops.
origin not linked appears when a statement names a speaker, such as a president or a ministry, and none of the linked posts is that speaker's own channel or site. In the 23 October brief (opens in a new tab), Zelensky's figures on the Kyiv strike appear under two Ukrainian outlets that reported his statement, and the line carries this mark. It points to a gap in our links. It is not doubt about the claim.
no source linked appears when a statement has no valid link to the day's material. Automated checks remove any link to an item that was not in the day's collection. If every link under a statement is removed, the statement stays in the brief with this mark, rather than looking sourced when it is not.
How each side told it
Each brief has a section that sets out how four sides presented the day: Ukrainian officials, Russian officials, international sources and independent Russian media. Independent Russian outlets such as Meduza are their own side and are never counted as the Russian side.
The section reports what each side said, each line with the posts behind it. It does not say which side is right, it does not treat every side as equally reliable on every question, and it does not split the difference between two figures. When Ukrainian and Russian sources disagree on a fact, the brief shows both, each with its source. How we tell reporting from framing is in our post on cross-language narrative tracking.
How corrections are dated and shown
A model drafts the brief each morning under these rules, and the brief is read every morning after publication. When we find an error, we correct the published brief, usually the same morning.
How a correction is shown depends on what was corrected:
- Daily briefs are corrected on the brief itself. Anyone who opens the brief after the correction sees the corrected version. Anyone who read it before saw the earlier one. Social posts go out at 08:30 UTC, so a correction made before then reaches them, and a later one does not. If a brief has a blocking problem the checks did not resolve, its social posts are held until it is released by hand.
- Weekly reports are listed on the corrections page, newest first. Each entry gives the date the correction was made, links to the corrected report and says in one line what changed, for example that a strike was moved to the week it belongs to.
- Changes to our method or our own earlier claims about the product go into the changelog. When we reclassified a narrative in September 2026 because its material did not pass our own membership rule, we said so there and on the methodology page.
The weak point is plain: a daily brief is public from 05:00 UTC, before it is read, and no check stops it from being published. We name that on the methodology page rather than leave it out.
Why we work this way
A brief that states facts asks you to trust its author. A brief that names sources lets you check its author. We chose the second because it is the one that survives being wrong: when a line is mistaken, you can see where it came from, and so can we. How the daily cycle runs from collection to publication is in our post on how the brief is built.
If you think a line in a brief misattributes a claim, write to contact@osnt.in with the date and the line. That is the kind of error our method is built to expose.


