1. Check a feed
Get this by opening your feed URL in a browser tab and using "View Page Source" or "Save As", or with curl -s <your-feed-url>.
2. Results
Prefer a CLI, or want this as a CI gate?
The CLI fetches your feed URL for real, over HTTP — no cross-origin restriction, because it isn't a browser:
node check.mjs https://example.com/feed.xml --json node check.mjs https://example.com/feed.xml --timeout 20000
Get check.mjs, fetch-feed.mjs, feed-parser.mjs, and engine.mjs from the repo — plain Node 18+, nothing to install. It only ever talks to the feed URL you give it — nothing goes through this site. Exit code 1 when a danger-severity finding is produced or the feed could not be fetched.
What's checked
| Check | What it flags | Severity |
|---|---|---|
| Missing channel title / description / language / link | RSS 2.0 spec and Apple Podcasts required elements | Danger |
| Missing or unrecognized itunes:category | Required for Apple Podcasts submission; checked against Apple's documented top-level list | Danger / Notice |
| Missing or invalid itunes:explicit | Must be the current boolean true/false format | Danger / Notice |
| Missing itunes:image, or wrong file extension | Cover artwork required for submission | Danger / Notice |
| Missing atom:link rel=self | Feed-portability best practice | Notice |
| Episode missing title / enclosure / pubDate | Required per-episode elements | Danger |
| pubDate not in RFC 822 format | The RSS 2.0 spec's required date format | Danger |
| Duplicate item guid | Documented cause of an episode disappearing or reappearing as new | Danger |
| guid marked as a permalink but not a URL | isPermaLink defaults to true; a non-URL value should set it false | Notice |
More: why podcast feeds fail validation, and the two bugs that cost the most. See also: how this differs from the W3C Feed Validator.
Common questions
Why does Apple Podcasts reject or silently ignore my episode?
Almost always a specific, documented feed-spec violation: a missing required element (itunes:category, itunes:explicit, cover artwork), an item missing its enclosure or pubDate, or a pubDate that is not in the RFC 822 format the RSS 2.0 spec requires. Apple Podcasts' own feed processor is strict about these — this tool checks your feed against the same documented rules before you submit or re-submit.
Why did an old episode reappear as new, or disappear entirely?
The most common documented cause is a duplicate <guid> value across two items. Podcast apps use guid to decide whether an item is one they have already shown a subscriber — if a feed generator reuses a guid (or falls back to an unstable one), an app can treat a later item as an update to an earlier one, making it vanish, or resurface an old episode as unseen.
Why can't this page fetch my feed URL itself?
A browser page's fetch() to a different origin is blocked by CORS unless that server explicitly opts in with an Access-Control-Allow-Origin header — most podcast hosts do not set this for arbitrary third-party pages, since a feed being reachable does not mean its owner meant for any website to read it client-side. Rather than fail silently for feeds that do not opt in, this page always works from pasted XML. The zero-dependency CLI has no such restriction because it isn't a browser tab — it makes one real HTTP request directly to the feed URL.
Is this a full Apple Podcasts submission checklist?
No. It checks specific, mechanically verifiable properties of the feed XML you provide — required elements, format validity, and duplicate/unstable guids. It is not a guarantee Apple, Spotify, or any other podcast app will accept or display your show, and it does not check account-level submission steps.