tubesync is a free, open source digital asset management (dam) project written in Python and released under AGPL-3.0. It has 2,794 GitHub stars, 171 forks and 58 open issues, and was last pushed 6 hours ago. On this registry it ranks #12 of 25 tracked projects in Digital Asset Management (DAM), with 5 head-to-head comparisons available.

What is tubesync?

What it is

TubeSync is a self-hosted personal video recorder for YouTube. It synchronizes YouTube channels and playlists into local directories, then updates a connected media server after downloads complete. The project lives in the self-hosted media-server ecosystem, where users keep downloaded video and audio files available through services such as Jellyfin or Plex.

TubeSync solves the problem of keeping selected YouTube sources available locally without manually invoking yt-dlp and ffmpeg for each video. It wraps those tools in a web interface and task scheduler, organizes downloads into media and thumbnail storage, and retries failed downloads over time. This gives users a continuous local copy of chosen channels and playlists.

Key capabilities

  • TubeSync tracks YouTube channels and playlists as sources and keeps them synchronized to local directories.
  • It uses yt-dlp and ffmpeg internally, with a task scheduler that handles download jobs.
  • It separates downloaded files into video and audio subdirectories based on whether the media has a video stream.
  • It can update Jellyfin or Plex after media is downloaded, completing a personal video recorder workflow.
  • It provides a web interface for administration, including dashboards for sources and media.
  • It retries failed downloads with back-off timers, so temporary failures can recover without immediate manual intervention.

Who uses it and how

  • Self-hosters run TubeSync in Docker or Podman to synchronize chosen YouTube channels and playlists to local storage.
  • Media-server users add Jellyfin or Plex as an optional destination, so downloaded videos appear in the connected media server.
  • Users who want audio-only YouTube content, such as music, can let TubeSync store it in the audio directory.
  • Operators manage sources, media, and failed downloads through the web dashboard instead of repeated command-line downloads.

Getting started

Install TubeSync by pulling ghcr.io/meeb/tubesync:latest and running it with Docker or Podman, or by adding it to a Docker Compose stack. Typical setup creates config and download directories, sets PUID, PGID, and TZ, maps port 4848, and opens http://localhost:4848 to add sources.

When to use it — and when not to

TubeSync is useful when a user wants an automated local archive of YouTube sources and already operates a media server such as Jellyfin or Plex. A self-hoster must provide container runtime, storage for downloads and thumbnails, and permission settings for config and media directories, while accepting that high-resolution downloads can become very large. It is less suitable when someone needs support for media servers other than Jellyfin or Plex, or when they do not want to operate containers, storage, and retry behavior.

project readme (upstream, from github) — read inline

TubeSync

TubeSync is a PVR (personal video recorder) for YouTube. Or, like Sonarr but for YouTube (with a built-in download client). It is designed to synchronize channels and playlists from YouTube to local directories and update your media server once media is downloaded.

If you want to watch YouTube videos in particular quality or settings from your local media server, then TubeSync is for you. Internally, TubeSync is a web interface wrapper on yt-dlp and ffmpeg with a task scheduler.

There are several other web interfaces to YouTube and yt-dlp all with varying features and implementations. TubeSync's largest difference is full PVR experience of updating media servers and better selection of media formats. Additionally, to be as hands-free as possible, TubeSync has gradual retrying of failures with back-off timers so media which fails to download will be retried for an extended period making it, hopefully, quite reliable.

Latest container image

ghcr.io/meeb/tubesync:latest

Screenshots

Click to expand screenshots

Dashboard

TubeSync Dashboard

Sources overview

TubeSync sources overview

Source details

TubeSync source details

Media overview

TubeSync media overview

Media details

TubeSync media-details

Requirements

For the easiest installation, you will need an environment to run containers such as Docker or Podman. You will also need as much space as you want to allocate to downloaded media and thumbnails. If you download a lot of media at high resolutions this can be very large.

What to expect

Once running, TubeSync will download media to a specified directory. Inside this directory will be a video and audio subdirectories. All media which only has an audio stream (such as music) will download to the audio directory. All media with a video stream will be downloaded to the video directory. All administration of TubeSync is performed via a web interface. You can optionally add a media server, currently only Jellyfin or Plex, to complete the PVR experience.

Installation

TubeSync is designed to be run in a container, such as via Docker or Podman. It also works in a Docker Compose stack. amd64 (most desktop PCs and servers) and arm64 (modern ARM computers, such as the Raspberry Pi 3 or later) are supported.

Example (with Docker on *nix):

First find the user ID and group ID you want to run TubeSync as, if you're not sure what this is it's probably your current user ID and group ID:

$ id
# Example output, in this example, user ID = 1000, group ID = 1000
# id uid=1000(username) gid=1000(username) groups=1000(username),129(docker)

You can find your local timezone name here:

https://en.wikipedia.org/wiki/List_of_tz_database_time_zones

If unset, TZ defaults to UTC.

Next, create the directories you're going to use for config data and downloads:

$ mkdir /some/directory/tubesync-config
$ mkdir /some/directory/tubesync-downloads

Finally, download and run the container:

# Pull image
$ docker pull ghcr.io/meeb/tubesync:latest
# Start the container using your user ID and group ID
$ docker run \
  -d \
  --name tubesync \
  -e PUID=1000 \
  -e PGID=1000 \
  -e TZ=Europe/London \
  -v /some/directory/tubesync-config:/config \
  -v /some/directory/tubesync-downloads:/downloads \
  -p 4848:4848 \
  --stop-timeout 1800 \
  ghcr.io/meeb/tubesync:latest

Once running, open http://localhost:4848 in your browser and you should see the TubeSync dashboard. If you do, you can proceed to adding some sources (YouTube channels and playlists). If not, check docker logs tubesync to see what errors might be occurring, typical ones are file permission issues.

Alternatively, for Docker Compose, you can use something like:

services:
  tubesync:
    image: ghcr.io/meeb/tubesync:latest
    container_name: tubesync
    restart: unless-stopped
    stop_grace_period: 30m
    ports:
      - 4848:4848
    volumes:
      - /some/directory/tubesync-config:/config
      - /some/directory/tubesync-downloads:/downloads
    environment:
      - TZ=Europe/London
      - PUID=1000
      - PGID=1000

[!IMPORTANT]
If the /downloads directory is mounted from a Samba volume, be sure to also supply the uid and gid mount parameters in the driver options. These must be matched to the PUID and PGID values, which were specified as environment variables.

Matching these user and group ID numbers prevents issues when executing file actions, such as writing metadata. See this issue for details.

Optional authentication

You can enable basic HTTP authentication by setting the HTTP_USER and HTTP_PASS environment variables. See the environment variables reference for details.

Updating

To update, you can just pull a new version of the container image as they are released.

$ docker pull ghcr.io/meeb/tubesync:v[number]

Back-end updates such as database migrations should be automatic.

[!IMPORTANT] MariaDB was not automatically upgraded for UUID column types. To see what changes are needed, you can run:

docker exec -it tubesync python3 /app/manage.py fix-mariadb --dry-run --uuid-columns

Removing the --dry-run will attempt to execute those statements using the configured database connection.

Moving, backing up, etc.

TubeSync, when running in its default container, stores thumbnails, cache and its SQLite database into the /config directory and wherever you've mapped that to on your file system. Just copying or moving this directory and making sure the permissions are correct is sufficient to move, back up or migrate your TubeSync install.

Using TubeSync

1. Add some sources

Pick your favourite YouTube channels or playlists, pop over to the "sources" tab, click whichever add button suits you, enter the URL and validate it. This process extracts the key information from the URL and makes sure it's a valid URL. This is the channel name for YouTube channels and the playlist ID for YouTube playlists.

You will then be presented with the initial add a source form where you can select all the features you want, such as how often you want to index your source and the quality of the media you want to download. Once happy, click "add source".

2. Wait

That's about it. All other actions are automatic and performed on timers by scheduled tasks. You can see what your TubeSync instance is doing on the "tasks" tab.

As media is indexed and downloaded it will appear in the "media" tab.

3. Media Server updating

Currently TubeSync supports Plex and Jellyfin as media servers. You can add your local Jellyfin or Plex server under the "media servers" tab.

Logging and debugging

Moved to the wiki.

Advanced usage guides

Moved to the wiki.

Warnings

1. Index frequency

It's a good idea to add sources with as long of an index frequency as possible. This is the duration between indexes of the source. An index is when TubeSync checks to see what videos available on a channel or playlist to find new media. Try and keep this as long as possible, up to 24 hours.

2. Indexing massive channels

If you add a massive channel (one with several thousand videos) to TubeSync and choose "index every hour" or a similarly short interval; it's entirely possible that your TubeSync install may spend its entire time indexing the channel, over and over again, without downloading any media. Check your tasks for the status of your TubeSync install.

Be nice. It's entirely possible that your IP address could get throttled and/or banned, by the source, if you try to crawl extremely large amounts quickly. Try to be polite with the smallest amount of indexing and concurrent downloads possible for your needs.

FAQ

Moved to the wiki.

Advanced configuration

There are a number of other environment variables you can set. These are, mostly, NOT required to be set in the default container installation, they are really only useful if you are manually installing TubeSync in some other environment. These are:

| Name | What | Example | | ---------------------------- | --------------------

readme truncated — read the full docs on github

Frequently asked questions

Is tubesync free to use?

tubesync is open source under the AGPL-3.0 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 tubesync do?

Syncs YouTube channels and playlists to a locally hosted media server

What is tubesync written in?

tubesync is primarily written in Python. Its source is publicly available at https://github.com/meeb/tubesync, and it has 2,794 GitHub stars.