podsync is a free, open source media & streaming project written in Go and released under MIT. It has 1,961 GitHub stars, 314 forks and 48 open issues, and was last pushed 21 hours ago. On this registry it ranks #21 of 34 tracked projects in Media & Streaming, with 5 head-to-head comparisons available.

What is podsync?

Podsync is a free, MIT-licensed Go service that turns YouTube or Vimeo channels, users, or playlists into podcast feeds, and it is built for people who want YouTube and Vimeo content delivered through a podcast client instead of the platforms' own apps.

What it is

Podsync is a self-hosted feed generator written in Go. It reads a list of feeds from a config.toml file, queries the YouTube or Vimeo API for new videos, downloads and optionally re-encodes them, and publishes the result as a standards-compliant podcast feed that any podcast application can subscribe to. It lives in the podcasting and media tooling ecosystem and functions as the bridge between video platforms that offer no feed and podcast clients that expect one.

The concrete problem it solves is delivery. Podcast applications provide automatic download of new episodes, remembering the last played position, synchronisation between devices, and offline listening, and none of that functionality is available on YouTube or Vimeo. Podsync replaces manual downloading, format conversion, and hand-built RSS feeds with a scheduled service that does all three. Configuration is per feed: video or audio output, high or low quality, maximum video height, and custom artwork, category, and language metadata.

Key capabilities

  • Pulls from YouTube and Vimeo channels, users, and playlists, configured under a [feeds] section with an ID and url key.
  • Encodes audio to mp3, with quality settings for video or audio output and a max video height option.
  • Schedules updates with cron expressions, documented in docs/cron.md.
  • Filters episodes by title and duration.
  • Cleans up old episodes, keeping the last X episodes only.
  • Exports subscriptions as OPML.
  • Runs configurable hooks for custom integrations and workflows.
  • Serves episode links through a hostname field so a deployment behind a reverse proxy such as nginx emits correct absolute URLs.
  • Updates yt-dlp automatically and supports API key rotation.

Who uses it and how

  • Self-hosters running it in Docker, which is the primary documented path; the image keeps data under /app/data/ when run that way.
  • NAS owners: a dedicated guide covers setting up Podsync on QNAP NAS hardware.
  • People wanting a cloud deployment: the project offers one-click deployment for AWS.
  • Operators behind a reverse proxy, who set hostname to the public URL while the server stays reachable on port 8080.
  • Users who need ARM support, or who run it on Windows, macOS, or Linux.

Getting started

Run the nightly image with docker run -it --rm ghcr.io/mxpv/podsync:nightly, or install the binary route dependencies with brew install yt-dlp ffmpeg go on macOS and create a config.toml using config.toml.example as the reference. A YouTube API key is required, and Vimeo requires an access token; the repository documents how to obtain both.

How it compares

The provided facts name no competing paid products that Podsync replaces, and no directly comparable tools either. On the evidence available here, it stands alone in this registry as a purpose-built YouTube-to-podcast and Vimeo-to-podcast feed generator, and the honest position is that it should be judged on its own feature list rather than against named alternatives.

When to use it — and when not to

A self-hoster must operate the service plus its dependencies, meaning yt-dlp, ffmpeg, and go for binary installations, along with local storage for downloaded media, a YouTube API key or Vimeo token, and whatever scheduling the cron setup implies. Anyone unwilling to obtain API credentials, keep yt-dlp current, or host media storage should not pick it. The repository also carries 48 open issues and the feature list documents YouTube and Vimeo only, so users who need other sources should verify support before committing, since the topic list mentions SoundCloud while the README's feature list does not.

project readme (upstream, from github) — read inline

Podsync

Podsync

Nightly GitHub release (latest SemVer) Go Report Card GitHub Sponsors Patreon

Podsync - is a simple, free service that lets you listen to any YouTube / Vimeo channels, playlists or user videos in podcast format.

Podcast applications have a rich functionality for content delivery - automatic download of new episodes, remembering last played position, sync between devices and offline listening. This functionality is not available on YouTube and Vimeo. So the aim of Podsync is to make your life easier and enable you to view/listen to content on any device in podcast client.

✨ Features

  • Works with YouTube and Vimeo.
  • Supports feeds configuration: video/audio, high/low quality, max video height, etc.
  • mp3 encoding
  • Update scheduler supports cron expressions
  • Episodes filtering (match by title, duration).
  • Feeds customizations (custom artwork, category, language, etc).
  • OPML export.
  • Supports episodes cleanup (keep last X episodes).
  • Configurable hooks for custom integrations and workflows.
  • One-click deployment for AWS.
  • Runs on Windows, Mac OS, Linux, and Docker.
  • Supports ARM.
  • Automatic yt-dlp self update.
  • Supports API keys rotation.

📋 Dependencies

If you're running the CLI as binary (e.g. not via Docker), you need to make sure that dependencies are available on your system. Currently, Podsync depends on yt-dlp , ffmpeg, and go.

On Mac you can install those with brew:

brew install yt-dlp ffmpeg go

📖 Documentation

🌙 Nightly builds

Nightly builds uploaded every midnight from the main branch and available for testing:

$ docker run -it --rm ghcr.io/mxpv/podsync:nightly

🔑 Access tokens

In order to query YouTube or Vimeo API you have to obtain an API token first.

⚙️ Configuration

You need to create a configuration file (for instance config.toml) and specify the list of feeds that you're going to host. See config.toml.example for all possible configuration keys available in Podsync.

Minimal configuration would look like this:

[server]
port = 8080

[storage]
  [storage.local]
  # Don't change if you run podsync via docker
  data_dir = "/app/data/"

[tokens]
youtube = "PASTE YOUR API KEY HERE" # See config.toml.example for environment variables

[feeds]
    [feeds.ID1]
    url = "https://www.youtube.com/channel/UCxC5Ls6DwqV0e-CYcAKkExQ"

If you want to hide Podsync behind reverse proxy like nginx, you can use hostname field:

[server]
port = 8080
hostname = "https://my.test.host:4443"

[feeds]
  [feeds.ID1]
  ...

Server will be accessible from http://localhost:8080, but episode links will point to https://my.test.host:4443/ID1/...

🌍 Environment Variables

Podsync supports the following environment variables for configuration and API keys:

Variable Name Description Example Value(s)
PODSYNC_CONFIG_PATH Path to the configuration file (overrides --config CLI flag) /app/config.toml
PODSYNC_YOUTUBE_API_KEY YouTube API key(s), space-separated for rotation key1 or key1 key2 key3
PODSYNC_VIMEO_API_KEY Vimeo API key(s), space-separated for rotation key1 or key1 key2
PODSYNC_SOUNDCLOUD_API_KEY SoundCloud API key(s), space-separated for rotation soundcloud_key1 soundcloud_key2
PODSYNC_TWITCH_API_KEY Twitch API credentials in the format CLIENT_ID:CLIENT_SECRET, space-separated for multi id1:secret1 id2:secret2

🚀 How to run

Build and run as binary:

Make sure you have created the file config.toml. Also note the location of the data_dir. Depending on the operating system, you may have to choose a different location since /app/data might be not writable.

$ git clone https://github.com/mxpv/podsync
$ cd podsync
$ make
$ ./bin/podsync --config config.toml

🗂️ One-time filename migration

If you changed filename_template and want to migrate already-downloaded files:

$ ./bin/podsync --config config.toml --migrate-filenames

Preview only (no writes):

$ ./bin/podsync --config config.toml --migrate-filenames --migrate-filenames-dry-run

Note: when storage.type = "s3", only dry-run mode is supported currently. Non-dry-run migration requires readable legacy files and should be run against local storage.

🐛 How to debug

Use the editor Visual Studio Code and install the official Go extension. Afterwards you can execute "Run & Debug" ▶︎ "Debug Podsync" to debug the application. The required configuration is already prepared (see .vscode/launch.json).

🐳 Run via Docker:

$ docker pull ghcr.io/mxpv/podsync:latest
$ docker run \
    -p 8080:8080 \
    -v $(pwd)/data:/app/data/ \
    -v $(pwd)/db:/app/db/ \
    -v $(pwd)/config.toml:/app/config.toml \
    ghcr.io/mxpv/podsync:latest

🐳 Run via Docker Compose:

$ cat docker-compose.yml
services:
  podsync:
    image: ghcr.io/mxpv/podsync
    container_name: podsync
    volumes:
      - ./data:/app/data/
      - ./db:/app/db/
      - ./config.toml:/app/config.toml
    ports:
      - 8080:8080

$ docker compose up

📦 How to make a release

Just push a git tag. CI will do the rest.

📄 License

This project is licensed under the MIT License - see the LICENSE file for details.

Fork Note

This fork adds the following features while maintaining compatibility with upstream mxpv/podsync:

  • Configurable filename_template for downloaded media and RSS enclosure paths
  • Optional one-time filename migration CLI (--migrate-filenames, --migrate-filenames-dry-run)

Frequently asked questions

Is podsync free to use?

podsync is open source under the MIT licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does podsync do?

Turn YouTube or Vimeo channels, users, or playlists into podcast feeds

What is podsync written in?

podsync is primarily written in Go. Its source is publicly available at https://github.com/mxpv/podsync, and it has 1,961 GitHub stars.