Independent technical referenceSystem / content / protocol / route

Protocols / syndication

RSS and Atom for blog engines

Entry abstractFeeds turn a site into a sequence readers and machines can follow without polling every page in full.
Abstract streams of feed items branching from a server toward several blank reader devices

A web feed is a compact, ordered view of a publication. It lets readers discover new entries, lets software move content between systems and gives each item a machine-readable identity. RSS 2.0 and Atom 1.0 solve that job with different vocabularies, but both reward the same discipline: stable links, clear dates and valid markup.

RSS 2.0: channel and items

An RSS document wraps publication metadata in a channel and individual entries in item elements. The current RSS 2.0 specification defines required channel elements and the optional item vocabulary. A typical blog item carries a title or description, a link, a publication date and a guid.

<item>
  <title>A durable entry title</title>
  <link>https://example.test/entry</link>
  <guid isPermaLink="true">https://example.test/entry</guid>
  <description>A concise summary.</description>
</item>

The guid is an identity, not merely decoration. If an engine changes it on every render, readers may treat an old entry as new. When a URL is used as the identifier, a permalink change affects both the web page and every subscriber's understanding of the item.

Atom 1.0: explicit identity and timestamps

Atom uses a namespace-qualified feed containing entry elements. RFC 4287 specifies the format and gives prominent roles to id, title and updated. Atom distinguishes an entry's stable identifier from its alternate HTML link, which can make migrations easier when used consistently.

<entry xmlns="http://www.w3.org/2005/Atom">
  <id>urn:uuid:example-entry-id</id>
  <title>A durable entry title</title>
  <updated>2026-09-09T12:00:00Z</updated>
  <link rel="alternate" href="https://example.test/entry" />
</entry>

Discovery belongs in HTML

A feed is easier to find when each page advertises it with a link element in the document head. The relation is alternate, the type identifies RSS or Atom, and the URL should be absolute or reliably rooted. A site may offer one main feed plus category feeds, but each extra feed adds a promise that its address and item identities will remain stable.

Conditional requests are part of feed design

Feed readers may check often even when nothing has changed. HTTP validators let the server answer efficiently. An ETag or Last-Modified value gives the client something to send back in a conditional request; an unchanged representation can then receive a not-modified response rather than the whole document. The semantics of validators and conditional requests are defined in HTTP Semantics.

The validator must describe the feed representation, not simply the current clock. A useful ETag can be derived from the rendered bytes or a version that changes whenever the feed content changes. A useful last-modified time normally tracks the newest meaningful feed change. Incorrect validators can make readers miss updates or download the same content repeatedly.

Validate the consumer view

Opening XML in a browser is not the final test. Use a validator during development, then subscribe with more than one reader and inspect the actual title, summary, date, link and update behavior. Test an unchanged poll, a newly published entry and an edited old entry. The consumer view catches identity and caching mistakes that well-formed XML alone cannot reveal.

Migration tests for feeds

Feeds are often the oldest active API a blog operates. Treat them as a public compatibility surface, and connect their identifiers to the permalink plan.