MeTube

MeTube

Docker app from grtgbln's Repository

Overview

Web GUI for youtube-dl (using the yt-dlp fork) with playlist support. Allows you to download videos from YouTube and dozens of other sites.

MeTube

Build Status Docker Pulls

MeTube is a self-hosted web UI for yt-dlp. Paste a link from YouTube or hundreds of other sites, and it downloads to your server:

  • Video, audio, subtitles and thumbnails — from single videos, whole playlists or entire channels.
  • Subscriptions to channels and playlists, which queue new uploads as they appear.
  • Per-download choices of quality, format and folder, plus server-wide yt-dlp options and presets.

📖 Guides, recipes and a troubleshooting FAQ live in the wiki — many feature requests are already a recipe there, so check it before filing one.

screenshot1

Quick start

docker run -d -p 8081:8081 -v /path/to/downloads:/downloads ghcr.io/alexta69/metube

Or with Docker Compose:

services:
  metube:
    image: ghcr.io/alexta69/metube
    container_name: metube
    restart: unless-stopped
    ports:
      - "8081:8081"
    volumes:
      - /path/to/downloads:/downloads

Then open http://<host>:8081 in your browser. Images are multi-arch (amd64/arm64), and also published on Docker Hub as alexta69/metube.

Configuration

MeTube is configured with environment variables: -e NAME=value on the docker run command line, or the environment: section in Compose. Defaults are the Docker image's; outside Docker, the directories default to the working directory.

Runtime and permissions

Variable Default Description
PUID / PGID 1000 User and group MeTube runs as and writes files with. Legacy UID/GID also work.
UMASK 022 Umask for the files MeTube creates.
CHOWN_DIRS true Make PUID:PGID the owner of the download, state and temp directories at startup. With false, MeTube's user must already have access.
LOGLEVEL INFO DEBUG, INFO, WARNING, ERROR, CRITICAL or NONE.
ENABLE_ACCESSLOG false Log every HTTP request.
DEFAULT_THEME auto UI theme: light, dark, or auto to follow the system.

Downloads

Variable Default Description
MAX_CONCURRENT_DOWNLOADS 3 Downloads that run at once; the rest wait their turn.
DEFAULT_OPTION_PLAYLIST_ITEM_LIMIT 0 Default for the Items Limit field: how many entries of a playlist or channel to download (0 = all).
CLEAR_COMPLETED_AFTER 0 Seconds before finished and failed downloads leave the Completed list (0 = never).
DELETE_FILE_ON_TRASHCAN false Also delete the file from disk when its entry is removed from Completed. ask prompts each time.
SUBSCRIPTION_DEFAULT_CHECK_INTERVAL 60 Default minutes between checks of a subscription.
SUBSCRIPTION_SCAN_PLAYLIST_END 50 Newest entries fetched each time a subscription is checked.
SUBSCRIPTION_MAX_SEEN_IDS 50000 Video IDs remembered per subscription, to bound the state file's size.

Directories

Variable Default Description
DOWNLOAD_DIR /downloads Where downloads are saved.
AUDIO_DOWNLOAD_DIR same as DOWNLOAD_DIR Where audio-only downloads are saved, to keep them apart from video.
TEMP_DIR /downloads Where files are written while downloading. An SSD or tmpfs is faster, but on a RAM disk interrupted downloads can't resume.
STATE_DIR /downloads/.metube Where MeTube keeps its queue, history, subscriptions and uploaded cookies.
CUSTOM_DIRS true Show a Download Folder field under Advanced Options, to save into a subfolder of the download directory.
CREATE_CUSTOM_DIRS true Let that field create folders that don't exist yet.
CUSTOM_DIRS_EXCLUDE_REGEX (^|/)[.@].*$ Folders left out of the field's suggestions; the default hides names starting with . or @. Empty hides none.
DEFAULT_FOLDER Folder the field starts with, relative to the download directory. Requires CUSTOM_DIRS.
DOWNLOAD_DIRS_INDEXABLE false Serve browsable listings of the download directories.

File naming

Templates use yt-dlp's output template syntax. How MeTube applies them is explained in Output templates.

Variable Default Description
OUTPUT_TEMPLATE %(title)s.%(ext)s Filename for downloads.
OUTPUT_TEMPLATE_PLAYLIST %(playlist_title)s/%(title)s.%(ext)s Filename for items added from a playlist. Empty means OUTPUT_TEMPLATE.
OUTPUT_TEMPLATE_CHANNEL %(channel)s/%(title)s.%(ext)s Filename for items added from a channel. Empty means OUTPUT_TEMPLATE.
OUTPUT_TEMPLATE_CHAPTER %(title)s - %(section_number)02d - %(section_title)s.%(ext)s Default filename for each chapter when Split by chapters is on.

yt-dlp

Variable Default Description
YTDL_OPTIONS {} Options for every download, as a JSON object — see yt-dlp options.
YTDL_OPTIONS_FILE Path to a JSON file of such options. Reloaded when it changes; wins over YTDL_OPTIONS for the same key.
YTDL_OPTIONS_PRESETS {} Named option bundles, picked per download in the UI.
YTDL_OPTIONS_PRESETS_FILE Path to a JSON file of presets. Reloaded when it changes; wins over YTDL_OPTIONS_PRESETS for the same name.
ALLOW_YTDL_OPTIONS_OVERRIDES false Show a field for per-download yt-dlp options in the UI. Trusted users only: it allows running commands in the container.
YTDL_NIGHTLY_UPDATE_TIME Use nightly yt-dlp builds, upgrading and restarting daily at this time (HH:MM, 24-hour).

Web server and network

Variable Default Description
HOST 0.0.0.0 Address to listen on. The default is every IPv4 interface; * (or empty) adds IPv6; :: is IPv6 only.
PORT 8081 Port to listen on.
URL_PREFIX / Base path, for serving MeTube under a subpath of a reverse proxy.
HTTPS false Serve HTTPS directly, using CERTFILE and KEYFILE.
CERTFILE / KEYFILE Paths to the HTTPS certificate and key.
PUBLIC_HOST_URL download/ Base URL for the links to completed files. The default is relative to MeTube itself; set a full URL if the files are served from elsewhere.
PUBLIC_HOST_AUDIO_URL audio_download/ The same, for audio downloads.
CORS_ALLOWED_ORIGINS Comma-separated origins allowed to call MeTube from other sites, as browser extensions and bookmarklets do. * allows any site, so prefer naming them.
ALLOW_PRIVATE_ADDRESSES false Allow URLs on private and internal addresses, turning off SSRF protection. Needed for Fake-IP proxy clients, not for ordinary proxies — details.
ROBOTS_TXT Path to a robots.txt file to serve, mounted into the container.

yt-dlp options

yt-dlp options are JSON objects keyed by yt-dlp's API option names, which differ from its command-line flags (converter). They apply at three levels, and for an option set at more than one, the more specific level wins:

  1. Global — YTDL_OPTIONS and YTDL_OPTIONS_FILE, for every download.
  2. Presets — YTDL_OPTIONS_PRESETS and YTDL_OPTIONS_PRESETS_FILE, picked per download under Advanced Options.
  3. Overrides — typed into the UI for a single download, when ALLOW_YTDL_OPTIONS_OVERRIDES is on.
environment:
  - 'YTDL_OPTIONS={"writesubtitles": true, "subtitleslangs": ["en", "de"], "updatetime": false}'

The yt-dlp options guide covers presets, overrides and option files in detail, and the YTDL_OPTIONS Cookbook has ready-made recipes.

Guides

The wiki covers everything beyond the reference above:

Keeping yt-dlp up to date

Sites change constantly, and yt-dlp keeps up with frequent releases. A new MeTube image is published automatically for every yt-dlp stable release, so keep your container updated — watchtower can do it for you. To follow yt-dlp's nightly builds instead, set YTDL_NIGHTLY_UPDATE_TIME.

Troubleshooting and support

MeTube is only a UI for yt-dlp, so most download failures are yt-dlp's. Reproduce them with yt-dlp inside the container, and once a set of options works there, carry it over to YTDL_OPTIONS:

docker exec -ti metube sh
cd /downloads
yt-dlp <url>

The Troubleshooting FAQ covers common problems. Ask questions in Discussions; issues are for bugs in MeTube itself.

Scope and contributing

MeTube's scope is deliberately narrow: it downloads well, and stops once the file is written. Tagging and library organization belong to dedicated tools — point beets (headless, scriptable), MusicBrainz Picard (GUI, acoustic fingerprinting) or Lidarr (full library manager) at your AUDIO_DOWNLOAD_DIR.

Feature requests that fit this scope are welcome, and so are pull requests — for a change that isn't obvious, start a discussion first. CONTRIBUTING.md has the scope policy and how to build and run MeTube locally.

Media gallery

Download Statistics

48,852,664
Total Downloads
4,684,670
This Month
3,169,094
Avg / Month

Total Downloads Over Time

Loading chart...

Details

Repository
ghcr.io/alexta69/metube:latest
Last Updated2026-09-27
First Seen2021-08-21

Runtime arguments

Web UI
http://[IP]:[PORT:8081]/
Network
bridge
Privileged
false

Template configuration

Web UI PortPorttcp

Container Port: 8081

Target
8081
Default
8081
Value
8081
Downloads pathPath

Storage for downloaded files

Target
/downloads
ThemeVariable

Default theme for the web interface

Target
DEFAULT_THEME
Default
auto|light|dark
Output TemplateVariable

Output template for the downloaded files

Target
OUTPUT_TEMPLATE
Default
%(title)s.%(ext)s
Value
%(title)s.%(ext)s
Output Template - ChaptersVariable

Output template for the downloaded chapters. Default to OUTPUT_TEMPLATE if empty.

Target
OUTPUT_TEMPLATE_CHAPTERS
Default
%(title)s - %(section_number)s %(section_title)s.%(ext)s
Value
%(title)s - %(section_number)s %(section_title)s.%(ext)s
Output Template - PlaylistVariable

Output template for the downloaded playlist. Default to OUTPUT_TEMPLATE if empty.

Target
OUTPUT_TEMPLATE_PLAYLIST
Default
%(playlist_title)s/%(title)s.%(ext)s
Value
%(playlist_title)s/%(title)s.%(ext)s
Internal Download DirectoryVariable

Directory where the downloads are stored inside the container

Target
DOWNLOAD_DIR
Default
/downloads
Value
/downloads
Internal Audio Download DirectoryVariable

Directory where the audio downloads are stored inside the container

Target
AUDIO_DOWNLOAD_DIR
Default
/downloads
Value
/downloads
Indexable Download DirectoriesVariable

If true, the download dirs (DOWNLOAD_DIR and AUDIO_DOWNLOAD_DIR) are indexable on the webserver.

Target
DOWNLOAD_DIRS_INDEXABLE
Default
false|true
Enable Custom Directory SelectionVariable

When enabled, a drop-down appears next to the Add button to specify the download directory.

Target
CUSTOM_DIRS
Default
true|false
Create Custom DirectoriesVariable

Automatically create custom directories if they do not exist. When enabled, the download directory selector becomes supports free-text input, and the specified directory will be created recursively.

Target
CREATE_CUSTOM_DIRS
Default
true|false
Internal State DirectoryVariable

Where the queue persistence files will be saved

Target
STATE_DIR
Default
/downloads/.metube
Value
/downloads/.metube
Internal Temp DirectoryVariable

Where temporary files will be saved

Target
TEMP_DIR
Default
/downloads
Value
/downloads
Delete From FilesystemVariable

Delete the file from the filesystem when it is removed from the 'Completed' section on the UI.

Target
DELETE_FILE_ON_TRASHCAN
Default
false|true
URL PrefixVariable

Base path for the web server (for use when hosting behind a reverse proxy)

Target
URL_PREFIX
Default
/
Value
/
Public Host URLVariable

Base URL for the download links shown in the UI for completed files. By default MeTube serves them under its own URL. If your download directory is accessible on another URL and you want the download links to be based there, use this variable to set it.

Target
PUBLIC_HOST_URL
Use SSLVariable

Enable HTTPS

Target
HTTPS
Default
false|true
SSL CertificateVariable

Path to the SSL certificate. Required if HTTPS enabled.

Target
CERTFILE
SSL KeyVariable

Path to the SSL key. Required if HTTPS enabled.

Target
KEYFILE
Public Host URL (Audio)Variable

Base URL for the audio download links shown in the UI for completed files. By default MeTube serves them under its own URL. If your audio download directory is accessible on another URL and you want the download links to be based there, use this variable to set it.

Target
PUBLIC_HOST_AUDIO_URL
Strict Playlist ModeVariable

If true, the 'Strict Playlist mode' switch will be enabled by default. In this mode the playlists will be downloaded only if the URL strictly points to a playlist. URLs to videos inside a playlist will be treated same as direct video URL.

Target
DEFAULT_OPTION_PLAYLIST_STRICT_MODE
Default
false|true
Max Number of Playlist ItemsVariable

Maximum number of items to download from a playlist. 0 means no limit.

Target
DEFAULT_OPTION_PLAYLIST_ITEM_LIMIT
Default
0
Value
0
YTDL OptionsVariable

Additional options to pass to youtube-dl

Target
YTDL_OPTIONS
Default
{}
Value
{}
YTDL Options FileVariable

Path to a file containing additional options to pass to youtube-dl

Target
YTDL_OPTIONS_FILE
Robots.txt FileVariable

Path to a file containing the robots.txt content

Target
ROBOTS_TXT