216,050 news articles, open for research
Every news article from nine of Serbia’s most-read outlets over six months, verifiable without sharing a single copied text, and 43,611 of them about the canopy collapse and the movement that followed, with measured accuracy.
The problem with single-story datasets
Researchers studying media coverage of an event usually start with keywords: collect every article that mentions “protest” or “blockade” and analyze those. It’s fast, but you never see what you missed. An article about the prime minister’s resignation that uses none of your words simply isn’t in your set. And outlets don’t describe the same event in the same words, so the misses don’t hit all outlets equally.
The second problem is text. Articles belong to the outlets, so a dataset that copies them can’t legally be shared, and a dataset that can’t be shared can’t be checked.
So Ana Fotev Nikolić, Ognjen Drča and I built something different: an index of all news from nine outlets in the six months after the railway station canopy in Novi Sad collapsed on 1 November 2024, causing the death of sixteen people, plus a layer on top that flags the articles about the collapse and the movement, with a measure of how accurate that flagging is.
What’s in it
For each article the dataset stores the URL, outlet, publish and fetch time, how it was found, and a hash of the text. Not the text itself. Anyone can fetch the article, extract the text with the same code and compare hashes: same hash, same text.
Outlets were picked by a mechanical rule fixed before the first fetch: the three most-read in each group (dailies, TV, online) per the Reuters Institute Digital News Report 2026. Kurir, Mondo and RTV qualified but forbid automated fetching, so they’re out, and that’s documented as a limitation.
How it was built
Lexicon. An article is a candidate if it uses terms tied to the collapse or the movement, including the terms each side uses (”students in blockade” and the pejorative “blokaderi” alike), so neither side is systematically missed.
Semantic similarity. Embeddings score how close each article is in meaning to articles about the story. This step alone found 7,262 relevant articles that use no lexicon term.
Classifier. Claude Sonnet 5.5 reads the candidates and decides by the same written codebook we used by hand: an article counts if its headline or at least one full paragraph is about the collapse, the movement’s actions, responses to it, or political consequences the article itself links to them.
This is the knowledge layer at its most literal: everything analyzed later depends on which articles made it into the set.
How accurate it is, and how we know
We hand-coded 300 articles blind to the model’s decision and to the outlet. All three of us coded 50 of them to measure agreement.

So it finds almost everything and over-includes a little: about one in seven flagged articles we judged off-story, usually a protest report that never says the protest is part of the movement.
Why trust the sample? Nobody could have rigged it. We published and timestamped the drawing rules before the random number existed; the number came from a public randomness beacon (drand, League of Entropy) at a pre-announced time, with the timestamp anchored in Bitcoin an hour earlier. Anyone can rerun the draw and get the same 300 articles.
Limits. RTS is the least complete outlet (absent from general archives); over-inclusion varies by outlet, so read per-outlet counts with per-outlet precision; the “movement actions” subtopic was the hardest to call, for us too. Per-outlet figures and error analysis are in the repo.
Cost / time / setup:

Download, cite, use
Files on Zenodo (permanent, with DOI) and GitHub: index.parquet, scope.parquet (story layer), coverage.parquet (completeness per outlet and day), validation.json (all accuracy measures). Readable in pandas, R (arrow) or DuckDB.
Texts. canopy-news hydrate fetches the articles from the outlets’ sites, slowly and politely, and checks each hash. Keep the copy for your own research; the texts belong to the outlets.
Citation. Nikolić, R., Fotev Nikolić, A., & Drča, O. (2026). canopy-collapse-news-2024-2025 [Data set]. Zenodo. https://doi.org/10.5281/zenodo.23260972
Who it’s for: sociologists (how the movement’s repertoire of blockades, assemblies and marches appeared in the media), communication scholars (attention cycles, framing across outlets), political scientists (institutional responses, the government’s fall and re-formation, counter-mobilization, all dated), NLP researchers (a rare validated Serbian corpus in Cyrillic and Latin, 300 human labels and 60,279 model decisions), and data engineers (a dataset verifiable without sharing content). Use it for anything; if you publish with it, let me know.
What’s next
This dataset is the test bed for the finale of my series on how AI agents store and update what they know.
On top of it I’m currently building an agentic knowledge layer and then asking it the hard questions. Across six months the public figures in this story shifted position, contradicted each other and contradicted themselves, all of it on the record in nine outlets. Can an agent keep track of who said what, when, and what they said instead three months later?
Knowing a fact is easy. Knowing that a fact was superseded, and by whom and when, is the part that breaks.
Stay tuned.
The knowledge layer series:
Article 1 — Your agent’s problem isn’t the model, it’s the knowledge layer
Article 2 — Naive RAG: the baseline you’ll always benchmark against
Article 3 — Advanced RAG: what you actually run in production
Article 4 — GraphRAG and friends: when entities and relationships beat similarity
Article 5 — Agentic RAG: when retrieval becomes a decision, not a pipeline
Article 6 — Vector vs graph vs episodic: a tour of agent memory systems
Article 7 — Context engineering: the discipline that replaces prompt engineering
Article 8 — Knowledge editing and why it isn’t the answer for enterprise updates
Article 9 — Evaluation: how do you know your agent setup is working?
Novi Sad Canopy Collapse: Open Media Corpus Dataset (BONUS)
Article 10 — Choosing your knowledge layer: a practical enterprise selection guide (coming soon)



