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:

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:

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