
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
- Keep the feed URL or redirect it directly to the new canonical feed.
- Preserve item identifiers even when the rendering engine changes.
- Retain publication dates and distinguish them from later updates.
- Verify XML namespaces, escaping and declared content types.
- Test enclosures and media URLs independently from entry pages.
- Compare the newest items before and after migration.
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.