Discover / Video & YouTube

TubeArchivist

by tubearchivistPython

Self-hosted YouTube media server that archives channels and metadata.

Toolexperimental

Maturity: experimental because latest release v0.5.10 is pre 1.0. Derived from release and commit history, not a rating.

Stars
8.3k
Forks
420
Downloads / mo
Last commit
2026-07-27
License
GPL-3.0
Open issues
32

Market and trust evidence

Edition not yet matched

No exact skills.sh identity match is available for this repository. Repository adoption and freshness remain visible above; install momentum is not inferred.

Trust analysis is a screening signal, not a security warranty. Read the ranking and trust methodology.

In practice

Written by AI from this repository’s README · high confidence

A growing local YouTube collection becomes impossible to search, organize or track watch state against.

Use it when

When you want to subscribe to channels, download with yt-dlp and browse an indexed, searchable offline archive.

Not the right pick when

Needs Docker plus ElasticSearch and Redis and several GB of memory, so it is not a lightweight downloader.

Capabilities

  • subscribe to favourite YouTube channels
  • download videos using yt-dlp
  • index videos and make them searchable
  • play videos and track viewed and unviewed state
  • companion browser extension plus Jellyfin and Plex plugins

Requirements

  • docker installed and running
  • around 2GB memory for a small setup and 4GB for a mid to large install
  • ElasticSearch and Redis configured through environment variables

Cost: Free and open source

Video walkthroughs

Third-party YouTube uploads matched to this tool by title, channel and repository name on 2026-08-03. Not made, reviewed or endorsed by SkillPilot. View counts and publish months are as of the match date and the month is approximate. Nothing loads from YouTube until you press play.

What the repository ships

Ships CLAUDE.mdDocker imageCI configured

Detected from the actual files in the repository root.

Latest release v0.5.10

Published 2026-03-28

Added

  • Added secret lookup from file, by @TheMDev, docs
  • Added deprecated appconfig key cleanup, by @bbilly1

Changed

  • Removed now redundant manual POT field, by @bbilly1
  • Extend the PIT lifetime for meta data embed for slow IO, by @bbilly1
  • Ignore number_of_replicas for index recreation for replica configurations, by @camhorn
  • Redownload now uses reindex for better metadata preservation, by @bbilly1
  • Changed POT plugin installation method, fix runtime plugin loading into yt-dlp, align with upstreak, by @bbilly1, #1134
  • Changed download process error handling, bot error message now throws and stops task completly, by @jwmay2012

Fixed

  • Fixed newer ES alias APIs for ES9 support, by @TheMDev
  • Fixed future problem for search alias, by @TheMDev
  • Fixed video deletion from playlist while out of sync, by @bbilly1
  • Fixed embedding error for mutagen on empty description, by @bbilly1, #1124

Tags

README

Tube Archivist

more screenshots and video

<div align="center">

<a href="https://hub.docker.com/r/bbilly1/tubearchivist" target="_blank"><img src="https://tiles.tilefy.me/t/tubearchivist-docker.png" alt="tubearchivist-docker" title="Tube Archivist Docker Pulls" height="50" width="190"/></a>

<a href="https://github.com/tubearchivist/tubearchivist" target="_blank"><img src="https://tiles.tilefy.me/t/tubearchivist-github-star.png" alt="tubearchivist-github-star" title="Tube Archivist GitHub Stars" height="50" width="190"/></a>

<a href="https://github.com/tubearchivist/tubearchivist/forks" target="_blank"><img src="https://tiles.tilefy.me/t/tubearchivist-github-forks.png" alt="tubearchivist-github-forks" title="Tube Archivist GitHub Forks" height="50" width="190"/></a>

<a href="https://www.tubearchivist.com/discord" target="_blank"><img src="https://tiles.tilefy.me/t/tubearchivist-discord.png" alt="tubearchivist-discord" title="TA Discord Server Members" height="50" width="190"/></a>

</div>

Table of contents

  • Docs with FAQ, and API documentation
  • Core functionality
  • Resources
  • Installing
  • Getting Started
  • Known limitations
  • Port Collisions
  • Common Errors
  • Roadmap
  • Donate

Core functionality

Once your YouTube video collection grows, it becomes hard to search and find a specific video. That's where Tube Archivist comes in: By indexing your video collection with metadata from YouTube, you can organize, search and enjoy your archived YouTube videos without hassle offline through a convenient web interface. This includes:

  • Subscribe to your favorite YouTube channels
  • Download Videos using yt-dlp
  • Index and make videos searchable
  • Play videos
  • Keep track of viewed and unviewed videos

Resources

Installing

For minimal system requirements, the Tube Archivist stack needs around 2GB of available memory for a small testing setup and around 4GB of available memory for a mid to large sized installation. Minimal with dual core with 4 threads, better quad core plus.

This project requires docker. Ensure it is installed and running on your system.

The documentation has additional user provided instructions for Unraid, Synology and Podman.

The instructions here should get you up and running quickly, for Docker beginners and full explanation about each environment variable, see the docs.

Take a look at the example docker-compose.yml and configure the required environment variables.

All environment variables are explained in detail in the docs here.

Both TA_PASSWORD and ELASTIC_PASSWORD can be suffixed with _FILE to allow passing in passwords as secrets. _FILE is a convention used by some images including ElasticSearch

TubeArchivist

| Environment Var | Value | Required |

| ----------------------------- | ----- | -------- |

| TA_HOST | Server IP or hostname http://tubearchivist.local:8000 | Required |

| TA_USERNAME | Initial username when logging into TA | Required |

| TA_PASSWORD | Initial password when logging into TA | Required |

| ELASTIC_PASSWORD | Password for ElasticSearch | Required |

| REDIS_CON | Connection string to Redis | Required |

| TZ | Set your timezone for the scheduler | Required |

| TA_PORT | Overwrite Nginx port | Optional |

| TA_BACKEND_PORT | Overwrite container internal backend server port | Optional |

| TA_ENABLE_AUTH_PROXY | Enables support for forwarding auth in reverse proxies | Read more |

| TA_AUTH_PROXY_USERNAME_HEADER | Header containing username to log in | Optional |

| TA_AUTH_PROXY_LOGOUT_URL | Logout URL for forwarded auth | Optional |

| ES_URL | URL That ElasticSearch runs on | Optional |

| ES_DISABLE_VERIFY_SSL | Disable ElasticSearch SSL certificate verification | Optional |

| ES_SNAPSHOT_DIR | Custom path where elastic search stores snapshots for master/data nodes | Optional |

| HOST_GID | Allow TA to own the video files instead of container user | Optional |

| HOST_UID | Allow TA to own the video files instead of container user | Optional |

| ELASTIC_USER | Change the default ElasticSearch user | Optional |

| TA_LDAP | Configure TA to use LDAP Authentication | Read more |

| DISABLE_STATIC_AUTH | Remove authentication from media files, (Google Cast...) | Read more |

| TA_AUTO_UPDATE_YTDLP | Configure TA to automatically install the latest yt-dlp on container start | Optional |

| DJANGO_DEBUG | Return additional error messages, for debug only | Optional |

| TA_LOGIN_AUTH_MODE | Configure the order of login authentication backends (Default: single) | Optional |

| TA_LOGIN_AUTH_MODE value | Description |

| ------------------------ | ----------- |

| single | Only use a single backend (default, or LDAP, or Forward auth, selected by TA_LDAP or TA_ENABLE_AUTH_PROXY) |

| local | Use local password database only |

| ldap | Use LDAP backend only |

| forwardauth | Use reverse proxy headers only |

| ldap_local | Use LDAP backend in addition to the local password database |

ElasticSearch

| Environment Var | Value | Required |

| ---------------- | ----- | -------- |

| ELASTIC_PASSWORD | Matching password ELASTIC_PASSWORD from TubeArchivist | Required |

| http.port | Change the port ElasticSearch runs on | Optional |

Update

Always use the latest (the default) or a named semantic version tag for the docker images. The unstable tags see CONTRIBUTING.md#beta-testing.

You will see the current version number of Tube Archivist in the footer of the interface. There is a daily version check task querying tubearchivist.com, notifying you of any new releases in the footer. After updating, check the footer to verify you are running the expected version.

  • This project is tested for updates between one or two releases maximum. Further updates back may or may not be supported. Ideally apply new updates at least once per month.
  • There can be breaking changes between updates, particularly as the application grows, new environment variables or settings might be required for you to set in the your docker-compose file. Always check the release notes: Any breaking changes will be marked there.
  • All testing and development is done with the Elasticsearch version number as mentioned in the provided docker-compose.yml file. This will be updated from time to time. Running an older version of Elasticsearch is most likely not going to result in any issues, but it's still recommended to run the same version as mentioned. Use bbilly1/tubearchivist-es to automatically get the recommended version.

Getting Started

  1. Go through the settings page and look at the available options. Particularly set Download Format to your desired video quality before downloading. Tube Archivist downloads the best available quality by default. To support iOS or MacOS and some other browsers a compatible format must be specified. For example:

    bestvideo[vcodec*=avc1]+bestaudio[acodec*=mp4a]/mp4
  1. Subscribe to some of your favorite YouTube channels on the channels page.
  2. On the downloads page, click on Rescan subscriptions to add videos from the subscribed channels to your Download queue or click on Add to download queue to manually add Video IDs, links, channels or playlists.
  3. Click on Start download and let Tube Archivist to it's thing.
  4. Enjoy your archived collection!

Port Collisions

If you have a collision on port 8000, best solution is to use dockers HOST_PORT and CONTAINER_PORT distinction: To for example change the interface to port 9000 use 9000:8000 in your docker-compose file.

For more information on port collisions, check the docs.

Common Errors

Here is a list of common errors and their solutions.

vm.max_map_count

Elastic Search in Docker requires the kernel setting of the host machine vm.max_map_count to be set to at least 262144.

To temporary set the value run:


sudo sysctl -w vm.max_map_count=262144

To apply the change permanently depends on your host operating system:

  • For example on Ubuntu Server add vm.max_map_count = 262144 to the file /etc/sysctl.conf.
  • On Arch based systems create a file /etc/sysctl.d/max_map_count.conf with the content vm.max_map_count = 262144.
  • On any other platform look up in the documentation on how to pass kernel parameters.

Permissions for elasticsearch

If you see a message similar to Unable to access 'path.repo' (/usr/share/elasticsearch/data/snapshot) or failed to obtain node locks, tried [/usr/share/elasticsearch/data] and maybe these locations are not writable when initially starting elasticsearch, that probably means the container is not allowed to write files to the volume.

To fix that issue, shutdown the container and on your host machine run:


chown 1000:0 -R /path/to/mount/point

This will match the permissions with the UID and GID of elasticsearch process within the container and should fix the issue.

Disk usage

The Elasticsearch index will turn to read only if the disk usage of the container goes above 95% until the usage drops below 90% again, you will see error messages like disk usage exceeded flood-stage watermark.

Similar to that, TubeArchivist will become all sorts of messed up when running out of disk space. There are some error messages in the logs when that happens, but it's best to make sure to have enough disk space before starting to download.

error setting rlimit

If you are seeing errors like failed to create shim: OCI runtime create failed and error during container init: error setting rlimits, this means docker can't set these limits, usually because they are set at another place or are incompatible because of other reasons. Solution is to remove the ulimits key from the ES container in your docker compose and start again.

This can happen if you have nested virtualizations, e.g. LXC running Docker in Proxmox.

Known limitations

  • Video files created by Tube Archivist need to be playable in your browser of choice. Not every codec is compatible with every browser and might require some testing with format selection.
  • Every limitation of yt-dlp will also be present in Tube Archivist. If yt-dlp can't download or extract a video for any reason, Tube Archivist won't be able to either.
  • There is no flexibility in naming of the media files.

<!-- The Roadmap section is parsed by frontend/src/pages/About.tsx -->

Roadmap

We have come far, nonetheless we are not short of ideas on how to improve and extend this project. Issues waiting for you to be tackled in no particular order:

  • [ ] Audio download
  • [ ] Podcast mode to serve channel as mp3
  • [ ] Random and repeat controls (#108, #220)
  • [ ] Auto play or play next link (#226)
  • [ ] Multi language support
  • [ ] Show total video downloaded vs total videos available in channel
  • [ ] Download or Ignore videos by keyword (#163)
  • [ ] Custom searchable notes to videos, channels, playlists (#144)
  • [ ] Search comments
  • [ ] Per user videos/channel/playlists

Implemented:

  • [X] Search download queue [2025-07-31]
  • [X] Configure shorts, streams and video sizes per channel [2024-07-15]
  • [X] User created playlists [2024-04-10]
  • [X] User roles, aka read only user [2023-11-10]
  • [X] Add statistics of index [2023-09-03]
  • [X] Implement Apprise for notifications [2023-08-05]
  • [X] Download video comments [2022-11-30]
  • [X] Show similar videos on video page [2022-

Truncated. Read the full README on GitHub ↗

Related tools