Creating custom filtered RSS feeds in Ghost

A Ghost site looks like it has a single RSS feed (the one at `/rss/`), but it actually exposes many, and you can add your own filtered feeds on top. This note captures the process so I can explain it to others.

Canonical version: Creating custom filtered RSS feeds in Ghost.

A Ghost site looks like it has a single RSS feed (the one at /rss/), but it actually exposes many, and you can add your own filtered feeds on top. This note captures the process so I can explain it to others.

What Ghost gives you for free

Ghost auto-generates RSS feeds you never had to configure:

  • /rss/ — every post (the front-page collection).
  • {collection}/rss/ — one feed per collection defined in routes.yaml (e.g. /blog/rss/, /newsletter/rss/).
  • /tag/{slug}/rss/ — one feed for every tag on the site.
  • /author/{slug}/rss/ — one feed per author.

So "more feeds" is really a discoverability problem, not a missing feature. What's actually missing: feeds that combine or filter content in ways tags and collections can't. Think "three tags merged into one feed", "featured posts only", or "everything except the newsletter archive".

The clean way: channels

A channel is a route in routes.yaml with controller: channel. It does two things: a browsable archive page, and an RSS feed at {route}rss/ (RSS is on by default). It takes an NQL filter, so the filter lives in config, not in a template:

routes:
  /feeds/pkm/:
    controller: channel
    filter: "tag:[personal-knowledge-management,note-taking,obsidian]"
    template: feed-pkm

Useful filter shapes:

  • tag:[a,b,c] — posts having any of these tags (a merged topic feed).
  • featured:true — a curated "best of" feed.
  • primary_tag:-newsletter — everything except one category (- negates).

The feed above is then served at /feeds/pkm/rss/.

The way to avoid: custom RSS templates

The other option is to point a route at a hand-written rss.hbs template with content_type: text/xml, fetching posts via {{#get "posts" filter="..."}}. Skip it. The RSS XML is hardcoded, so it drifts out of sync with Ghost upgrades, and limit="all" is deprecated (use an explicit limit). Channels keep the filter in config and let Ghost own the feed format.

Caveats

  • Feeds are paginated ({route}rss/, then /2/, …); each page returns a capped number of items.
  • Channels are overlapping views. Unlike collections, a post can appear in many channels and its permalink is unchanged.
  • routes.yaml is uploaded separately in Ghost (Settings → Labs → Routes); it is not part of the theme package.
  • RSS feeds are for readers and RSS clients. No need to submit them to search engines; a normal sitemap already covers the posts.

References


About Sébastien

I'm Sébastien Dubois, and I'm on a mission to help knowledge workers escape information overload. After 20+ years in IT and seeing too many brilliant minds drowning in digital chaos, I've decided to help people build systems that actually work. Through the Knowii Community, my courses, products & services and my Website/Newsletter, I share practical and battle-tested systems.

I write about Knowledge Work, Personal Knowledge Management, Note-taking, Lifelong Learning, Personal Organization, Productivity, and more. I also craft lovely digital products and tools.

If you want to follow my work, then become a member and join our community.

Ready to get to the next level?

If you're tired of information overwhelm and ready to build a reliable knowledge system:

Found this valuable? Share it with someone who needs it.

Join 6,000+ readers. Get practical systems for knowledge & AI. Free.

Subscribe ✨

Free: Knowledge System Checklist

A clear roadmap to building your own knowledge system. Subscribe and get it straight to your inbox.

6,000+ readers. No spam. Unsubscribe anytime.