This project generates RSS 2.0 feeds for AI news/blog sites that do not publish feeds directly.
You can import all of these feeds into your RSS reader with this feeds.opml file.
Or you can import selected feeds by copying the URL of the XML files in the below table.
* These feeds are currently broken and not updating.
Use the generator script:
uv run python generate_feeds.pyGenerated feed files are written to ./feeds.
By default all feeds are generated, but you can specify which to generate:
uv run python generate_feeds.py aisi-blog allenai-newsOptions:
--no-cache: disable Scrapy HTTP cache for that run--skip-unchanged: skip writing a feed file if its only change would belastBuildDate
The scheduled GitHub Actions workflow uses --skip-unchanged, so it does not create a commit when feeds are otherwise unchanged.
Feed generation is fail-fast.
- If the source URL does not return HTTP 200, that spider raises an error.
- If
item_container_selectormatches nothing, that spider raises an error. - If too few items are extracted, that spider raises an error.
By default, each spider enforces:
min_item_count = 1min_item_ratio_vs_previous = 0.6when an existingfeeds/<name>.xmlfile is present
This prevents silently writing empty or unexpectedly tiny feeds when page markup changes.
uv run python generate_feeds.py exits with a non-zero status if any spider errors.
Scrapy HTTP cache is enabled by default in src/settings.py.
Use uv run python generate_feeds.py --no-cache to disable cache for a single run.
To refresh cached source pages, delete:
rm -rf .scrapy/httpcache- Add a new
[feeds.<feed-key>]table infeeds.toml. - Set required fields for HTML feeds:
feed_titlesource_urlitem_container_selectoritem_title_selectoritem_link_selector
- For Next.js feeds, set:
format = "nextjs"item_container_selectoras a jq query that returns item objects (for example.page.sections[] | select(._type == "publicationList") | .posts[])item_title_selector,item_link_selector, and optionalitem_date_selector/item_description_selectoras jq queries scoped to each item
- Set optional fields as needed:
item_date_selector,item_date_regex,item_description_selector,feed_description,languageitem_guid_is_permalink,min_item_count,min_item_ratio_vs_previous- save a local source snapshot in
snapshots/and develop selectors against that copy - comments above the feed table to keep source/structure notes alongside selectors
- Add the new feed entry to the table above, keeping it sorted by name.
- Run
uv run python generate_feeds.pyand verify output infeeds/.