RSS, but treated like infrastructure.
A Git-native registry of technical RSS/Atom feeds with stable IDs, curated collections, deterministic builds, health probes, a CLI, and a typed Python API.
Catalog · Registry JSON · Essential OPML · SDK · Curation · Contributing
The repo currently ships 50 sources, 8 collections, and 4 profiles. The essential collection is an intentionally small 18-source starter pack.
$ techfeeds export --collection essential --format opml -o essential.opml
$ techfeeds export --topic security --trait independent --format json
$ techfeeds profile developer --registry generated/registry.json --format opml -o developer.opmlWant the raw data? Start with generated/registry.json. Want something your feed reader can import? Grab an OPML file from generated/.
A feed URL is easy to collect. Keeping a useful registry alive is the hard part: domains move, endpoints drift, duplicates appear, taxonomies rot, and hand-edited exports diverge.
Awesome Tech Feeds keeps the source of truth reviewable in Git and compiles consumer artifacts from it.
sources/*.yaml ───────┐
collections/*.yaml ───┼──> validate ──> compile ──> generated/registry.json
profiles/*.yaml ──────┘ ├──> generated/*.opml
└──> generated/catalog.md
scheduled probe ────────────────────────────────────> health.json release asset
The useful invariants are deliberately boring:
source.id = durable identity
feed.url = transport endpoint
collection = curated bundle
profile = executable preset
generated/ = build output
health snapshot = network observation
That makes changes diffable, CI-checkable, and easy to consume without running a service.
For a local checkout:
git clone https://github.com/GeoGeekLab/awesome-tech-feeds.git
cd awesome-tech-feeds
python -m venv .venv
source .venv/bin/activate
python -m pip install -e '.[dev]'
techfeeds validate
techfeeds compile --check
pytestFor the published v0.5 package:
python -m pip install \
https://github.com/GeoGeekLab/awesome-tech-feeds/releases/download/v0.5.0/awesome_tech_feeds-0.5.0-py3-none-any.whlExport exactly what you need instead of maintaining your own pile of feed URLs.
# Starter pack for a feed reader
techfeeds export --collection essential --format opml -o essential.opml
# Independent security writing as JSON
techfeeds export --topic security --trait independent --format json
# Topic filters compose with AND semantics
techfeeds export --topic ai --topic llm --trait research --format jsonFilters cover collection, topic, trait, language, and source kind. Unknown values fail explicitly.
The built-in collections are:
essential · ai · systems · security · databases · programming-languages · company-engineering · independent
Every collection is ordinary YAML under collections/ and compiles to an importable OPML artifact.
from techfeeds import Query, Registry
registry = Registry.from_url()
result = registry.query(
Query(
collection="essential",
topics=("ai",),
traits=("research",),
)
)
for source in result.sources:
print(source.id, source.website)For pinned workflows, verify a downloaded registry before parsing it:
registry = Registry.from_file(
"registry.json",
expected_sha256="<digest from SHA256SUMS>",
)The consumer surface is documented in docs/consumer-sdk.md.
A source gets a permanent ID; the website and feed URLs can change around it.
schema_version: 2
id: simon-willison
name: "Simon Willison’s Weblog"
kind: individual
language: en
website: https://simonwillison.net/
feeds:
- url: https://simonwillison.net/atom/everything/
format: atom
role: primary
official: true
topics: [ai, llm, python, databases, web]
traits: [original, practitioner, deep-dive, independent, high-frequency]
curation:
rationale: "Admitted for recurring practitioner writing with reproducible technical detail."
reviewer: GeoGeekLab
reviewed_at: "2026-09-20"
review_after: "2026-12-19"
provenance:
added_by: GeoGeekLab
added_at: "2026-09-20"
status: activeField-level rules live in docs/registry.md. Curation rules live in docs/curation.md.
Profiles turn the same registry into role-oriented starting points:
developer
ai-engineer
founder
researcher
They are versioned YAML. A profile selects collections, applies explicit exclusions and boosts, and resolves deterministically.
techfeeds profile researcher --registry generated/registry.json
techfeeds profile developer --registry generated/registry.json --format opml -o developer.opmlSee docs/profiles.md for the v2 profile contract.
Network checks are kept out of the editorial source records.
techfeeds probe --concurrency 8The scheduled workflow publishes the latest snapshot as a stable release asset:
https://github.com/GeoGeekLab/awesome-tech-feeds/releases/download/health-latest/health.json
Probe states are intentionally operational: healthy, degraded, stale, and broken. They describe what happened when the endpoint was checked; the registry remains the curated source of truth.
generated/ is committed build output, so consumers can use the project with curl, a feed reader, Python, or plain Git.
| Artifact | Use it for |
|---|---|
registry.json |
Full machine-readable registry |
registry.min.json |
Compact client payload |
all.opml |
All active primary feeds |
essential.opml |
Small starter pack |
profile-*.json |
Resolved profile output |
profile-*.opml |
Feed-reader imports for profiles |
catalog.md |
Human-readable catalog |
.
├── sources/ # source records
├── collections/ # curated bundles
├── profiles/ # role presets
├── registry/ # controlled vocabularies
├── schema/ # JSON Schemas
├── src/techfeeds/ # CLI + validator + compiler + SDK + probe
├── generated/ # compiled JSON / OPML / catalog
├── tests/ # contract tests
├── docs/ # design + contracts
└── brand/ # Geo Gecko + project artwork
A good source PR answers three practical questions: who publishes it, why it is repeatedly useful, and where the canonical feed lives. Put that evidence in the source record; CI handles the mechanical checks.
techfeeds validate
techfeeds compile --check
pytestStart with CONTRIBUTING.md. For larger behavior or schema changes, read docs/architecture.md first.
This repository owns source metadata, feed endpoints, curated bundles, deterministic exports, and endpoint health observations. Article fetching, summarization, ranking, delivery, and reader-specific behavior belong in downstream consumers built on top of the registry.
Code and tooling: MIT. Registry metadata: CC BY-SA 4.0.