| name | rss-feeds |
| display_name | RSS Feed |
| description | Access and configure the RSS 2.0 feed generated by changelog-site. |
| base_url | http://localhost:3000 |
| auth | none |
| version | 1.0 |
RSS Feeds Skill
When to use
Use this skill to:
- Fetch the raw RSS 2.0 feed XML
- Verify feed structure and entry content
- Enable or disable the feed via settings
- Understand the feed format for feed reader integration
Feed URL
GET /rss.xml
The feed is publicly accessible at /rss.xml. No authentication required.
curl http://localhost:3000/rss.xml
The response is Content-Type: application/rss+xml; charset=utf-8.
Feed format
The feed follows RSS 2.0. Entry bodies use CDATA to wrap HTML safely.
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Acme App Changelog</title>
<link>https://changelog.acmeapp.com</link>
<description>Product updates, bug fixes, and new features.</description>
<language>en</language>
<lastBuildDate>Thu, 20 Mar 2026 10:00:00 +0000</lastBuildDate>
<atom:link href="https://changelog.acmeapp.com/rss.xml"
rel="self" type="application/rss+xml"/>
<item>
<title>Dark mode support across all pages</title>
<link>https://changelog.acmeapp.com/dark-mode-support</link>
<guid isPermaLink="true">https://changelog.acmeapp.com/dark-mode-support</guid>
<pubDate>Thu, 20 Mar 2026 00:00:00 +0000
Added
<![CDATA[<p>We've added a full dark mode...</p>]]>
Feed fields
| RSS field | Source |
|---|
<title> (channel) | settings.product_name + " Changelog" |
<link> (channel) | settings.public_url |
<description> (channel) | settings.description |
<lastBuildDate> | Published date of the most recent entry |
<title> (item) | entry.title |
<link> (item) | settings.public_url + "/" + entry.slug |
<guid> | Same as item <link> |
<pubDate> | entry.published_at in RFC 822 format |
<category> | entry.category (title-cased) |
<description> | entry.body_html wrapped in CDATA |
Feed behavior
- The feed includes only published entries (
is_draft = false).
- Entries are ordered by
published_at descending (newest first).
- The feed contains up to 50 entries. Older entries are not paginated.
- Draft entries never appear in the feed even if a direct URL is guessed.
- The feed regenerates on each request from the database. No static file caching.
Enable or disable the feed
The feed is enabled by default. To disable it:
curl -X PUT http://localhost:3000/api/settings \
-H "Content-Type: application/json" \
-d '{"rss_enabled": false}'
When disabled, GET /rss.xml returns 404.
To re-enable:
curl -X PUT http://localhost:3000/api/settings \
-H "Content-Type: application/json" \
-d '{"rss_enabled": true}'
Verify feed is valid
Use the curl response headers to confirm the correct content type:
curl -I http://localhost:3000/rss.xml
Expected:
HTTP/1.1 200 OK
Content-Type: application/rss+xml; charset=utf-8
Autodiscovery
The public changelog page includes an autodiscovery <link> tag in <head> so feed readers can find the feed automatically:
<link rel="alternate" type="application/rss+xml"
title="Acme App Changelog"
href="https://changelog.acmeapp.com/rss.xml">
Feed reader subscription URLs
Common feed readers accept the raw feed URL directly. For direct subscription links:
| Reader | URL pattern |
|---|
| Feedly | https://feedly.com/i/subscription/feed/{encoded_feed_url} |
| Inoreader | https://www.inoreader.com/feed/{encoded_feed_url} |
| Generic | Paste the feed URL directly into any RSS reader |
Replace {encoded_feed_url} with the URL-encoded value of https://changelog.acmeapp.com/rss.xml.
Troubleshooting
Feed returns 404
Check that rss_enabled is true in settings:
curl http://localhost:3000/api/settings | jq .rss_enabled
Feed shows no items
Verify that at least one entry is published (not draft):
curl "http://localhost:3000/api/entries?status=published&limit=1"
Feed content is stale
The feed is generated dynamically on each request. There is no cache to clear. If entries appear in the API but not the feed, check that published_at is set (not null) on those entries.
Invalid XML in feed
Entry body HTML is sanitized with DOMPurify before storage. If a feed validator reports malformed XML, the likely cause is unescaped characters in the product_name or description setting. Update those fields to remove <, >, or & characters.