Why you can’t just block podcast ads
There is nothing to block. A web ad is a separate request your browser can refuse. A podcast ad is part of the same MP3 as the show.
It gets worse with dynamic ad insertion (DAI), which most big shows use now. The host stitches ads in at download time, so two people downloading the same episode get different ads at different timestamps. A crowdsourced timestamp database (the SponsorBlock model that works so well for YouTube) breaks here, because the timestamps in my download don’t match yours.
So the ad has to be found in your copy of the episode, every episode. That means listening to it, in the machine sense: transcribe, detect, cut.
MinusPod, the one I run
Full disclosure, and honestly the reason you should trust this page: MinusPod is a fork of podcast-server, a podcast ad removal server I built and open sourced. The fork grew into a more mature product than my original, with a review UI, a verification pass, and pattern learning that mine never had. So I switched to it. Not every day your own project gets out-built, but the result is the best tool in this space, so I’ll take it.
Here’s my instance after about nine months of running this kind of setup, currently 9 feeds and 3,357 known episodes:

That “Time Saved” number is real: almost 35 hours of ads I did not listen to.
What sets MinusPod apart from the simpler tools:
- A second pass - after cutting, it re-transcribes the output and asks the LLM “what doesn’t belong here”. Anything that survived the first pass gets folded into a re-cut.
- Pattern learning - confirmed ads become text patterns checked before the LLM runs. A repeat sponsor gets caught for free, no API call, so cost drops the longer it runs.
- Confidence gates - high-confidence detections are cut, borderline ones are held for your review instead of silently butchering the show.
- Beep instead of cut - per category (sponsor, self-promo, intro), you can replace a segment with a short tone instead of removing it. That keeps the episode’s original length, so timestamps in show notes still line up.
Here’s what it did to one feed. Planet Money, 325 episodes processed, 1,318 ads removed:

Setting it up
It ships as a prebuilt Docker image with a compose file in the repo. The minimum config is an LLM API key, your public base URL, and a passphrase that encrypts stored keys:
mkdir -p /opt/minuspod && cd /opt/minuspod
curl -O https://raw.githubusercontent.com/ttlequals0/MinusPod/main/docker-compose.yml
docker compose up -d
One catch as of this writing: the shipped compose file has an empty environment: key under the optional claude-wrapper service, and compose rejects the whole file for it. Comment that line out and it validates.
# .env
ANTHROPIC_API_KEY=<key> # or any OpenAI-compatible endpoint
BASE_URL=https://podcasts.example.com
MINUSPOD_MASTER_PASSPHRASE=<long random string>
OPENAI_MODEL=claude-haiku-4-5
WHISPER_MODEL=large-v3
WHISPER_DEVICE=cuda # or cpu
Three things I hit on a real install, so you don’t have to:
- A fresh install has no password and is fully open. Set one in Settings > Security before exposing it to anything.
- Set
MINUSPOD_MASTER_PASSPHRASEfrom day one. Without it your API keys sit in the database as plaintext. Adding it later works, but backups made after that need the passphrase to restore. - On plain HTTP, make sure
BASE_URLstarts withhttp://(or setSESSION_COOKIE_SECURE=falseon versions before 2.36), or the login cookie never sticks and it looks exactly like a wrong password.
A GPU is optional but makes a real difference. On my RTX 4060, Whisper transcribes at roughly 16x realtime, so an hour-long episode is done in about 4 minutes:

What it actually costs
The numbers nobody publishes. I run detection on claude-haiku-4-5, and a typical half-hour episode costs 5 to 11 cents to process:

My whole instance, every episode across 9 feeds since I set it up, sits at $43.93 in total LLM spend. Cost scales with episode length (the transcript goes to the LLM in overlapping windows, so a 3-hour show costs roughly 6x a 30-minute one), and it falls over time as learned patterns start catching repeat sponsors before the LLM is ever called.
One tip: don’t pick the biggest model you can afford. MinusPod’s own benchmark of 83 models ranks claude-haiku-4-5 first for this task, ahead of frontier models costing 5x more. Ad detection rewards tight timestamps and restraint, not deep reasoning. Small and cheap wins here.
Pro tip: process one feed first and watch the per-episode cost for a week before you backfill a 2,000-episode back catalogue.
Listening to the clean feeds
Any podcast app that accepts an RSS URL works. I subscribe to the rewritten feeds in Audiobookshelf and listen in SoundLeaf, which keeps everything (audiobooks and de-ad-ed podcasts) on my own hardware end to end. One Audiobookshelf-specific catch: its SSRF protection blocks requests to private addresses, so if MinusPod lives on your LAN you need its host in SSRF_REQUEST_FILTER_WHITELIST or the feed won’t load.
MinusPod also generates transcripts and chapters for the cut audio and puts them in the feed as Podcasting 2.0 tags. Player support is patchy (Audiobookshelf reads the chapters and ignores transcripts, as of 2.36), but the data is there as apps catch up.