<?xml version="1.0" encoding="utf-8" standalone="yes"?><?xml-stylesheet type="text/xsl" href="/pretty-feed-v3.xsl"?>
<rss
  version="2.0"
  xmlns:atom="http://www.w3.org/2005/Atom"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:source="https://source.scripting.com/"
>
  <channel>
    <title>Paul Tibbetts</title>
    <link>https://paultibbetts-uk-feat-cooks.preview.lab.paultibbetts.uk/tags/rss/</link>
    <description>Posts by Paul Tibbetts about RSS</description>
    <generator>Hugo</generator>
    <language>en-gb</language>
    <atom:link href="https://paultibbetts-uk-feat-cooks.preview.lab.paultibbetts.uk/tags/rss/feed.xml" rel="self" type="application/rss+xml" /><item>
      <title>Turning a page into a feed</title>
      <link>https://paultibbetts-uk-feat-cooks.preview.lab.paultibbetts.uk/2026/04/30/turning-a-page-into-a-feed/</link>
      <pubDate>Thu, 30 Apr 2026 16:46:04 +0100</pubDate>
      <guid>https://paultibbetts-uk-feat-cooks.preview.lab.paultibbetts.uk/2026/04/30/turning-a-page-into-a-feed/</guid>
      <category>IndieWebCamp</category>
      <category>RSS</category>
      <description>Why and how I added a feed to my indie web directories directory.</description>
      <content:encoded><![CDATA[<p>During a session on feeds at <a href="https://events.indieweb.org/2026/04/-indiewebcamp-d%C3%BCsseldorf-ewHCZehNA3gg">IndieWebCamp Düsseldorf</a>
 a question came up: how do you signal updates to a page?</p>
<p>For pages that are really just lists you can treat them like posts on a blog.</p>
<p>My <a href="https://paultibbetts-uk-feat-cooks.preview.lab.paultibbetts.uk/indieweb-directories">directory of indie web directories</a>
 is one of those, it&rsquo;s a collection of links that grows over time.</p>
<p>Since my site is built with Hugo, I:</p>
<ul>
<li>changed the page into a <a href="https://gohugo.io/content-management/sections/">section</a>
</li>
<li>made a file for each entry</li>
</ul>
<p>and Hugo made a feed for it.</p>
<p>The only tweak it needed was in the RSS template, so that for this new section the <code>&lt;item&gt;&lt;link&gt;</code> would point to the directory instead of my own site, which for me looked a bit like:</p>
<pre><code class="language-go">{{- $itemLink := .Permalink -}}
{{- if eq .Section &#34;indieweb-directories&#34; -}}
	{{- with .Params.link -}}
		{{- $itemLink = . -}}
	{{- end -}}
{{- end -}}</code></pre>
<pre><code class="language-xml">&lt;item&gt;
  &lt;title&gt;{{ .Title }}&lt;/title&gt;
  &lt;link&gt;{{ $itemLink }}&lt;/link&gt;</code></pre>
<p>This works well for pages where updates are incremental additions, such as changelogs or collections.</p>
<p>It works less well for pages that are edited in place. You&rsquo;d need to post what changed, which means keeping a history of revisions - something wikis do by publishing diffs.</p>
<p>Those updates can be harder to read, and while you could do it with Hugo, you&rsquo;d have to write them manually. There&rsquo;s no built-in way of creating them.</p>
<p>In my case it works, not because I&rsquo;ve solved how to signal updates to a page, but because it turns out my page wasn&rsquo;t even a page in the first place.</p>]]></content:encoded><source:markdown>
During a session on feeds at [IndieWebCamp Düsseldorf](https://events.indieweb.org/2026/04/-indiewebcamp-d%C3%BCsseldorf-ewHCZehNA3gg) a question came up: how do you signal updates to a page?

For pages that are really just lists you can treat them like posts on a blog.

My [directory of indie web directories](/indieweb-directories) is one of those, it&#39;s a collection of links that grows over time.

Since my site is built with Hugo, I:

- changed the page into a [section](https://gohugo.io/content-management/sections/)
- made a file for each entry

and Hugo made a feed for it.

The only tweak it needed was in the RSS template, so that for this new section the `&lt;item&gt;&lt;link&gt;` would point to the directory instead of my own site, which for me looked a bit like:

```go
{{- $itemLink := .Permalink -}}
{{- if eq .Section &#34;indieweb-directories&#34; -}}
	{{- with .Params.link -}}
		{{- $itemLink = . -}}
	{{- end -}}
{{- end -}}
```

```xml
&lt;item&gt;
  &lt;title&gt;{{ .Title }}&lt;/title&gt;
  &lt;link&gt;{{ $itemLink }}&lt;/link&gt;
```

This works well for pages where updates are incremental additions, such as changelogs or collections.

It works less well for pages that are edited in place. You&#39;d need to post what changed, which means keeping a history of revisions - something wikis do by publishing diffs.

Those updates can be harder to read, and while you could do it with Hugo, you&#39;d have to write them manually. There&#39;s no built-in way of creating them.

In my case it works, not because I&#39;ve solved how to signal updates to a page, but because it turns out my page wasn&#39;t even a page in the first place.
</source:markdown></item><item>
      <title>My RSS feeds now contain content:encoded and source:markdown. These are used by …</title>
      <link>https://paultibbetts-uk-feat-cooks.preview.lab.paultibbetts.uk/2026/03/02/2026-03-02-133227-rss-feed-changes/</link>
      <pubDate>Mon, 02 Mar 2026 13:32:27 +0000</pubDate>
      <guid>https://paultibbetts-uk-feat-cooks.preview.lab.paultibbetts.uk/2026/03/02/2026-03-02-133227-rss-feed-changes/</guid>
      <category>RSS</category>
      <description>My RSS feeds now contain content:encoded and source:markdown.
These are used by some feed readers to show the full content, which means my posts are now fully readable through RSS.</description>
      <content:encoded><![CDATA[<p>My RSS feeds now contain <code>content:encoded</code> and <code>source:markdown</code>.</p>
<p>These are used by some feed readers to show the full content, which means my posts are now fully readable through RSS.</p>]]></content:encoded><source:markdown>
My RSS feeds now contain `content:encoded` and `source:markdown`.

These are used by some feed readers to show the full content, which means my posts are now fully readable through RSS.
</source:markdown></item><item>
      <title>How to create an RSS Feed</title>
      <link>https://paultibbetts-uk-feat-cooks.preview.lab.paultibbetts.uk/2026/03/01/how-to-create-an-rss-feed/</link>
      <pubDate>Sun, 01 Mar 2026 16:33:46 +0000</pubDate>
      <guid>https://paultibbetts-uk-feat-cooks.preview.lab.paultibbetts.uk/2026/03/01/how-to-create-an-rss-feed/</guid>
      <category>IndieWeb</category>
      <category>RSS</category>
      <description>In my last post I recommended starting with RSS to make your site followable.
This is how to do that.</description>
      <content:encoded><![CDATA[<p>In my last post I recommended starting with RSS to make your site followable.</p>
<p>This is how to do that.</p>
<h2 id="you-might-already-have-one">You might already have one</h2>
<p>If you&rsquo;re using a static site generator like Hugo, or a CMS like WordPress, then you might already have an RSS feed.</p>
<p>If not, and you&rsquo;re writing your site manually, or just want to understand what&rsquo;s going on, here&rsquo;s what an RSS feed looks like.</p>
<h2 id="a-minimal-rss-feed">A minimal RSS feed</h2>
<p>At a minimum an RSS feed contains:</p>
<pre><code class="language-xml">&lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&gt;
&lt;rss version=&#34;2.0&#34;&gt;
  &lt;channel&gt;
    &lt;title&gt;Example Blog&lt;/title&gt;
    &lt;link&gt;https://example.com/&lt;/link&gt;
    &lt;description&gt;Updates from my blog.&lt;/description&gt;

    &lt;item&gt;
      &lt;title&gt;Hello World&lt;/title&gt;
      &lt;link&gt;https://example.com/hello-world&lt;/link&gt;
      &lt;description&gt;My first post.&lt;/description&gt;
    &lt;/item&gt;

  &lt;/channel&gt;
&lt;/rss&gt;</code></pre>
<h3 id="required">Required</h3>
<pre><code class="language-xml">&lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&gt;</code></pre>
<p>This line declares the XML version of the file and the encoding that it uses. <code>UTF-8</code> supports text and emoji.</p>
<p>It&rsquo;s strongly recommended to include this line so the file is read correctly.</p>
<pre><code class="language-xml">&lt;rss version=&#34;2.0&#34;&gt;</code></pre>
<p>This is the start of the <code>&lt;rss&gt;</code> element. The <code>version=&quot;2.0&quot;</code> tells consumers that the feed conforms to the RSS 2.0 specification, the most widely supported version.</p>
<pre><code class="language-xml">&lt;channel&gt;
  &lt;title&gt;Example Blog&lt;/title&gt;
  &lt;link&gt;https://example.com/&lt;/link&gt;
  &lt;description&gt;Updates from my blog.&lt;/description&gt;</code></pre>
<p>The <code>&lt;channel&gt;</code> declares the feed itself, so <code>&lt;title&gt;</code>, <code>&lt;link&gt;</code> and <code>&lt;description&gt;</code> are used to describe the feed and its contents.</p>
<p>These details should match what&rsquo;s displayed on your site and will show up for users when adding or managing your feed in their reader.</p>
<p>The <code>&lt;link&gt;</code> should point to the URL of the <code>&lt;channel&gt;</code>, which is the site itself.</p>
<pre><code class="language-xml">&lt;item&gt;
  &lt;title&gt;Hello World&lt;/title&gt;
  &lt;link&gt;https://example.com/hello-world&lt;/link&gt;
  &lt;description&gt;My first post.&lt;/description&gt;
&lt;/item&gt;</code></pre>
<p>The <code>&lt;item&gt;</code> tag is used for each post in the feed.</p>
<p>An <code>&lt;item&gt;</code> <strong>must</strong> contain at least one of:</p>
<ul>
<li><code>&lt;title&gt;</code></li>
<li><code>&lt;description&gt;</code></li>
</ul>
<p>which means you could do:</p>
<pre><code class="language-xml">&lt;item&gt;
  &lt;title&gt;My first post&lt;/title&gt;
&lt;/item&gt;</code></pre>
<p>which is valid, but not very useful, or:</p>
<pre><code class="language-xml">&lt;item&gt;
  &lt;description&gt;Hello, World!&lt;/description&gt;
&lt;/item&gt;</code></pre>
<p>which is also valid, and slightly more useful, if only for microblogs and notes and other posts without a title.</p>
<pre><code class="language-xml">&lt;item&gt;
  &lt;title&gt;An example&lt;/title&gt;
  &lt;link&gt;https://example.com/posts/1&lt;/link&gt;
&lt;/item&gt;</code></pre>
<p>Title + link is more practical, and may be all you need, but:</p>
<pre><code class="language-xml">&lt;item&gt;
  &lt;title&gt;An example&lt;/title&gt;
  &lt;link&gt;https://example.com/posts/1&lt;/link&gt;
  &lt;description&gt;Hello, World!&lt;/description&gt;
&lt;/item&gt;</code></pre>
<p>using all three is most common.</p>
<p>You could use the <code>&lt;description&gt;</code> for the summary of your post or for the whole thing.</p>
<p>There&rsquo;s no upper limit on the amount of <code>&lt;item&gt;</code>s you can include in a feed, but there are some practical things to consider:</p>
<ul>
<li>RSS does not do pagination</li>
<li>
<ul>
<li>everything is listed in one file</li>
</ul>
</li>
<li>if the file gets really big then it takes longer to download</li>
<li>
<ul>
<li>aim to keep it under 500KB</li>
</ul>
</li>
<li>maybe only show your latest posts if you have lots of them</li>
</ul>
<h3 id="optional">Optional</h3>
<p>The fields mentioned above are all that is required for a minimal feed, but there are some optional extras that are recommended.</p>
<pre><code class="language-xml">&lt;item&gt;
  ...
  &lt;guid isPermaLink=&#34;true&#34;&gt;
    https://example.com/posts/1
  &lt;/guid&gt;
&lt;/item&gt;</code></pre>
<p>A <code>guid</code>, for &ldquo;Globally Unique IDentifier&rdquo;, gives each item in the feed a stable identity. This means feed readers can detect and remove duplicates correctly.</p>
<p>This is usually the permalink of the post. If so, <code>isPermaLink</code> defaults to true and can be omitted, however it it&rsquo;s not the permalink, like a database ID, or the exact datetime the post was published, you would change <code>isPermaLink</code> to <code>false</code>.</p>
<p>Note that the <code>L</code> in <code>PermaLink</code> is also capitalised.</p>
<pre><code class="language-xml">&lt;item&gt;
  ...
  &lt;pubDate&gt;Sun, 1 Mar 2026 14:00:00 GMT&lt;/pubDate&gt;
&lt;/item&gt;</code></pre>
<p>The <code>&lt;pubDate&gt;</code> is used to show when an item in the feed was published. It can help feed readers understand the order of your posts and should be added.</p>
<pre><code class="language-xml">&lt;rss version=&#34;2.0&#34;
xmlns:atom=&#34;http://www.w3.org/2005/Atom&#34;&gt;</code></pre>
<p>Changing the <code>&lt;rss&gt;</code> tag to include <code>xmlns:atom=&quot;http://www.w3.org/2005/Atom&quot;</code> is also optional but recommended.</p>
<p>This tells whatever is reading the feed that anything defined with <code>atom:</code> comes from the Atom specification, and lets you use extra tags defined by the Atom spec.</p>
<p>This isn&rsquo;t useful by itself, but it is used when you also add:</p>
<pre><code class="language-xml">&lt;atom:link
href=&#34;https://example.com/index.xml&#34;
rel=&#34;self&#34;
type=&#34;application/rss+xml&#34; /&gt;</code></pre>
<p>which defines the URL of the feed and helps feed readers know the canonical URL of the feed itself, which helps prevent duplicate subscriptions.</p>
<pre><code class="language-xml">&lt;lastBuildDate&gt;Sun, 1 Mar 2026 14:00:00 GMT&lt;/lastBuildDate&gt;</code></pre>
<p>The <code>&lt;lastBuildDate&gt;</code> can be used by feed readers to know if the feed has changed.</p>
<p>Set it to the date of the most recent post.</p>
<pre><code class="language-xml">&lt;language&gt;en-gb&lt;/language&gt;</code></pre>
<p>You should declare the language of the feed. It&rsquo;s small, but it&rsquo;s technically correct.</p>
<h2 id="things-to-remember">Things to remember</h2>
<p>RSS is pretty simple but dealing with XML means you have to remember a few things.</p>
<h3 id="xml-must-be-well-formed">XML must be well-formed</h3>
<p>Writing an RSS feed is still writing XML, and so it must obey the rules of an XML file.</p>
<p>This means the file must not have any missing closing tags, or mix ups with the order in which you close them.</p>
<p>It also means you must handle special characters, otherwise the file is invalid and won&rsquo;t be understood.</p>
<p>For example:</p>
<pre><code class="language-xml">&lt;title&gt;Special &amp; Character&lt;/title&gt;</code></pre>
<p>won&rsquo;t work, because of the <code>&amp;</code>, which must be escaped:</p>
<pre><code class="language-xml">&lt;title&gt;Special &amp;amp; Character&lt;/title&gt;</code></pre>
<h4 id="no-unescaped-html-in-the-description">No unescaped HTML in the description</h4>
<p>The same happens with the <code>&lt;description&gt;</code> tag, which usually holds the summary or the contents of the post, and must not include unescaped HTML characters.</p>
<p>The first option is to escape all of the HTML in the description:</p>
<pre><code class="language-xml">&lt;description&gt;&amp;lt;p&amp;gt;Hello, World!&amp;lt;/p&amp;gt;&lt;/description&gt;</code></pre>
<p>or the more common option is to wrap the HTML content in the description in a <code>CDATA</code> tag:</p>
<pre><code class="language-xml">&lt;description&gt;&lt;![CDATA[
&lt;p&gt;Hello, World!&lt;/p&gt;
]]&gt;&lt;/description&gt;</code></pre>
<p>where CDATA tells whatever is reading the XML file that everything inside this is raw text.</p>
<h4 id="dates-must-be-written-as-rfc-822">Dates must be written as RFC 822</h4>
<p>If you do use <code>&lt;pubDate&gt;</code> or <code>&lt;lastBuildDate&gt;</code> to show dates you must ensure they are written using the <a href="https://www.w3.org/Protocols/rfc822/#z28">RFC 822 format</a>
:</p>
<pre><code class="language-xml">&lt;pubDate&gt;Sun, 1 Mar 2026 14:00:00 GMT&lt;/pubDate&gt;</code></pre>
<h3 id="serve-the-file-with-the-correct-content-type">Serve the file with the correct Content-Type</h3>
<p>When your server responds to a request to show the feed it should send:</p>
<pre><code class="language-text">Content-Type: application/rss+xml</code></pre>
<p>so that feed readers recognise it as an RSS feed.</p>
<p>Most static web hosting handles this for you, I only mention it in case you are setting up a server and are messing with the Content-Type of the files you serve.</p>
<h2 id="how-to-check-your-feed">How to check your feed</h2>
<p>There are a few ways to check you&rsquo;ve written your feed correctly.</p>
<h3 id="open-it-in-a-browser">Open it in a browser</h3>
<p>The file should open and look similar to what you wrote it as. If it doesn&rsquo;t open, there&rsquo;s a problem, and if it shows an error then you need to fix it.</p>
<h3 id="use-a-validator">Use a validator</h3>
<p>You can use <a href="https://validator.w3.org/feed/">validator.w3.org/feed</a>
 to validate your feed. It can work with the URL of your feed online or you can paste in its contents if you&rsquo;re still working on it.</p>
<h3 id="add-it-to-your-reader">Add it to your reader</h3>
<p>The best test is to add your own feed to your reader and check it looks the way you want.</p>
<p>Make sure it&rsquo;s showing in the order you expect and you can edit posts without making duplicates in your reader.</p>
<h2 id="full-example">Full example</h2>
<p>Here is a condensed version of my own RSS feed, containing two articles and a note.</p>
<p>The note doesn&rsquo;t have a <code>&lt;title&gt;</code>, which influenced the URL used for its <code>&lt;guid&gt;</code>.</p>
<pre><code class="language-xml">&lt;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34; standalone=&#34;yes&#34;?&gt;
&lt;rss version=&#34;2.0&#34;
	xmlns:atom=&#34;http://www.w3.org/2005/Atom&#34;&gt;
	&lt;channel&gt;
		&lt;title&gt;Paul Tibbetts&lt;/title&gt;
		&lt;link&gt;https://paultibbetts.uk/&lt;/link&gt;
		&lt;description&gt;Recent posts by Paul Tibbetts&lt;/description&gt;
		&lt;generator&gt;Hugo&lt;/generator&gt;
		&lt;language&gt;en-gb&lt;/language&gt;
		&lt;lastBuildDate&gt;Sun, 01 Mar 2026 12:41:46 +0000&lt;/lastBuildDate&gt;
		&lt;atom:link href=&#34;https://paultibbetts.uk/feed.xml&#34; rel=&#34;self&#34; type=&#34;application/rss+xml&#34; /&gt;
		&lt;item&gt;
			&lt;title&gt;How to create an RSS Feed&lt;/title&gt;
			&lt;link&gt;https://paultibbetts.uk/2026/03/01/how-to-create-an-rss-feed/&lt;/link&gt;
			&lt;pubDate&gt;Sun, 01 Mar 2026 16:33:46 +0000&lt;/pubDate&gt;
			&lt;guid&gt;https://paultibbetts.uk/2026/03/01/how-to-create-an-rss-feed/&lt;/guid&gt;
			&lt;description&gt;In my last post I recommended starting with RSS to make your site followable. This is how to do that.&lt;/description&gt;
		&lt;/item&gt;
		&lt;item&gt;
			&lt;title&gt;Ways to make your feed followable&lt;/title&gt;
			&lt;link&gt;https://paultibbetts.uk/2026/03/01/ways-to-make-your-feed-followable/&lt;/link&gt;
			&lt;pubDate&gt;Sun, 01 Mar 2026 11:36:03 +0000&lt;/pubDate&gt;
			&lt;guid&gt;https://paultibbetts.uk/2026/03/01/ways-to-make-your-feed-followable/&lt;/guid&gt;
			&lt;description&gt;You’ve got 3 posts on your site and you want people to be notified about new ones. Here’s all the ways I can think of doing that.&lt;/description&gt;
			&lt;/item&gt;
		&lt;item&gt;
			&lt;title&gt;2026-02-15 14:54:58&lt;/title&gt;
			&lt;link&gt;https://paultibbetts.uk/2026/02/15/2026-02-15-145458/&lt;/link&gt;
			&lt;pubDate&gt;Sun, 15 Feb 2026 14:54:58 +0000&lt;/pubDate&gt;
			&lt;guid&gt;https://paultibbetts.uk/2026/02/15/2026-02-15-145458/&lt;/guid&gt;
			&lt;description&gt;Launched: infra.paultibbetts.uk A documentation site for the infrastructure that runs paultibbetts.uk.&lt;/description&gt;
		&lt;/item&gt;
	&lt;/channel&gt;
&lt;/rss&gt;</code></pre>]]></content:encoded><source:markdown>
In my last post I recommended starting with RSS to make your site followable.

This is how to do that.

&lt;!--more--&gt;

## You might already have one

If you&#39;re using a static site generator like Hugo, or a CMS like WordPress, then you might already have an RSS feed.

If not, and you&#39;re writing your site manually, or just want to understand what&#39;s going on, here&#39;s what an RSS feed looks like.

## A minimal RSS feed

At a minimum an RSS feed contains:

```xml
&lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&gt;
&lt;rss version=&#34;2.0&#34;&gt;
  &lt;channel&gt;
    &lt;title&gt;Example Blog&lt;/title&gt;
    &lt;link&gt;https://example.com/&lt;/link&gt;
    &lt;description&gt;Updates from my blog.&lt;/description&gt;

    &lt;item&gt;
      &lt;title&gt;Hello World&lt;/title&gt;
      &lt;link&gt;https://example.com/hello-world&lt;/link&gt;
      &lt;description&gt;My first post.&lt;/description&gt;
    &lt;/item&gt;

  &lt;/channel&gt;
&lt;/rss&gt;
```

### Required

```xml
&lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&gt;
```

This line declares the XML version of the file and the encoding that it uses. `UTF-8` supports text and emoji.

It&#39;s strongly recommended to include this line so the file is read correctly.

```xml
&lt;rss version=&#34;2.0&#34;&gt;
```

This is the start of the `&lt;rss&gt;` element. The `version=&#34;2.0&#34;` tells consumers that the feed conforms to the RSS 2.0 specification, the most widely supported version.

```xml
&lt;channel&gt;
  &lt;title&gt;Example Blog&lt;/title&gt;
  &lt;link&gt;https://example.com/&lt;/link&gt;
  &lt;description&gt;Updates from my blog.&lt;/description&gt;
```

The `&lt;channel&gt;` declares the feed itself, so `&lt;title&gt;`, `&lt;link&gt;` and `&lt;description&gt;` are used to describe the feed and its contents.

These details should match what&#39;s displayed on your site and will show up for users when adding or managing your feed in their reader.

The `&lt;link&gt;` should point to the URL of the `&lt;channel&gt;`, which is the site itself.

```xml
&lt;item&gt;
  &lt;title&gt;Hello World&lt;/title&gt;
  &lt;link&gt;https://example.com/hello-world&lt;/link&gt;
  &lt;description&gt;My first post.&lt;/description&gt;
&lt;/item&gt;
```

The `&lt;item&gt;` tag is used for each post in the feed.

An `&lt;item&gt;` **must** contain at least one of:

- `&lt;title&gt;`
- `&lt;description&gt;`

which means you could do:

```xml
&lt;item&gt;
  &lt;title&gt;My first post&lt;/title&gt;
&lt;/item&gt;
```

which is valid, but not very useful, or:

```xml
&lt;item&gt;
  &lt;description&gt;Hello, World!&lt;/description&gt;
&lt;/item&gt;
```

which is also valid, and slightly more useful, if only for microblogs and notes and other posts without a title.

```xml
&lt;item&gt;
  &lt;title&gt;An example&lt;/title&gt;
  &lt;link&gt;https://example.com/posts/1&lt;/link&gt;
&lt;/item&gt;
```

Title + link is more practical, and may be all you need, but:

```xml
&lt;item&gt;
  &lt;title&gt;An example&lt;/title&gt;
  &lt;link&gt;https://example.com/posts/1&lt;/link&gt;
  &lt;description&gt;Hello, World!&lt;/description&gt;
&lt;/item&gt;
```

using all three is most common.

You could use the `&lt;description&gt;` for the summary of your post or for the whole thing.

There&#39;s no upper limit on the amount of `&lt;item&gt;`s you can include in a feed, but there are some practical things to consider:

- RSS does not do pagination
- - everything is listed in one file
- if the file gets really big then it takes longer to download
- - aim to keep it under 500KB
- maybe only show your latest posts if you have lots of them

### Optional

The fields mentioned above are all that is required for a minimal feed, but there are some optional extras that are recommended.

```xml
&lt;item&gt;
  ...
  &lt;guid isPermaLink=&#34;true&#34;&gt;
    https://example.com/posts/1
  &lt;/guid&gt;
&lt;/item&gt;
```

A `guid`, for &#34;Globally Unique IDentifier&#34;, gives each item in the feed a stable identity. This means feed readers can detect and remove duplicates correctly.

This is usually the permalink of the post. If so, `isPermaLink` defaults to true and can be omitted, however it it&#39;s not the permalink, like a database ID, or the exact datetime the post was published, you would change `isPermaLink` to `false`.

Note that the `L` in `PermaLink` is also capitalised.

```xml
&lt;item&gt;
  ...
  &lt;pubDate&gt;Sun, 1 Mar 2026 14:00:00 GMT&lt;/pubDate&gt;
&lt;/item&gt;
```

The `&lt;pubDate&gt;` is used to show when an item in the feed was published. It can help feed readers understand the order of your posts and should be added.

```xml
&lt;rss version=&#34;2.0&#34;
xmlns:atom=&#34;http://www.w3.org/2005/Atom&#34;&gt;
```

Changing the `&lt;rss&gt;` tag to include `xmlns:atom=&#34;http://www.w3.org/2005/Atom&#34;` is also optional but recommended.

This tells whatever is reading the feed that anything defined with `atom:` comes from the Atom specification, and lets you use extra tags defined by the Atom spec.

This isn&#39;t useful by itself, but it is used when you also add:

```xml
&lt;atom:link
href=&#34;https://example.com/index.xml&#34;
rel=&#34;self&#34;
type=&#34;application/rss+xml&#34; /&gt;
```

which defines the URL of the feed and helps feed readers know the canonical URL of the feed itself, which helps prevent duplicate subscriptions.

```xml
&lt;lastBuildDate&gt;Sun, 1 Mar 2026 14:00:00 GMT&lt;/lastBuildDate&gt;
```

The `&lt;lastBuildDate&gt;` can be used by feed readers to know if the feed has changed.

Set it to the date of the most recent post.

```xml
&lt;language&gt;en-gb&lt;/language&gt;
```

You should declare the language of the feed. It&#39;s small, but it&#39;s technically correct.

## Things to remember

RSS is pretty simple but dealing with XML means you have to remember a few things.

### XML must be well-formed

Writing an RSS feed is still writing XML, and so it must obey the rules of an XML file.

This means the file must not have any missing closing tags, or mix ups with the order in which you close them.

It also means you must handle special characters, otherwise the file is invalid and won&#39;t be understood.

For example:

```xml
&lt;title&gt;Special &amp; Character&lt;/title&gt;
```

won&#39;t work, because of the `&amp;`, which must be escaped:

```xml
&lt;title&gt;Special &amp;amp; Character&lt;/title&gt;
```

#### No unescaped HTML in the description

The same happens with the `&lt;description&gt;` tag, which usually holds the summary or the contents of the post, and must not include unescaped HTML characters.

The first option is to escape all of the HTML in the description:

```xml
&lt;description&gt;&amp;lt;p&amp;gt;Hello, World!&amp;lt;/p&amp;gt;&lt;/description&gt;
```

or the more common option is to wrap the HTML content in the description in a `CDATA` tag:

```xml
&lt;description&gt;&lt;![CDATA[
&lt;p&gt;Hello, World!&lt;/p&gt;
]]&gt;&lt;/description&gt;
```

where CDATA tells whatever is reading the XML file that everything inside this is raw text.

#### Dates must be written as RFC 822

If you do use `&lt;pubDate&gt;` or `&lt;lastBuildDate&gt;` to show dates you must ensure they are written using the [RFC 822 format](https://www.w3.org/Protocols/rfc822/#z28):

```xml
&lt;pubDate&gt;Sun, 1 Mar 2026 14:00:00 GMT&lt;/pubDate&gt;
```

### Serve the file with the correct Content-Type

When your server responds to a request to show the feed it should send:

```
Content-Type: application/rss+xml
```

so that feed readers recognise it as an RSS feed.

Most static web hosting handles this for you, I only mention it in case you are setting up a server and are messing with the Content-Type of the files you serve.

## How to check your feed

There are a few ways to check you&#39;ve written your feed correctly.

### Open it in a browser

The file should open and look similar to what you wrote it as. If it doesn&#39;t open, there&#39;s a problem, and if it shows an error then you need to fix it.

### Use a validator

You can use [validator.w3.org/feed](https://validator.w3.org/feed/) to validate your feed. It can work with the URL of your feed online or you can paste in its contents if you&#39;re still working on it.

### Add it to your reader

The best test is to add your own feed to your reader and check it looks the way you want.

Make sure it&#39;s showing in the order you expect and you can edit posts without making duplicates in your reader.

## Full example

Here is a condensed version of my own RSS feed, containing two articles and a note.

The note doesn&#39;t have a `&lt;title&gt;`, which influenced the URL used for its `&lt;guid&gt;`.

```xml
&lt;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34; standalone=&#34;yes&#34;?&gt;
&lt;rss version=&#34;2.0&#34;
	xmlns:atom=&#34;http://www.w3.org/2005/Atom&#34;&gt;
	&lt;channel&gt;
		&lt;title&gt;Paul Tibbetts&lt;/title&gt;
		&lt;link&gt;https://paultibbetts.uk/&lt;/link&gt;
		&lt;description&gt;Recent posts by Paul Tibbetts&lt;/description&gt;
		&lt;generator&gt;Hugo&lt;/generator&gt;
		&lt;language&gt;en-gb&lt;/language&gt;
		&lt;lastBuildDate&gt;Sun, 01 Mar 2026 12:41:46 +0000&lt;/lastBuildDate&gt;
		&lt;atom:link href=&#34;https://paultibbetts.uk/feed.xml&#34; rel=&#34;self&#34; type=&#34;application/rss+xml&#34; /&gt;
		&lt;item&gt;
			&lt;title&gt;How to create an RSS Feed&lt;/title&gt;
			&lt;link&gt;https://paultibbetts.uk/2026/03/01/how-to-create-an-rss-feed/&lt;/link&gt;
			&lt;pubDate&gt;Sun, 01 Mar 2026 16:33:46 +0000&lt;/pubDate&gt;
			&lt;guid&gt;https://paultibbetts.uk/2026/03/01/how-to-create-an-rss-feed/&lt;/guid&gt;
			&lt;description&gt;In my last post I recommended starting with RSS to make your site followable. This is how to do that.&lt;/description&gt;
		&lt;/item&gt;
		&lt;item&gt;
			&lt;title&gt;Ways to make your feed followable&lt;/title&gt;
			&lt;link&gt;https://paultibbetts.uk/2026/03/01/ways-to-make-your-feed-followable/&lt;/link&gt;
			&lt;pubDate&gt;Sun, 01 Mar 2026 11:36:03 +0000&lt;/pubDate&gt;
			&lt;guid&gt;https://paultibbetts.uk/2026/03/01/ways-to-make-your-feed-followable/&lt;/guid&gt;
			&lt;description&gt;You’ve got 3 posts on your site and you want people to be notified about new ones. Here’s all the ways I can think of doing that.&lt;/description&gt;
			&lt;/item&gt;
		&lt;item&gt;
			&lt;title&gt;2026-02-15 14:54:58&lt;/title&gt;
			&lt;link&gt;https://paultibbetts.uk/2026/02/15/2026-02-15-145458/&lt;/link&gt;
			&lt;pubDate&gt;Sun, 15 Feb 2026 14:54:58 +0000&lt;/pubDate&gt;
			&lt;guid&gt;https://paultibbetts.uk/2026/02/15/2026-02-15-145458/&lt;/guid&gt;
			&lt;description&gt;Launched: infra.paultibbetts.uk A documentation site for the infrastructure that runs paultibbetts.uk.&lt;/description&gt;
		&lt;/item&gt;
	&lt;/channel&gt;
&lt;/rss&gt;
```
</source:markdown></item><item>
      <title>Ways to make your feed followable</title>
      <link>https://paultibbetts-uk-feat-cooks.preview.lab.paultibbetts.uk/2026/03/01/ways-to-make-your-feed-followable/</link>
      <pubDate>Sun, 01 Mar 2026 11:36:03 +0000</pubDate>
      <guid>https://paultibbetts-uk-feat-cooks.preview.lab.paultibbetts.uk/2026/03/01/ways-to-make-your-feed-followable/</guid>
      <category>IndieWeb</category>
      <category>RSS</category>
      <description>You’ve got 3 posts on your site and you want people to be notified about new ones.
Here’s all the ways I can think of doing that.</description>
      <content:encoded><![CDATA[<p>You&rsquo;ve got 3 posts on your site and you want people to be notified about new ones.</p>
<p>Here&rsquo;s all the ways I can think of doing that.</p>
<h2 id="email">Email</h2>
<p>Some sites let you send out your posts as emails.</p>
<p>Don&rsquo;t do it. It can be tempting, because it&rsquo;s easy, but emails are for emails.</p>
<p>There are better options for your feed.</p>
<h2 id="rss">RSS</h2>
<p>RSS stands for &ldquo;Really Simple Syndication&rdquo;.</p>
<p>It&rsquo;s a standard format for publishing a feed so apps can subscribe to your updates.</p>
<p>Feed readers and podcast apps use it.</p>
<p>It looks a bit like this:</p>
<pre><code class="language-xml">&lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&gt;
&lt;rss version=&#34;2.0&#34;&gt;
  &lt;channel&gt;
    &lt;title&gt;RSS Example Site&lt;/title&gt;
    &lt;link&gt;https://example.com/&lt;/link&gt;
    &lt;description&gt;Example site description.&lt;/description&gt;

    &lt;item&gt;
      &lt;title&gt;Hello, World!&lt;/title&gt;
      &lt;link&gt;https://example.com/hello-world.html&lt;/link&gt;
      &lt;description&gt;My first post.&lt;/description&gt;
    &lt;/item&gt;

  &lt;/channel&gt;
&lt;/rss&gt;</code></pre>
<p>You would host a file like this, link to it from the <code>&lt;head&gt;</code> part of your pages, and readers would check it occasionally for updates.</p>
<p>Its simplicity means it&rsquo;s supported by almost all feed reading apps.</p>
<p>Because of this I&rsquo;d say RSS is the best starting point for letting users subscribe to your posts and is worth adding to your site first, before the other alternatives.</p>
<h2 id="atom">Atom</h2>
<p>RSS isn&rsquo;t the only way to create an XML feed. Atom is another standard which is more formally specified.</p>
<p>In the early 2000&rsquo;s, after Atom&rsquo;s launch, there was a time called the &ldquo;RSS vs Atom wars&rdquo;. There was no real winner. Atom was decided to be technically better, but by then RSS had already become dominant.</p>
<p>These days you can add a few Atom elements to your RSS feed, like a <code>rel=self</code> link, to get the best of both worlds.</p>
<h2 id="json">JSON</h2>
<p><a href="https://www.jsonfeed.org/">JSON feed</a>
 is the one of the newer standards. It works in the same way as RSS and Atom but the data is presented as JSON instead of XML.</p>
<p>Web development has moved on from XML and these days JSON-based things are much more common. The idea is that by using JSON we allow developers to build new things like feed readers using modern techniques and tooling, instead of ones used only for legacy publishing steps like an XML-based feed.</p>
<p>It looks a bit like this:</p>
<pre><code class="language-json">{
  &#34;version&#34;: &#34;https://jsonfeed.org/version/1.1&#34;,
  &#34;title&#34;: &#34;Example JSON Feed Site&#34;,
  &#34;home_page_url&#34;: &#34;https://example.com/&#34;,
  &#34;feed_url&#34;: &#34;https://example.com/feed.json&#34;,
  &#34;items&#34;: [
    {
      &#34;id&#34;: &#34;2026-02-28-153000&#34;,
      &#34;url&#34;: &#34;https://paultibbetts.uk/notes/2026-02-28-153000/&#34;,
      &#34;content_html&#34;: &#34;&lt;p&gt;Hello world&lt;/p&gt;&#34;,
      &#34;date_published&#34;: &#34;2026-02-28T15:30:00Z&#34;
    }
  ]
}</code></pre>
<p>JSON feed is already supported by many feed readers and, at least in theory, makes it easier than XML-based feeds to make new ones.</p>
<p>I&rsquo;d say it&rsquo;s worth adding to your site after you&rsquo;ve got an RSS feed, since those are more universally supported right now.</p>
<h2 id="microformats">Microformats</h2>
<p><a href="https://indieweb.org/microformats">Microformats</a>
 is a standard for marking up the contents of your posts, and in doing so makes your feed followable without any other files.</p>
<p>Classes like <code>h-entry</code> and <code>h-card</code> help others to understand the content you&rsquo;re publishing, and the <code>h-feed</code> class is used to identify feeds. This means readers using apps that understand microformats can subscribe to your content directly, without needing an XML or JSON file.</p>
<p>Right now most feed readers expect RSS or Atom feeds, so whilst I would suggest adding microformats, I would do it after adding an RSS feed.</p>
<h2 id="social-media">Social media</h2>
<p>There&rsquo;s also social media, where you would post a link to your content on another site, like Facebook or Instagram.</p>
<p>It&rsquo;s a great way to get your posts in front of users across the web on the apps they&rsquo;re already using, but it&rsquo;s no longer on your own site and you&rsquo;re now at the mercy of whatever the algorithms think of your content.</p>
<p>I&rsquo;d consider doing this as an extra, and only after making your own feed available.</p>
<p>For more information on posting out to social media the IndieWeb.org wiki has a great page called <a href="https://indieweb.org/POSSE">Publish Own Site, Syndicate Elsewhere (POSSE)</a>
.</p>
<h2 id="activitypub">ActivityPub</h2>
<p>Another option is to use the ActivityPub protocol for your content.</p>
<p>ActivityPub is what powers Fediverse apps like Mastodon and making your content available through it makes your site part of the Fediverse itself. Readers can then subscribe using whatever Fediverse app they want.</p>
<p>This involves a lot of work, and is difficult to implement for static sites, so hosted solutions like <a href="https://fed.brid.gy/">Bridgy Fed</a>
 can be used to do this for you.</p>
<h2 id="all-of-the-above">All of the above</h2>
<p>The best option could even be to do all of the above, to give your readers freedom to choose the method that works for them.</p>
<p>If you want the most compatible way to let others follow your posts: start with RSS.</p>
<p>Then add alternatives after.</p>]]></content:encoded><source:markdown>
You&#39;ve got 3 posts on your site and you want people to be notified about new ones.

Here&#39;s all the ways I can think of doing that.

&lt;!--more--&gt;

## Email

Some sites let you send out your posts as emails.

Don&#39;t do it. It can be tempting, because it&#39;s easy, but emails are for emails.

There are better options for your feed.

## RSS

RSS stands for &#34;Really Simple Syndication&#34;.

It&#39;s a standard format for publishing a feed so apps can subscribe to your updates.

Feed readers and podcast apps use it.

It looks a bit like this:

```xml
&lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&gt;
&lt;rss version=&#34;2.0&#34;&gt;
  &lt;channel&gt;
    &lt;title&gt;RSS Example Site&lt;/title&gt;
    &lt;link&gt;https://example.com/&lt;/link&gt;
    &lt;description&gt;Example site description.&lt;/description&gt;

    &lt;item&gt;
      &lt;title&gt;Hello, World!&lt;/title&gt;
      &lt;link&gt;https://example.com/hello-world.html&lt;/link&gt;
      &lt;description&gt;My first post.&lt;/description&gt;
    &lt;/item&gt;

  &lt;/channel&gt;
&lt;/rss&gt;
```

You would host a file like this, link to it from the `&lt;head&gt;` part of your pages, and readers would check it occasionally for updates.

Its simplicity means it&#39;s supported by almost all feed reading apps.

Because of this I&#39;d say RSS is the best starting point for letting users subscribe to your posts and is worth adding to your site first, before the other alternatives.

## Atom

RSS isn&#39;t the only way to create an XML feed. Atom is another standard which is more formally specified.

In the early 2000&#39;s, after Atom&#39;s launch, there was a time called the &#34;RSS vs Atom wars&#34;. There was no real winner. Atom was decided to be technically better, but by then RSS had already become dominant.

These days you can add a few Atom elements to your RSS feed, like a `rel=self` link, to get the best of both worlds.

## JSON

[JSON feed](https://www.jsonfeed.org/) is the one of the newer standards. It works in the same way as RSS and Atom but the data is presented as JSON instead of XML.

Web development has moved on from XML and these days JSON-based things are much more common. The idea is that by using JSON we allow developers to build new things like feed readers using modern techniques and tooling, instead of ones used only for legacy publishing steps like an XML-based feed.

It looks a bit like this:

```json
{
  &#34;version&#34;: &#34;https://jsonfeed.org/version/1.1&#34;,
  &#34;title&#34;: &#34;Example JSON Feed Site&#34;,
  &#34;home_page_url&#34;: &#34;https://example.com/&#34;,
  &#34;feed_url&#34;: &#34;https://example.com/feed.json&#34;,
  &#34;items&#34;: [
    {
      &#34;id&#34;: &#34;2026-02-28-153000&#34;,
      &#34;url&#34;: &#34;https://paultibbetts.uk/notes/2026-02-28-153000/&#34;,
      &#34;content_html&#34;: &#34;&lt;p&gt;Hello world&lt;/p&gt;&#34;,
      &#34;date_published&#34;: &#34;2026-02-28T15:30:00Z&#34;
    }
  ]
}
```

JSON feed is already supported by many feed readers and, at least in theory, makes it easier than XML-based feeds to make new ones.

I&#39;d say it&#39;s worth adding to your site after you&#39;ve got an RSS feed, since those are more universally supported right now.

## Microformats

[Microformats](https://indieweb.org/microformats) is a standard for marking up the contents of your posts, and in doing so makes your feed followable without any other files.

Classes like `h-entry` and `h-card` help others to understand the content you&#39;re publishing, and the `h-feed` class is used to identify feeds. This means readers using apps that understand microformats can subscribe to your content directly, without needing an XML or JSON file.

Right now most feed readers expect RSS or Atom feeds, so whilst I would suggest adding microformats, I would do it after adding an RSS feed.

## Social media

There&#39;s also social media, where you would post a link to your content on another site, like Facebook or Instagram.

It&#39;s a great way to get your posts in front of users across the web on the apps they&#39;re already using, but it&#39;s no longer on your own site and you&#39;re now at the mercy of whatever the algorithms think of your content.

I&#39;d consider doing this as an extra, and only after making your own feed available.

For more information on posting out to social media the IndieWeb.org wiki has a great page called [Publish Own Site, Syndicate Elsewhere (POSSE)](https://indieweb.org/POSSE).

## ActivityPub

Another option is to use the ActivityPub protocol for your content.

ActivityPub is what powers Fediverse apps like Mastodon and making your content available through it makes your site part of the Fediverse itself. Readers can then subscribe using whatever Fediverse app they want.

This involves a lot of work, and is difficult to implement for static sites, so hosted solutions like [Bridgy Fed](https://fed.brid.gy/) can be used to do this for you.

## All of the above

The best option could even be to do all of the above, to give your readers freedom to choose the method that works for them.

If you want the most compatible way to let others follow your posts: start with RSS.

Then add alternatives after.
</source:markdown></item>
  </channel>
</rss>
