--- title: "Feed content hygiene" category: foundations status: recommended url: https://webspecification.com/spec/foundations/feed-hygiene/ updated: "2026-05-29T15:19:28.000Z" sources: - title: "RSS 2.0 Specification" url: "https://www.rssboard.org/rss-specification" publisher: "RSS Advisory Board" - title: "RSS Best Practices Profile" url: "https://www.rssboard.org/rss-profile" publisher: "RSS Advisory Board" - title: "RFC 4287 — The Atom Syndication Format" url: "https://www.rfc-editor.org/rfc/rfc4287" publisher: "IETF" - title: "RDF Site Summary 1.0 Modules: Syndication" url: "https://web.resource.org/rss/1.0/modules/syndication/" publisher: "RSS-DEV Working Group" - title: "RFC 5005 — Feed Paging and Archiving" url: "https://www.rfc-editor.org/rfc/rfc5005" publisher: "IETF" - title: "W3C Feed Validation Service" url: "https://validator.w3.org/feed/" publisher: "W3C" source_repo: undefined licence: CC-BY-4.0 --- # Feed content hygiene > If you publish a feed, ship it well-formed. Identify the feed inside itself with atom:link rel="self", give every item a stable guid, declare an update cadence with the Syndication module, and validate before deploy. ## What it is [`Feed discovery`](/spec/foundations/feed-discovery/) tells the world *where* your feed is. Feed hygiene is about whether the feed itself is well-formed once they fetch it. Aggregators, feed readers, and AI agents all behave better — and waste fewer of your bytes — when the channel identifies itself, every item has a stable identifier, and the publishing cadence is declared. The conventions are old and stable. The base specs are RSS 2.0 (RSS Advisory Board), RFC 4287 (Atom), and JSON Feed 1.1. The practical layer — what makes a feed actually portable — lives in the *RSS Best Practices Profile*, which both the [W3C Feed Validation Service](https://validator.w3.org/feed/) and the RSS Validator use to flag warnings. ## Why it matters - **Self-identification (`atom:link rel="self"`)** makes a feed portable. If the feed is mirrored, cached, or sent to you by a friend, every reader can still find the canonical subscription URL. - **Stable, unique ``** lets aggregators detect updates without re-displaying old items. Get this wrong and every refresh re-floods subscribers with duplicates. - **`sy:updatePeriod` and `sy:updateFrequency`** tell polite aggregators how often to poll. A weekly blog declaring `daily` cadence wastes bandwidth on both sides; declaring `hourly` invites unnecessary load. - **``** lets a reader skip parsing when nothing has changed. - **Paging headers (RFC 5005)** keep archive feeds usable. Without `rel="next"`/`rel="prev"`, anything past the first page is invisible to readers that follow links. The cost of getting these right is one-time and small. The cost of getting them wrong shows up as duplicate posts in every reader, weeks of stale entries, or 100× more polling traffic than you intended. ## How to implement Declare the Atom and Syndication namespaces on the `` root, then ship a self-link, channel metadata, and per-item GUIDs: ```xml Example — Posts https://example.com/ Engineering writing from the Example team. en-GB Mon, 27 May 2026 09:00:00 GMT daily 1 Shipping the new search https://example.com/blog/new-search/ https://example.com/blog/new-search/ Mon, 27 May 2026 09:00:00 GMT Why we rebuilt search on Pagefind. ``` Key points: - **`atom:link rel="self"`** must point at the canonical URL of the feed itself. Both feed validators flag its absence as a warning. - **``** is the simplest correct form when the URL never changes. If the URL is unstable, use `isPermaLink="false"` with a tag URI: `tag:example.com,2026:post/123`. Once chosen, **the GUID for an item must never change** — that is the identifier readers key off. - **`sy:updatePeriod`** accepts `hourly`, `daily`, `weekly`, `monthly`, `yearly`. `sy:updateFrequency` is a positive integer (count per period). A site updating twice a day declares `daily2`. - **Dates** use RFC 822 format (`Mon, 27 May 2026 09:00:00 GMT`). Atom uses RFC 3339. - **For archive feeds**, add RFC 5005 paging: ```xml