Files
news/profile/sources.toml
T
connor 9cba8db7bb Handle paywalled sources; add free New York coverage
The NYT is unreadable without a subscription, but dropping it would throw away
real signal -- knowing the NYT covered a story is corroboration, and it feeds
importance. So sources carry a `paywalled` flag: they still cluster and
corroborate, but are never chosen as the link for a notification or a headline
when a readable report of the same story exists, and are marked in the UI.

Deliberately NOT doing paywall circumvention. The fix is to prefer a source you
can actually read, and to add outlets that do not have the problem.

Five free New York outlets added, all verified live: The City, Gothamist,
New York Focus, Documented NY and amNY -- independent and largely nonprofit,
covering the NYC politics the NYT was being relied on for. Hell Gate was probed
too and has no discoverable feed at any of the usual paths.

Includes an additive migration for the new column, since CREATE TABLE IF NOT
EXISTS will not add a column to a table that already exists.
2026-09-09 10:01:43 -04:00

463 lines
13 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.
#
# `paywalled = true` marks a source whose articles cannot be read without a
# subscription. Such a source still contributes to clustering and corroboration,
# but is never chosen as the link for a notification or a headline when a
# readable report of the same story exists.
#
# `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"
# Kept, but marked paywalled. Its articles cannot actually be read without a
# subscription, so it must never be the link you are handed -- but knowing the
# NYT covered a story is still real corroboration, and dropping it would throw
# that signal away. See `paywalled` above.
[[source]]
name = "NYT World"
url = "https://rss.nytimes.com/services/xml/rss/nyt/World.xml"
bucket = "nyt"
weight = 0.8
paywalled = true
[[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
# The front page, which is the only way HN scores ever mature. Items fetched by
# `search_by_date` arrive at 2-3 points and, once they age out of that window,
# are never refetched -- so on their own they can never clear the maturation
# bar and HN's best content stays permanently invisible. Re-polling the front
# page refreshes the score of whatever the crowd has actually promoted.
[[source]]
name = "Hacker News front page"
url = "https://hn.algolia.com/api/v1/search"
kind = "hn"
query = "front_page"
bucket = "hacker-news"
page_size = 50
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
# ==================================================== New York / local left ====
# Added 2026-09-09. NYC politics matters to Connor and the NYT is unreadable
# without a subscription, so these are free, independent outlets covering the
# same ground. All verified live.
[[source]]
name = "The City"
url = "https://www.thecity.nyc/rss/"
bucket = "the-city-nyc"
weight = 1.1
poll_interval_secs = 3600
[[source]]
name = "Gothamist"
url = "https://gothamist.com/feed"
bucket = "gothamist"
poll_interval_secs = 3600
[[source]]
name = "New York Focus"
url = "https://www.nysfocus.com/feed"
bucket = "ny-focus"
weight = 1.1
poll_interval_secs = 7200
[[source]]
name = "Documented NY"
url = "https://documentedny.com/feed/"
bucket = "documented-ny"
weight = 1.1
poll_interval_secs = 7200
[[source]]
name = "amNY"
url = "https://www.amny.com/feed/"
bucket = "amny"
poll_interval_secs = 7200