Method

How the World Feed works

The full method behind the VERITATEM World Feed — what it reads, how it decides two headlines describe the same event, what it refuses to show, and where it fails.

The World Feed is a machine. It reads the same fixed list of news sources several times a day, groups headlines that describe the same event, and publishes the groups that several independent outlets are covering. No person selects the stories. No person writes the words.

This page is the whole method. If it isn’t described here, the feed doesn’t do it.

What problem this is meant to solve

Most feeds are optimised for engagement, and engagement rewards whatever provokes. A story arrives because it performs, or because someone paid for it to arrive, and you have no way to see which. The ranking is proprietary, the inputs are hidden, and the same URL shows different things to different people.

This feed inverts each of those properties:

  • The inputs are published — every outlet it reads is listed below.
  • The ranking is published — the exact rule is in this page.
  • The output is identical for everyone. No personalisation, no cookies, no account, no tracking. There is nothing to personalise with.
  • Every version is kept. Each run is committed to a public repository, so what the feed showed on a given day is a matter of record, not of memory.

The point is not that the machine has better judgement than an editor. It is that the machine’s judgement is inspectable, and an editor’s — or a platform’s — is not.

What it reads

Only material an outlet publishes for machines to read, from outlets on the source list — an RSS or Atom feed, or a news sitemap where robots.txt invites indexers to read one. It does not search the web, read social media, or follow links, and no article text ever enters the feed.

One narrow exception, added deliberately and described in full below: for the destination audit we fetch a single article page per outlet, occasionally, to record which third-party widgets that page loads. Nothing from those pages is stored or published beyond the vendor names.

For each item it keeps exactly three things: the headline, the link, and the timestamp. Article text, summaries, standfirsts, and images are discarded at the moment of parsing. We link to journalism; we do not reproduce it.

How it decides two headlines are the same story

  1. Tokenise. Each headline is reduced to its content words. Common words (says, after, new, report) are dropped. Accents are stripped, plurals folded, and a doubled final letter collapsed, so Zelenskyy and Zelensky, or Türkiye and Turkiye, compare as the same word.
  2. Weight by rarity. A word that appears in few headlines that day counts for more than one that appears in many. This is what makes the matching work: Ceuta is informative, talks is not.
  3. Weight proper nouns higher. A capitalised word in mid-headline — usually a person, place, or organisation — counts for 2.5× an ordinary word.
  4. Require a shared name. Two headlines must have at least one proper noun in common before they can be grouped at all. Without this rule, unrelated naval stories merged because they shared the word navy.
  5. Group. A headline joins the existing group it most resembles, if the weighted overlap is at least 0.28 on a 0–1 scale; otherwise it starts a new group. Only headlines published in the last 48 hours are considered.

What it refuses to publish

A group is discarded unless it is carried by:

  • at least 3 originating newsrooms, and
  • at least 2 of those that are not state-owned.

Newsrooms, not mastheads. Papers run wire-agency copy under their own banners. If three outlets all publish the same Reuters report, that is one newsroom reporting and three papers reprinting it — so where an outlet credits an agency, we count the agency, once. A story assembled entirely from one wire report does not clear the threshold no matter how many papers carried it, and each story shows how many mastheads collapsed into how many newsrooms.

We detect agency copy from the byline field the outlet publishes in its own feed. We deliberately ignore the RSS <source> element, because several outlets use it for the photographer’s credit — a France 24 story with a Reuters photograph is still France 24’s reporting, and counting it as syndication would erase a newsroom that genuinely corroborated the story.

This detection is imperfect in one direction we accept and one we don’t. Outlets that credit agencies inconsistently will have some syndicated copy counted as original — that overstates corroboration, and it is the failure mode we care about, so the rule errs toward collapsing. Outlets that credit an agency for a story they also reported themselves will be under-counted, which suppresses a story that deserved to publish. Given the choice, we would rather show you fewer stories than tell you three newsrooms confirmed something when one did.

This is the core of the design. A single outlet cannot put a story into this feed, however loudly it files. Neither can a government: state media can only ever appear alongside independent reporting of the same event, never as the reason a story appears.

The cost is real and we state it plainly: a true story that only one outlet has is invisible here. Scoops, single-source investigations, and stories from places with few outlets are exactly what this filter suppresses. The reporting section is where such stories belong; the feed is not a substitute for it. Each day’s page shows how many groups formed versus how many published, so you can see the size of what was filtered out.

How stories are ordered

By breadth of independent corroboration first: the number of non-state newsrooms carrying it, then the number of countries they are in, then the total newsroom count, then recency.

Deliberately not by article volume. Volume ranks the largest English-language newsrooms to the top of every list, which is a measure of newsroom size, not of significance.

How the words on the page are chosen

  • The story line is one of the member headlines — the one whose wording is closest to the centre of the group, i.e. the most typical phrasing of that event across the outlets covering it. It is attributed to the outlet that wrote it. It is not a summary, and no editor picks it.
  • Each link keeps its own outlet’s headline, verbatim. Only wire routing codes are removed — (2nd LD), UPDATE 1- and similar transmission metadata.
  • Link order within a story is scrambled deterministically, from a hash of the story and outlet identifiers. Being listed first is an advantage, so no outlet holds that position systematically. The order is stable for a given story, so the page doesn’t shuffle under you.
  • One link per originating newsroom, its first report. Outlets re-file a developing story many times, and several papers may run one agency’s copy; without this a single wire report would appear four times under four names and read as four accounts of an event. Where a link is agency copy it is labelled as such — Reuters via South China Morning Post.

The source list

The list lives in src/feed/sources.toml in the site repository, and every change to it is a reviewable commit. An outlet is only harvested if it meets all four inclusion rules:

  1. It employs original reporting staff — not an aggregator or commentary site.
  2. It publishes a corrections or complaints policy.
  3. Its feed terms permit linking out.
  4. It does not block automated access.

Outlets that fail on 4, or that offer no public feed at all, are still listed with the reason, so an absence is visible rather than silent. Every page of the feed carries a “What this feed cannot see” panel naming them.

Reuters is absent as a source, but visible as a byline. Its robots.txt disallows all automated access except to a named list of crawlers we are not on, and it advertises no sitemap to anyone else. We treat that as the refusal it plainly is, so we never fetch anything from Reuters. But Reuters copy reaches this feed constantly, through the papers that license it — and since we read the byline, those stories are now credited to Reuters and counted as Reuters. You cannot read Reuters here; you can at least see where it is doing the reporting.

The Associated Press is present, by the front door. AP publishes no usable RSS — its robots.txt disallows /*.rss outright — but the same file advertises a news sitemap, a format whose entire purpose is to be read by news indexers, and permits User-Agent: * to read it. So the feed reads AP’s news sitemap. It carries the same three fields we take from any feed, and nothing about AP’s access rules is being worked around.

That distinction is the rule we apply generally: where an outlet publishes a machine-readable index and permits us to read it, we read it. Where an outlet refuses automated access, we accept the refusal. We do not change our user-agent to look like a browser, do not use endpoints an outlet has disallowed, and do not launder a blocked outlet’s content through a third party that crawled it for us. A feed that sourced its material by evading access controls could not credibly ask you to trust anything else about it.

Each outlet carries its country, ownership type, and funding model — facts you can check. We do not assign left/right ratings. We have no citable, neutral source for one, and a bias score invented in-house would be precisely the kind of unaccountable editorial judgement this feed exists to avoid. Balance is sought structurally instead — across countries, ownership types, and languages.

What this feed is not

  • Not a claim that the linked reporting is true. Corroboration means several newsrooms are reporting the same event. Newsrooms have been collectively wrong before, particularly early in a story and particularly when they are all drawing on the same official source. Read across the links; that is what they are for.
  • Not free of bias. The source list is a set of choices, English-language outlets are over-represented, and outlets that publish feeds are over-represented over those that don’t. The method is transparent, not neutral. Nobody’s is.
  • Not comprehensive. Regions with few outlets carrying public feeds are under-covered, and the corroboration rule compounds that under-coverage.

How to read the map

The feed opens with a map of the window rather than a list, because a list makes every story look equally well-established and they are not.

Each cell is one story. Its shade and its width both encode the same single number — how many independent newsrooms reported it — on a five-step scale from pale (just cleared the threshold) to dark (widely and separately reported). The number is printed on every cell as well, so nothing depends on telling two blues apart.

This is a map of how well-attested a story is, not of how important it is. A massacre reported by three newsrooms gets a small pale cell; a diplomatic photo-opportunity covered by twelve gets a large dark one. The map measures attention and confirmation, which are not significance, and no automated system can measure significance. Read it as “how much of the world’s press has independently stood behind this”, nothing more.

The bands are not equal-sized buckets. Most stories sit just above the threshold — on the day this was built, 18 of 37 had exactly three independent newsrooms — and splitting the range evenly would have painted an ordinary day as a dramatic one. The distribution you see is the real one.

The index beneath lists the most corroborated stories as a way in. The full record follows it, in the same order, with every link.

The map of places

Maps & Data shows which countries the current feed named, shaded by how many stories named them, with the stories reachable from each country.

A story is placed by literal matching: the country’s name, its people (“Israeli”, “Congolese”), or a listed alias (“US”, “Britain”, “Gaza”, “Kyiv”) appearing in the story’s own line or in any headline linked under it. Nothing is inferred. A story that names no country is left off the map and counted as unplaced — on the day this was written, 4 of 34 were, and each page says so.

Two limits matter more than the map looks like it admits:

  • It shows where coverage points, not where events matter. A country is shaded because headlines said its name. The palest countries on this map are usually the least covered, not the calmest, and the whole map is a picture of the source list’s attention.
  • Names that are also other things are excluded. Georgia, Jordan, Chad, Niger, Guinea, Mali, Turkey and a few others are only placed by their demonym or an explicit alias, never by the bare word, because in practice “Georgia” is usually a US state and “Jordan” is usually a person.

Boundaries come from Natural Earth (public domain) and ship with the site. They are drawn as that dataset publishes them and are not a statement by VERITATEM about any territorial dispute. There is no basemap: the map makes no request to any third party, because a reader looking at a map should not have their address handed to a tile server.

What happens when you click

A link from here goes to the outlet’s own page, and that page is not ours. Many of them surround the article with paid content-recommendation widgets — the grid of sensational thumbnails under the text, sold by networks like Taboola and Outbrain. It is the same attention economy this feed exists to sit outside, and we send you into it every time you follow a link.

We cannot remove those widgets. What we can do is say which outlets run them, so that when several outlets carry the same story you can choose where to go. Links whose destination carried such widgets when we sampled it are marked paid link widgets.

Sampled 2026-08-19: 18 of 27 measured outlets carried them. 5 could not be measured.

OutletRecommendation widgets seen
AfricanewsOutbrain
Associated PressDianomi, Nativo
CNA (Channel NewsAsia)Outbrain
Deutsche WelleTaboola
El PaísOutbrain, Taboola
EuronewsNativo, Outbrain
Fox NewsOutbrain
France 24Outbrain
RFIOutbrain
The Guardianplista
The HinduTaboola
The IndependentTaboola
The Irish TimesNativo
The Japan TimesTaboola
The Straits TimesOutbrain, Taboola
The Times of IndiaTaboola
The Washington TimesOutbrain
Yonhap News AgencyTaboola
ABC News (Australia)none seen
Al Jazeera Englishnone seen
BBC Newsnone seen
Bloombergunreachable (HTTPError 403)
Dawnnone seen
Financial Timesnone seen
Folha de S.Paulorobots-disallowed
PBS NewsHournone seen
Sky Newsrobots-unreadable
South China Morning Postnone seen
TASSnone seen
The Moscow Timesnone seen
The New York Timesunreachable (HTTPError 403)
The Washington Postunreachable (TimeoutError)

How this was measured, and what it does not prove. One recent article per outlet — a sample of a single page, not a survey of the site. robots.txt is honoured, and an outlet that disallows us or refuses the request is recorded as not measured, never as clean. We look only for third-party vendor domains in the page and keep nothing else. Absence is not proof of absence: widgets can be injected later by script, sit behind a consent dialog, or vary by country. And findings age — every record carries the date it was taken.

This is disclosure, not a ranking or a boycott list. Several outlets doing first-rate reporting are on the marked side of that table, and a clean page is not a mark of good journalism. Advertising pays for a great deal of the reporting this feed depends on. You are simply entitled to know what is on the other side of a link before you follow it.

Further reading, and what the threshold hides

The corroboration rule suppresses real reporting. A scoop, an investigation only one newsroom has, a story only one region is covering — none of it clears three independent outlets, and all of it is journalism.

So each story carries a further reading section: coverage of the same event that did not clear the threshold, listed separately and labelled with how many outlets carried it. It is deliberately set apart from the story’s own links, because it has not been corroborated and may be early, partial, or wrong. The point is that you can see what the filter set aside, rather than having to trust that it set aside nothing worth reading.

Each day’s page also reports how many groups formed against how many published. The difference between those two numbers is the size of what this method discards, published alongside what it keeps.

Corrections

If the feed groups unrelated stories together, attributes a headline wrongly, or links to something that isn’t what its headline says, tell us via contact. Feed errors are logged in the corrections record like any other error, with the story identifier and what changed. If an outlet asks to be removed from the source list, it is removed, and the removal is recorded.