Sign inSign up

fnayou/podcastify

By fnayou

•Updated 4 months ago

Create private podcast feeds from your own MP3s with zero fuss.

Image
0

1.8K

fnayou/podcastify repository overview

⁠Podcastify — tiny self-hosted podcast RSS generator

Create private podcast feeds from your own MP3s with minimal setup. Drop MP3s into a folder, add a simple YAML file, and Podcastify builds an iTunes-compatible RSS feed. One container serves your RSS and media (Caddy + Python).


⁠Features

  • Simple layout: ./podcasts/*.yaml for configs, ./public/<name>/ for media and images.
  • Auto-discovery of episodes if you omit the episodes: list.
  • MP3 duration extraction via ffprobe (falls back gracefully).
  • iTunes fields: author, owner, subtitle, summary, explicit, categories, episode types, seasons.
  • Clean XML: stable GUIDs (SHA-1), configurable language, empty tags rather than empty CDATA.
  • Single container image: Caddy (static hosting) + Python generator.
  • Configurable ports: choose any host port via environment/compose.
  • Multi-arch image: linux/amd64 and linux/arm64.

⁠Quick start

# choose host port and base URL
export HOST_PORT=1234
export PUBLIC_BASE_URL="http://localhost:${HOST_PORT}"

docker run --rm   
  -e PORT=8080
  -e PUBLIC_BASE_URL="${PUBLIC_BASE_URL}"
  -p ${HOST_PORT}:8080
  -v "$(pwd)/public:/app/public"
  -v "$(pwd)/podcasts:/app/podcasts"
  fnayou/podcastify:v1.0.0
⁠docker-compose.yml
services:
  podcastify:
    image: fnayou/podcastify:v1.0.0
    ports:
      - "${HOST_PORT:-8080}:${PORT:-8080}"
    environment:
      - PORT=${PORT:-8080}
      - PUBLIC_BASE_URL=${PUBLIC_BASE_URL:-http://localhost:${HOST_PORT:-8080}}
      - PODCASTS_ROOT=/app/podcasts
      - PUBLIC_ROOT=/app/public
      - RUN_ON_START=${RUN_ON_START:-true}
      - PUBLISH_XML=${PUBLISH_XML:-true}
    volumes:
      - ./public:/app/public
      - ./podcasts:/app/podcasts
    restart: unless-stopped

Create a .env file to set HOST_PORT and PUBLIC_BASE_URL for your environment.

For production behind a reverse proxy at https://podcasts.domain.tld, set PUBLIC_BASE_URL=https://podcasts.domain.tld and forward to the container’s ${PORT} (default 8080).


⁠Volumes and layout

  • Put configs in ./podcasts as name-podcast.yaml (e.g., myshow-podcast.yaml).
  • Put media in ./public/<name>/ (MP3s and optional images).
  • Generated feed is written to ./public/<name>.xml.

⁠Environment

  • PUBLIC_BASE_URL – required for correct links in the RSS (e.g., http://localhost:1234 or https://podcasts.domain.tld)
  • PORT – container listen port (Caddy), default 8080
  • HOST_PORT – host port you publish in compose (HOST_PORT:PORT mapping)

Advanced:

  • PODCASTS_ROOT – in-container path for podcast YAMLs (default /app/podcasts)
  • PUBLIC_ROOT – in-container path for public files (default /app/public)
  • RUN_ON_START – run the generator at container start (true/false, default true)
  • PUBLISH_XML – write XML feeds to disk (true/false, default true)

⁠Tags

  • v1.0.0 – current stable release
  • Future releases will follow vX.Y.Z semantic versioning.

For deterministic deployments, pin to a version tag (e.g., v1.0.0).


⁠Security and updates

  • Built for linux/amd64 and linux/arm64 from an Alpine base.
  • Enable vulnerability scanning for this image in Docker Hub and review scan results for each release.
  • When vulnerabilities are reported in base images, pull the latest base and rebuild.

Tag summary

Content type

Image

Digest

sha256:eca43b573…

Size

90.3 MB

Last updated

4 months ago

docker pull fnayou/podcastify