OptionalResearchVersion 1.0.0

Hermes Agent RSS Feeds Skill: Read and Discover Feeds

Read RSS, Atom, JSON feeds; discover feeds behind a page.

Written by Neura Market from the official Hermes Agent documentation for Rss Feeds. Commands, paths, and version numbers are reproduced from the source unchanged.

Read the official documentation

The RSS Feeds skill turns any RSS 2.0, RSS 1.0/RDF, Atom, or JSON Feed URL into a clean, date-sorted list of entries. It also works backwards: hand it an ordinary page URL and it hunts down the feed behind that page. If you want a recurring digest of a blog, a GitHub repo's releases, a subreddit, or a podcast, and you would rather not scrape rendered HTML every run, this is the tool.

What it does

Feed reading is a solved problem in theory and a mess in practice. Every publisher emits a slightly different dialect, dates arrive in two incompatible formats, and half the sites you care about never advertise their feed anywhere obvious. This skill flattens all of that into one shape: a list of entries, each carrying title, link, published (UTC ISO 8601), author, and summary (HTML stripped, capped at 2000 characters), sorted newest-first.

It is deliberately narrow. It reads feeds and discovers them. It does not pull full article bodies, so when a summary is truncated or is just the opening paragraph, you pass the entry's link to web_extract and let that handle the rest. That separation keeps the feed read cheap and fast, which matters when the same call runs on a schedule.

Before you start

There is nothing to install. The skill is standard library only, so no pip step, no virtualenv, no dependency drift. You need Python 3.10 or newer and network access to whatever host serves the feed. It runs on linux, macos, and windows.

The skill itself is optional and installed on demand, and it lives at optional-skills/research/rss-feeds. Version 1.0.0, MIT licensed, authored by Teknium (teknium1) at Hermes Agent.

How to run it

Invoke the script through terminal using the skill-relative path. The four calls below cover the whole surface: a plain read, a read against a page URL, a bounded read with machine-readable output, and a discovery pass.

python3 scripts/feed.py read https://hnrss.org/frontpage --limit 10
python3 scripts/feed.py read https://simonwillison.net/            # page URL → discovers the feed
python3 scripts/feed.py read URL --since 2026-09-01 --json          # only newer entries, machine-readable
python3 scripts/feed.py discover https://example.com/               # list candidate feed URLs

The first line reads a feed directly and caps the result at ten entries. The second does the same thing but starts from a page URL, and the script reports which feed URL it settled on via discovered_from. The third bounds by date and switches to JSON, which is what you want when another tool consumes the result. The fourth lists the candidate feeds a site advertises, without reading any of them.

Feed URL patterns worth memorising

Most of the feeds you will actually want follow predictable patterns. This table is the shortcut.

SourceFeed URL pattern
GitHub releases / commits / tagshttps://github.com/OWNER/REPO/releases.atom, …/commits/BRANCH.atom, …/tags.atom
Subreddit / Reddit searchhttps://www.reddit.com/r/NAME/.rss, https://www.reddit.com/search.rss?q=… (1 req/min anon; see reddit-reading)
YouTube channelhttps://www.youtube.com/feeds/videos.xml?channel_id=UC…
Hacker Newshttps://hnrss.org/frontpage, https://hnrss.org/newest?q=TERM
arXiv categoryhttps://rss.arxiv.org/rss/cs.CL
Substack / Medium / WordPress / GhostSITE/feed, medium.com/feed/@user, SITE/rss/
Podcaststhe show's RSS URL from its hosting page (discover finds it)

The procedure

1. Start from whatever URL you have

If all you have is a site URL, run read against it directly. The script discovers the feed on its own and tells you which URL it used through the discovered_from field. Reach for discover instead when a site advertises several feeds and you need to pick: a comments feed versus a posts feed, or per-category feeds where only one category matters to you.

2. Bound the request

Two flags do the work. --limit gives you the latest N entries. --since YYYY-MM-DD gives you everything newer than a date, which is the right shape for a recurring check. For a cron digest, persist the last-seen published value and feed it back as --since on the next run. That way each run returns only what is genuinely new, and the cost stays flat no matter how long the digest has been running.

3. Fetch full text separately

Feed summaries are frequently truncated or contain only the first paragraph. When you need the actual article, hand the entry's link to web_extract. Keeping this as a second step means you only pay for full text on the entries you care about.

4. Cite the entry, not the feed

When a result feeds into a report, cite the entry link rather than the feed URL. The grounded-citations skill covers the citation side of that workflow.

When not to use it

This skill is the zero-install read. If you need a persistent read/unread database spanning many feeds, install the optional blogwatcher skill instead. And if your target is Reddit specifically, reddit-reading is the better entry point because it manages Reddit's anonymous rate limit for you.

Limits and gotchas

A 200 response that returns HTML means the URL is a page, not a feed. The script falls through to discovery automatically, but a site with no feed link and none of the common paths will report no feed found. Before you conclude a site has no feed, check its footer or /sitemap.xml.

Reddit feeds share Reddit's anonymous throttle, roughly one request per minute per IP. If you need more than one Reddit call, chain them through reddit-reading, which waits out the window.

Dates are the other common trap. RSS pubDate is RFC 822 while Atom uses ISO 8601, and the script normalises both to UTC. Feeds that omit dates sort to the bottom and get dropped by --since, so a feed with missing dates will look empty on a bounded read even though it has content.

Some feeds sit behind Cloudflare and return 403 to non-browser clients. The blocked-page-recovery skill handles that class of failure.

Verifying the install

Two commands confirm everything is wired up. The first should print a single entry with a releases/tag/ link and an [atom] format tag. The second should print an /atom/ URL.

python3 scripts/feed.py read https://github.com/NousResearch/hermes-agent/releases.atom --limit 1 prints one entry with a releases/tag/ link and a [atom] format tag; discover https://simonwillison.net/ prints an /atom/ URL.

What pairs with it

For a recurring digest, drive this skill from cronjob_manage: feeds are cheaper and more stable than scraping an HTML front page on every run. For a persistent multi-feed read/unread store, blogwatcher is the upgrade path. reddit-reading handles Reddit's throttle, competitor-news-monitor is the monitoring use case, grounded-citations covers citing what you find, and youtube-content picks up where a channel feed leaves off.

Skills the docs pair this with

More Research skills