Reading real clustered output caught a config error the tests could not: Ohio Capital Journal and Kentucky Lantern are both States Newsroom outlets syndicating the same national desk, and carried 10 byte-identical headlines in a single poll -- more than any other source pair. Configured as separate buckets they would have doubled the corroboration signal on every syndicated story, which is exactly the failure the bucket concept exists to prevent. Found by checking identical headlines across all source pairs rather than spot-fixing the one noticed by eye. That sweep also confirmed the buckets already set deliberately are right: BBC Top/World, Ars Technica/Science and NPR News/Politics each share a bucket and each showed shared headlines. Regression test added.
400 lines
11 KiB
TOML
400 lines
11 KiB
TOML
# Sources.
|
|
#
|
|
# `bucket` is the editorial-independence group, and it is the important field.
|
|
# Importance counts DISTINCT buckets, never feeds: two BBC feeds are one bucket,
|
|
# and ten outlets reprinting one wire story must not read as ten independent
|
|
# confirmations. Getting this wrong is what made the old system fire priority-5
|
|
# pushes on anything two feeds happened to carry.
|
|
#
|
|
# `weight` is editorial trust, carried over from Connor's old config where he
|
|
# had deliberately set Al Jazeera highest (1.2) and NYT lowest (0.8). It affects
|
|
# importance and tie-breaking, never whether an item is visible at all.
|
|
#
|
|
# `prominence = 1` marks a publisher's front-page/top-stories feed. Subscribing
|
|
# to both it and the section feed is a free editorial-promotion signal; the old
|
|
# config dropped BBC's top-news feed and threw that away.
|
|
|
|
[defaults]
|
|
poll_interval_secs = 900
|
|
|
|
# ------------------------------------------------------------- world / wire --
|
|
[[source]]
|
|
name = "Al Jazeera"
|
|
url = "https://www.aljazeera.com/xml/rss/all.xml"
|
|
bucket = "aljazeera"
|
|
weight = 1.2
|
|
|
|
[[source]]
|
|
name = "BBC Top Stories"
|
|
url = "https://feeds.bbci.co.uk/news/rss.xml"
|
|
bucket = "bbc"
|
|
prominence = 1
|
|
weight = 1.1
|
|
|
|
[[source]]
|
|
name = "BBC World"
|
|
url = "https://feeds.bbci.co.uk/news/world/rss.xml"
|
|
bucket = "bbc"
|
|
weight = 1.1
|
|
|
|
[[source]]
|
|
name = "Guardian World"
|
|
url = "https://www.theguardian.com/world/rss"
|
|
bucket = "guardian"
|
|
|
|
[[source]]
|
|
name = "NYT World"
|
|
url = "https://rss.nytimes.com/services/xml/rss/nyt/World.xml"
|
|
bucket = "nyt"
|
|
weight = 0.8
|
|
|
|
[[source]]
|
|
name = "NPR News"
|
|
url = "https://feeds.npr.org/1001/rss.xml"
|
|
bucket = "npr"
|
|
|
|
[[source]]
|
|
name = "France24"
|
|
url = "https://www.france24.com/en/rss"
|
|
bucket = "france24"
|
|
|
|
# RSS 1.0/RDF. The old hand-rolled quick-xml parser could not read this format
|
|
# and DW was excluded with the note that it "would yield zero items silently".
|
|
# feedparser handles RDF, so DW is back.
|
|
[[source]]
|
|
name = "Deutsche Welle"
|
|
url = "https://rss.dw.com/rdf/rss-en-all"
|
|
bucket = "dw"
|
|
|
|
[[source]]
|
|
name = "ABC Australia"
|
|
url = "https://www.abc.net.au/news/feed/51120/rss.xml"
|
|
bucket = "abc-au"
|
|
|
|
[[source]]
|
|
name = "PBS NewsHour"
|
|
url = "https://www.pbs.org/newshour/feeds/rss/headlines"
|
|
bucket = "pbs"
|
|
poll_interval_secs = 1800
|
|
|
|
# --------------------------------------------------------------- mideast ----
|
|
[[source]]
|
|
name = "Middle East Eye"
|
|
weight = 1.1
|
|
url = "https://www.middleeasteye.net/rss"
|
|
bucket = "middle-east-eye"
|
|
|
|
[[source]]
|
|
name = "+972 Magazine"
|
|
weight = 1.1
|
|
url = "https://www.972mag.com/feed/"
|
|
bucket = "972mag"
|
|
poll_interval_secs = 3600
|
|
|
|
# ----------------------------------------------------------- tech / policy --
|
|
[[source]]
|
|
name = "Ars Technica"
|
|
url = "https://feeds.arstechnica.com/arstechnica/index"
|
|
bucket = "ars-technica"
|
|
|
|
[[source]]
|
|
name = "EFF Deeplinks"
|
|
url = "https://www.eff.org/rss/updates.xml"
|
|
bucket = "eff"
|
|
poll_interval_secs = 3600
|
|
|
|
# Global-South technology and economics; covers two interest blocks at once.
|
|
[[source]]
|
|
name = "Rest of World"
|
|
url = "https://restofworld.org/feed/latest/"
|
|
bucket = "rest-of-world"
|
|
poll_interval_secs = 3600
|
|
|
|
# ------------------------------------------------------ software / systems --
|
|
[[source]]
|
|
name = "Hacker News"
|
|
url = "https://hn.algolia.com/api/v1/search_by_date"
|
|
kind = "hn"
|
|
bucket = "hacker-news"
|
|
poll_interval_secs = 1800
|
|
|
|
[[source]]
|
|
name = "Lobsters"
|
|
url = "https://lobste.rs/rss"
|
|
bucket = "lobsters"
|
|
poll_interval_secs = 1800
|
|
|
|
# Reddit's .json endpoints return 403 without OAuth as of 2026-09; the .rss
|
|
# views work unauthenticated but 429 aggressively -- three requests in quick
|
|
# succession from one IP were enough to get throttled during validation, and the
|
|
# block persisted across serialized retries. Hence the long intervals here.
|
|
# The fetcher treats 429 as a state to back off from, not an error.
|
|
#
|
|
# Cost of the .rss route: the Atom feed carries no score, so these contribute no
|
|
# aggregator-maturity signal. Hacker News is the source that supplies it.
|
|
[[source]]
|
|
name = "r/LocalLLaMA"
|
|
url = "https://www.reddit.com/r/LocalLLaMA/new/.rss"
|
|
bucket = "reddit"
|
|
poll_interval_secs = 5400
|
|
|
|
[[source]]
|
|
name = "r/selfhosted"
|
|
url = "https://www.reddit.com/r/selfhosted/new/.rss"
|
|
bucket = "reddit"
|
|
poll_interval_secs = 7200
|
|
|
|
[[source]]
|
|
name = "r/rust"
|
|
url = "https://www.reddit.com/r/rust/new/.rss"
|
|
bucket = "reddit"
|
|
poll_interval_secs = 7200
|
|
|
|
# Release feeds for the stack Connor actually runs. GitHub releases are Atom,
|
|
# so they need no adapter of their own.
|
|
[[source]]
|
|
name = "llama.cpp releases"
|
|
url = "https://github.com/ggml-org/llama.cpp/releases.atom"
|
|
bucket = "github-releases"
|
|
poll_interval_secs = 7200
|
|
|
|
[[source]]
|
|
name = "LiteLLM releases"
|
|
url = "https://github.com/BerriAI/litellm/releases.atom"
|
|
bucket = "github-releases"
|
|
poll_interval_secs = 7200
|
|
|
|
[[source]]
|
|
name = "llama-swap releases"
|
|
url = "https://github.com/mostlygeek/llama-swap/releases.atom"
|
|
bucket = "github-releases"
|
|
poll_interval_secs = 7200
|
|
|
|
[[source]]
|
|
name = "Podman releases"
|
|
url = "https://github.com/containers/podman/releases.atom"
|
|
bucket = "github-releases"
|
|
poll_interval_secs = 7200
|
|
|
|
[[source]]
|
|
name = "Rust releases"
|
|
url = "https://github.com/rust-lang/rust/releases.atom"
|
|
bucket = "github-releases"
|
|
poll_interval_secs = 7200
|
|
|
|
# arXiv announces once per weekday (~00:00 UTC); the feed is legitimately EMPTY
|
|
# between announcement windows, which is not a fault. Verified 2026-09-08 that
|
|
# the endpoint serves valid RSS -- cs.CL, cs.LG and cs.AI were all empty at the
|
|
# time of checking, consistent with being between windows.
|
|
[[source]]
|
|
name = "arXiv cs.CL"
|
|
url = "https://rss.arxiv.org/rss/cs.CL"
|
|
bucket = "arxiv"
|
|
poll_interval_secs = 21600
|
|
|
|
# ------------------------------------------------------------------ labor ---
|
|
[[source]]
|
|
name = "Labor Notes"
|
|
url = "https://labornotes.org/feed"
|
|
bucket = "labor-notes"
|
|
poll_interval_secs = 3600
|
|
|
|
[[source]]
|
|
name = "Jacobin"
|
|
url = "https://jacobin.com/feed/"
|
|
bucket = "jacobin"
|
|
poll_interval_secs = 3600
|
|
|
|
# --------------------------------------------------------------- urbanism ---
|
|
[[source]]
|
|
name = "Streetsblog USA"
|
|
url = "https://usa.streetsblog.org/feed"
|
|
bucket = "streetsblog"
|
|
poll_interval_secs = 3600
|
|
|
|
[[source]]
|
|
name = "Strong Towns"
|
|
url = "https://www.strongtowns.org/journal?format=rss"
|
|
bucket = "strong-towns"
|
|
poll_interval_secs = 7200
|
|
|
|
# --------------------------------------------------------- energy / climate --
|
|
[[source]]
|
|
name = "Canary Media"
|
|
url = "https://www.canarymedia.com/rss"
|
|
bucket = "canary-media"
|
|
poll_interval_secs = 3600
|
|
|
|
# --------------------------------------------------------------- US / local --
|
|
[[source]]
|
|
name = "ProPublica"
|
|
url = "https://www.propublica.org/feeds/propublica/main"
|
|
bucket = "propublica"
|
|
poll_interval_secs = 3600
|
|
|
|
[[source]]
|
|
name = "NPR Politics"
|
|
url = "https://feeds.npr.org/1014/rss.xml"
|
|
bucket = "npr"
|
|
|
|
# Ohio Capital Journal and Kentucky Lantern are both States Newsroom affiliates
|
|
# and syndicate the same national desk -- they carried 10 byte-identical
|
|
# headlines in a single poll, more than any other source pair in the config.
|
|
# One bucket, so their shared copy reads as one confirmation rather than two.
|
|
# They still contribute genuinely independent state-level reporting; the cost of
|
|
# merging is slight under-counting there, which is the safe direction.
|
|
[[source]]
|
|
name = "Ohio Capital Journal"
|
|
url = "https://ohiocapitaljournal.com/feed/"
|
|
bucket = "states-newsroom"
|
|
poll_interval_secs = 3600
|
|
|
|
[[source]]
|
|
name = "WVXU Cincinnati"
|
|
url = "https://www.wvxu.org/local-news.rss"
|
|
bucket = "wvxu"
|
|
poll_interval_secs = 3600
|
|
|
|
[[source]]
|
|
name = "WCPO Cincinnati"
|
|
url = "https://www.wcpo.com/news.rss"
|
|
bucket = "wcpo"
|
|
poll_interval_secs = 3600
|
|
|
|
[[source]]
|
|
name = "Kentucky Lantern"
|
|
url = "https://kentuckylantern.com/feed/"
|
|
bucket = "states-newsroom"
|
|
poll_interval_secs = 3600
|
|
|
|
# ------------------------------------------------------------ italy / mexico --
|
|
[[source]]
|
|
name = "ANSA English"
|
|
url = "https://www.ansa.it/english/english_rss.xml"
|
|
bucket = "ansa"
|
|
poll_interval_secs = 3600
|
|
|
|
[[source]]
|
|
name = "Mexico News Daily"
|
|
url = "https://mexiconewsdaily.com/feed/"
|
|
bucket = "mexico-news-daily"
|
|
poll_interval_secs = 3600
|
|
|
|
# ============================================================ space / aerospace
|
|
# Connor is an aerospace engineer and asked for launches and missions, deep
|
|
# technical coverage, and astronomy/planetary science. All verified 2026-09-08.
|
|
|
|
[[source]]
|
|
name = "SpaceNews"
|
|
url = "https://spacenews.com/feed/"
|
|
bucket = "spacenews"
|
|
poll_interval_secs = 3600
|
|
|
|
[[source]]
|
|
name = "Spaceflight Now"
|
|
url = "https://spaceflightnow.com/feed/"
|
|
bucket = "spaceflight-now"
|
|
poll_interval_secs = 3600
|
|
|
|
[[source]]
|
|
name = "NASASpaceflight"
|
|
url = "https://www.nasaspaceflight.com/feed/"
|
|
bucket = "nasaspaceflight"
|
|
poll_interval_secs = 3600
|
|
|
|
[[source]]
|
|
name = "NASA Breaking"
|
|
url = "https://www.nasa.gov/rss/dyn/breaking_news.rss"
|
|
bucket = "nasa"
|
|
poll_interval_secs = 3600
|
|
|
|
[[source]]
|
|
name = "ESA"
|
|
url = "https://www.esa.int/rssfeed/Our_Activities/Space_News"
|
|
bucket = "esa"
|
|
poll_interval_secs = 7200
|
|
|
|
[[source]]
|
|
name = "Ars Technica Science"
|
|
url = "https://feeds.arstechnica.com/arstechnica/science"
|
|
bucket = "ars-technica"
|
|
poll_interval_secs = 3600
|
|
|
|
[[source]]
|
|
name = "Phys.org Space"
|
|
url = "https://phys.org/rss-feed/space-news/"
|
|
bucket = "phys-org"
|
|
poll_interval_secs = 7200
|
|
|
|
# Deliberately NOT added: nature.rss (mostly "Author Correction:" journal
|
|
# metadata, not news) and sciencedaily.com (a university press-release mill,
|
|
# 60 items a poll). Both were probed and rejected on the content they returned.
|
|
[[source]]
|
|
name = "Quanta Magazine"
|
|
url = "https://www.quantamagazine.org/feed/"
|
|
bucket = "quanta"
|
|
poll_interval_secs = 21600
|
|
|
|
# ================================================================ linux / ricing
|
|
# Connor: "Linux news in general. The ricing world/neovim configs/etc"
|
|
|
|
[[source]]
|
|
name = "Phoronix"
|
|
url = "https://www.phoronix.com/rss.php"
|
|
bucket = "phoronix"
|
|
poll_interval_secs = 3600
|
|
|
|
[[source]]
|
|
name = "LWN"
|
|
url = "https://lwn.net/headlines/newrss"
|
|
bucket = "lwn"
|
|
poll_interval_secs = 7200
|
|
|
|
[[source]]
|
|
name = "It's FOSS"
|
|
url = "https://news.itsfoss.com/rss/"
|
|
bucket = "its-foss"
|
|
poll_interval_secs = 7200
|
|
|
|
[[source]]
|
|
name = "r/unixporn"
|
|
url = "https://www.reddit.com/r/unixporn/top/.rss"
|
|
bucket = "reddit"
|
|
poll_interval_secs = 10800
|
|
|
|
[[source]]
|
|
name = "Neovim releases"
|
|
url = "https://github.com/neovim/neovim/releases.atom"
|
|
bucket = "github-releases"
|
|
poll_interval_secs = 21600
|
|
|
|
# ==================================================== left / anti-colonial =====
|
|
|
|
[[source]]
|
|
name = "African Arguments"
|
|
weight = 1.1
|
|
url = "https://africanarguments.org/feed/"
|
|
bucket = "african-arguments"
|
|
poll_interval_secs = 21600
|
|
|
|
[[source]]
|
|
name = "Tribune"
|
|
weight = 1.1
|
|
url = "https://tribunemag.co.uk/feed"
|
|
bucket = "tribune"
|
|
poll_interval_secs = 21600
|
|
|
|
[[source]]
|
|
name = "The Intercept"
|
|
weight = 1.1
|
|
url = "https://theintercept.com/feed/?rss"
|
|
bucket = "the-intercept"
|
|
poll_interval_secs = 7200
|
|
|
|
[[source]]
|
|
name = "Drop Site News"
|
|
weight = 1.1
|
|
url = "https://www.dropsitenews.com/feed"
|
|
bucket = "drop-site"
|
|
poll_interval_secs = 7200
|