selfhost.directory

The index of self-hostable projects — ranked, categorized and served with live updates.
Own your data and stop giving it to big tech.

GitHub
MinusPod logo

Self-host MinusPod

v2.100.18

Self-hosted podcast ad remover with AI-powered detection

ReleaseOpen SourceMIT
Updated9 hours ago
LanguagePython
Setup difficultyModerate
Stars
508
CPU
2 CPU cores
RAM
8 GB RAM (minimum)
Port
8000 (Main application HTTP port)
Docker
ttlequals0/minuspod
Install with Docker Compose
MinusPod dashboard on desktop showing feed management interfaceMinusPod mobile dashboard view

What is MinusPod?

A self-hosted podcast processing server that eliminates advertisements before episodes reach listeners. Episodes get transcribed using faster-whisper or NVIDIA Parakeet models locally, then an AI model identifies ad segments for removal. The system learns from corrections to recognize repeat sponsors efficiently. Users can integrate Anthropic Claude, Ollama, OpenRouter, System One, or any compatible OpenAI endpoint. Modified feeds output as re-cut RSS with versioned audio files, replacement sounds where cuts occur, loudness normalization, and lossless MP3 streaming when available.

Should you self-host MinusPod?

MinusPod scores 50/100 on selfhost.directory (how scoring works) and ranks #7 of 14 in Audio Streaming. It has 508 GitHub stars.

It shipped 11 stable releases in the past year. The latest, v2.100.24, came out on 27 October 2026. New versions land roughly every 1 days.

Setup is moderate: expect some configuration beyond a single command. An official Docker image is available. It is MIT-licensed and written mostly in Python.

Its closest alternative on selfhost.directory is Snapcast (72/100, 8 038 stars). It scores higher overall, so compare the two before you pick. See MinusPod vs Snapcast side by side.

MinusPod README

How to install MinusPod

Install MinusPod with Docker Compose

Environment variables
ANTHROPIC_API_KEY, OPENROUTER_API_KEY, LLM_PROVIDER, BASE_URL, MINUSPOD_MASTER_PASSPHRASE

1. Create environment file

cat > .env << EOF ANTHROPIC_API_KEY=your-key-here BASE_URL=http://localhost:8000 MINUSPOD_MASTER_PASSPHRASE=long-random-string-you-will-not-lose OPENAI_MODEL=claude-haiku-4-5 EOF

2. Create data directory

mkdir -p data

3. Run (pick one)

docker compose up -d # NVIDIA GPU image docker compose -f docker-compose.cpu.yml up -d # CPU image, no GPU needed

How to configure MinusPod

  • ANTHROPIC_API_KEY
  • ARTWORK_BADGE_POSITIONBadge corner: bottom-right (default), bottom-left, top-right, top-left

    Badge corner: bottom-right (default), bottom-left, top-right, top-left

  • ARTWORK_WATERMARK_ENABLED
  • AUTO_PROCESS_ENABLEDDeploy posture (env-backed: seed the initial state for fresh deploys)

    Deploy posture (env-backed: seed the initial state for fresh deploys)

  • BASE_URLhttp://localhost:8000Server Configuration (BASE_URL required before first boot)

    Server Configuration (BASE_URL required before first boot)

  • CHAPTER_BOUNDARY_MAX_TOKENS
  • CHAPTER_BOUNDARY_REASONING_BUDGET
  • CHAPTER_BOUNDARY_REASONING_LEVEL
  • CHAPTER_BOUNDARY_TEMPERATUREChapter Boundary Detection

    Chapter Boundary Detection

  • CHAPTER_TITLE_MAX_TOKENS
  • CHAPTER_TITLE_REASONING_BUDGET
  • CHAPTER_TITLE_REASONING_LEVEL
  • CHAPTER_TITLE_TEMPERATUREChapter Title Generation

    Chapter Title Generation

  • DETECTION_MAX_TOKENS
  • DETECTION_REASONING_LEVELDETECTION_REASONING_BUDGET= # Anthropic only, 1024-65536

    DETECTION_REASONING_BUDGET= # Anthropic only, 1024-65536

  • DETECTION_TEMPERATUREAd Detection (Pass 1)

    Ad Detection (Pass 1)

  • FEED_AUTH_ENABLED
  • LLM_PROVIDERanthropicOption 1: Anthropic (default), direct Claude API access

    Option 1: Anthropic (default), direct Claude API access

  • MAX_AUDIO_DOWNLOAD_MBSize caps (env-backed: these seed the defaults; values saved in Settings win)

    Size caps (env-backed: these seed the defaults; values saved in Settings win)

  • MINUSPOD_ALLOW_PUBLIC_PROCESSINGKeep public podcast clients from starting paid processing. A valid global or feed-scoped subscriber credential can still start processing.

    Keep public podcast clients from starting paid processing. A valid global or feed-scoped subscriber credential can still start processing.

  • MINUSPOD_BIND_ADDRESSBind only to a private interface when an ingress proxy is the sole caller.

    Bind only to a private interface when an ingress proxy is the sole caller.

  • MINUSPOD_MASTER_PASSPHRASEStrongly recommended before first boot: unlocks encrypted storage for provider API keys. Without it, keys are stored as plaintext.

    Strongly recommended before first boot: unlocks encrypted storage for provider API keys. Without it, keys are stored as plaintext.

  • MINUSPOD_MAX_ARTWORK_BYTES
  • MINUSPOD_MAX_RSS_BYTES
  • MINUSPOD_PORTInternal listen port. Default 8000. Useful for host networking or running multiple instances on one host. Ignored when GUNICORN_BIND is set.

    Internal listen port. Default 8000. Useful for host networking or running multiple instances on one host. Ignored when GUNICORN_BIND is set.

  • MINUSPOD_REQUIRE_AUTHCompose refuses protected API access until an application password is set. Remote first-password setup requires this one-time header value; remove it after setup. Loopback setup does not require a token.

    Compose refuses protected API access until an application password is set. Remote first-password setup requires this one-time header value; remove it after setup. Loopback setup does not require a token.

  • MINUSPOD_SETUP_TOKEN
  • MINUSPOD_TRUSTED_PROXY_COUNTTrusted-proxy hop count. 0 = no proxy (default). Set to 1 when running behind Cloudflare / cloudflared / nginx / Traefik so the login lockout keys on the real client IP from X-Forwarded-For instead of the proxy loopback. Required when enabling the tunnel profile in docker-compose.yml.

    Trusted-proxy hop count. 0 = no proxy (default). Set to 1 when running behind Cloudflare / cloudflared / nginx / Traefik so the login lockout keys on the real client IP from X-Forwarded-For instead of the proxy loopback. Required when enabling the tunnel profile in docker-compose.yml.

  • OLLAMA_NUM_CTXOllama context window (Ollama provider only) Default Ollama context is small (often 2048) and silently truncates long prompts. Set this to the model's trained context limit (8192 or higher for most modern models).

    Ollama context window (Ollama provider only) Default Ollama context is small (often 2048) and silently truncates long prompts. Set this to the model's trained context limit (8192 or higher for most modern models).

  • OMP_NUM_THREADSOptional: local CPU transcription tuning on hybrid Intel CPUs (12th gen and newer). Cap OpenMP threads to your performance-core count so work stays off the E-cores. See docs/installation.md for P-core pinning. No effect with a remote Whisper API.

    Optional: local CPU transcription tuning on hybrid Intel CPUs (12th gen and newer). Cap OpenMP threads to your performance-core count so work stays off the E-cores. See docs/installation.md for P-core pinning. No effect with a remote Whisper API.

  • OPENAI_API_KEY
  • OPENAI_BASE_URL
  • OPENAI_MODEL
  • OPENROUTER_API_KEY
  • PODCAST_INDEX_API_KEYPodcast Discovery (optional) PodcastIndex.org API credentials for podcast search Get free API credentials at https://api.podcastindex.org

    Podcast Discovery (optional) PodcastIndex.org API credentials for podcast search Get free API credentials at https://api.podcastindex.org

  • PODCAST_INDEX_API_SECRET
  • RATE_LIMIT_STORAGE_URIExact cross-worker rate limits require Redis and a reachable Redis URI.

    Exact cross-worker rate limits require Redis and a reachable Redis URI.

  • RETENTION_PERIODRetention period in minutes (legacy, prefer Settings UI)

    Retention period in minutes (legacy, prefer Settings UI)

  • REVIEWER_MAX_TOKENS
  • REVIEWER_REASONING_BUDGET
  • REVIEWER_REASONING_LEVEL
  • REVIEWER_TEMPERATUREReviewer (applies to both reviewer pass 1 and reviewer pass 2)

    Reviewer (applies to both reviewer pass 1 and reviewer pass 2)

  • SESSION_COOKIE_SECUREFollow BASE_URL for the Secure cookie flag. Explicit true or false overrides.

    Follow BASE_URL for the Secure cookie flag. Explicit true or false overrides.

  • SYSTEMONE_API_KEY
  • SYSTEMONE_BASE_URL
  • TUNNEL_TOKENCloudflare tunnel (optional, for remote access)

    Cloudflare tunnel (optional, for remote access)

  • TYPESAFE_API_KEY
  • VERIFICATION_MAX_TOKENS
  • VERIFICATION_REASONING_BUDGET
  • VERIFICATION_REASONING_LEVEL
  • VERIFICATION_TEMPERATUREVerification (Ad Detection Pass 2)

    Verification (Ad Detection Pass 2)

  • WHISPER_API_BASE_URL
  • WHISPER_API_KEY
  • WHISPER_API_MODEL
  • WHISPER_BACKENDSelect local, parakeet, or openai-api; Parakeet has one fixed model. Remote API example (Groq, OpenAI, whisper.cpp):

    Select local, parakeet, or openai-api; Parakeet has one fixed model. Remote API example (Groq, OpenAI, whisper.cpp):

  • WHISPER_COMPUTE_TYPE
  • WHISPER_DEVICE
  • WHISPER_LANGUAGE
  • WHISPER_MODELLocal defaults come from Compose: GPU uses small/cuda; CPU uses tiny/cpu. WHISPER_MODEL and WHISPER_COMPUTE_TYPE apply to faster-whisper only.

    Local defaults come from Compose: GPU uses small/cuda; CPU uses tiny/cpu. WHISPER_MODEL and WHISPER_COMPUTE_TYPE apply to faster-whisper only.

MinusPod releases & version history

More in Audio Streaming

Rate this project

Click to rate — no account needed.

0 comments

Posting as guest
Loading comments…