RSS Feeds
Any group can generate an RSS 2.0 feed. Add feed: true to a group in settings/groups.md and the build produces a feed file at /{groupName}/feed.xml — blog posts, changelog entries, roadmap updates, or any collection of pages you want syndicated.
RSS feed XML files are written to disk during activated builds. In trial mode, feeds render in the dev server but no files are produced.
How to enable a feed
Add feed: true to any group definition in settings/groups.md:
# settings/groups.md
groups:
- name: blog
feed: true
indexPage: blog.md
locations:
- sidebar:
- group: blog
items:
- Blog: /blog
- First Post: /blog/first-post
- Second Post: /blog/second-post
That's it. The next production build generates /blog/feed.xml.
What goes into the feed
Each feed includes all non-draft pages that are members of the group, with these exclusions:
- The group's index page (if set via
indexPagein groups.md) - Pages marked
robots: noindexin frontmatter
Items are sorted by published date in frontmatter (newest first), capped at 50 entries. Pages without a published date sort to the end.
Feed item fields
Each item in the feed includes:
| Field | Source |
|---|---|
<title> |
Page title (suffix stripped) |
<link> |
Full URL ({siteUrl}{slug}) |
<guid> |
Same as link (permalink) |
<pubDate> |
published from frontmatter (RFC 2822 format) |
<description> |
Page description from frontmatter |
<content:encoded> |
Full rendered HTML content |
Setting published dates
Add a published date to your page frontmatter so feed readers can sort and display posts correctly:
---
title: My Blog Post
published: 2026-03-25
---
Pages without published still appear in the feed — they sort after dated entries.
Feed autodiscovery
Every page that belongs to a feed-enabled group gets a <link> tag in its <head>:
<link rel="alternate" type="application/rss+xml" title="Blog Feed" href="/blog/feed.xml">
This tag is also injected on the group's index page (e.g. /blog). Feed readers and browsers use this tag to auto-discover the feed — visitors don't need to know the feed URL.
Pages that aren't members of a feed-enabled group don't get the tag.
Multiple feeds
Enable feeds on as many groups as you want. Each generates its own feed.xml at its group path:
groups:
- name: blog
feed: true
indexPage: blog.md
items:
- ...
- name: changelog
feed: true
indexPage: changelog.md
items:
- ...
This produces:
/blog/feed.xml— blog posts/changelog/feed.xml— changelog entries
Each page gets autodiscovery tags for whichever feed-enabled groups it belongs to.
Feed XML structure
The generated feed follows the RSS 2.0 specification with the content:encoded and Atom self link extensions:
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Blog — My Site</title>
<link>https://example.com/blog</link>
<description>Site description</description>
<atom:link href="https://example.com/blog/feed.xml"
rel="self" type="application/rss+xml"/>
<language>en</language>
<lastBuildDate>Wed, 25 Mar 2026 00:00:00 GMT</lastBuildDate>
<item>
<title>My Post</title>
<link>https://example.com/blog/my-post</link>
<guid isPermaLink="true">https://example.com/blog/my-post</guid>
<pubDate>Tue, 25 Mar 2026 00:00:00 GMT</pubDate>
<description>Post description</description>
<content:encoded><![CDATA[<p>Full HTML content...</p>]]></content:encoded>
</item>
</channel>
</rss>
The channel title combines the group name and your site's brandName from settings/meta.md. The language comes from settings/seo.md.
Build output
When feeds are generated, the build summary includes the count:
Generated: sitemap.xml, robots.txt, llms.txt, llms-full.txt, 1 feed, 10 emails
Related
- Groups — defining page groups and membership
- SEO — sitemaps, structured data, and other auto-generated SEO files
- Pages & Content — frontmatter fields including
published