Clean and dedupe an OPML podcast list

Paste or upload OPML, review duplicate subscriptions, flag missing or invalid feed links, and export a cleaner file. Everything runs locally in your browser.

Drop an OPML file here or click to browse .opml, .xml, or .txt
or paste OPML
What transfers

OPML is a subscription list

OPML moves supported podcast subscription lists between apps. Playback history, progress, downloads, queue order, account data, private app state, and app-specific settings may not transfer.

Why OPML Files Accumulate Duplicates (and How to Prevent It)

Duplicate subscriptions in an OPML file almost always trace back to the same handful of causes. Re-exporting from an app you've used for years and merging that fresh file with an older backup you never fully deleted is the most common one by far. Another frequent cause is a feed URL change: when a podcast moves hosting providers, its RSS URL sometimes changes entirely while the show's title stays identical, so an app that dedupes strictly by feed URL will treat the old and new entries as two completely different shows even though they're really one podcast under a new address.

That's also exactly why title-based matching, while useful as a fallback, isn't foolproof on its own -- small formatting differences like trailing whitespace, stray punctuation, or a show renaming itself slightly between seasons will break an otherwise exact title match entirely. A cleanup pass that checks both the normalized feed URL and a normalized title catches meaningfully more real duplicates than either check would alone, which is why this tool runs both methods and clearly shows you which one flagged each specific match it found, so you can judge borderline cases yourself instead of trusting an automated merge blindly.

Before importing a cleaned file into a brand new app, it's worth spot-checking at least a few entries rather than trusting the automated pass blindly: confirm the duplicate you kept actually has a working xmlUrl attached to it, and don't simply assume the first entry listed in a group is automatically the right one to keep if that particular feed has since moved to a new host or address entirely without any redirect in place.

Entries missing a valid xmlUrl are excluded from the cleaned export entirely, since an outline without a working feed URL isn't a usable subscription in the destination app at all -- it's just dead weight carried forward from years of accumulated exports and re-imports. Once the list is genuinely clean, importing it into The Podcast App on either iOS or Android takes seconds, and the app's own duplicate handling on import adds one more layer of protection on top of whatever this tool already caught.

Further reading

Sources and further reading

FAQ

OPML cleanup notes

The tool compares normalized RSS feed URLs first. If a feed URL is missing or unusable, it falls back to a normalized podcast title so you can review likely duplicates manually.

No. Parsing, duplicate detection, preview, copy, and download all run in the browser. The tool does not upload your OPML to a server.

Removed subscriptions and entries without a valid http or https RSS feed URL are excluded. Entries with an invalid website URL are kept if the feed URL itself is valid, but the invalid website field is omitted from export.

App connection

Clean the portable subscription layer before switching apps.

The cleanup tool supports the same OPML boundary as The Podcast App: subscriptions can move, but progress, downloads, queue order, account data, and private app state usually do not. Cleaning duplicates before import keeps the first app session easier to review and prevents stale feeds from making a new podcast library feel broken on day one.