CasaTube
CasaTube

Self-hosted downloads that do not get lost

Paste a link, choose exactly the quality, audio tracks and subtitles that video has, and close the tab. The queue lives on the server, survives restarts, and drops the file into your media library named and tagged the way Jellyfin and Plex expect.

amd64 · arm64 yt-dlp + ffmpeg inside No telemetry MIT
The CasaTube dashboard: a quick-download box, the live queue with three downloads in progress, storage and recent downloads

The browser only watches

Most self-hosted downloaders run the download inside your browser session, or forget it when the container restarts. CasaTube is built around one requirement: a job survives the browser closing and the service restarting.

Close the tab, lock the iPad, redeploy halfway through a film. The job carries on — or goes back to the queue and resumes — and every stage it passes through is on screen, live, with its own log for when something fails at 3 a.m.

validateanalyzedownloadpostprocessmetadatamove
The queue: status counts and a table of jobs, some downloading with live progress and some done

What it does

Built for one household and its media server, and careful about the details that make a library pleasant to use months later.

Choose before you download

The resolutions, codecs, audio tracks and subtitles that video actually has — with sizes — not a generic list that silently falls back to something else.

Correct language tags

Audio and subtitle languages are chosen independently and written into the file properly, so your media server shows the right names.

Never overwrites

Name the file yourself. A name that is taken is reported before anything is queued, and subtitles and thumbnails always follow the final name.

A library with a player

Browse downloads with thumbnails, play them in the browser with real seeking, switch audio and subtitles, download a bundle, or move things to a trash you can restore from.

Subscriptions

Follow channels and playlists. New uploads are queued on a schedule, without re-downloading the back catalogue.

Beyond yt-dlp

Everything yt-dlp supports, plus private Telegram channels through your own session and Google Drive files without the shared API key yt-dlp depends on.

Plugins in TypeScript

Written in an in-app editor and loaded without a restart: rewrite links, call a webhook, ask Jellyfin to scan when a file lands.

Credentials, sealed

Cookies, passwords, API keys and sessions for sites that need a login, encrypted at rest when you set a key — and never sent back to the browser.

One image, no host setup

The app, yt-dlp and ffmpeg in one container for amd64 and arm64. Runs on plain Docker, Compose or CasaOS, from a phone-friendly UI in light and dark.

A closer look

Screenshots from a fresh instance, downloading Blender Studio's open movies.

The download form on a phone
Downloads in progress on a phone

Install

One image with everything inside. Pick how you run containers; docs/DEPLOY.md has every setting.

Docker Compose

Downloads land in ./library; settings go in a .env beside the file.

mkdir casatube && cd casatube
curl -fsSLO https://raw.githubusercontent.com/\
xantiagoma/casatube/main/docker-compose.yml
docker compose up -d

Docker

Point /library at the folder your media server reads.

docker run -d --name casatube \
  --restart unless-stopped \
  -p 8520:8520 \
  -e PUID=1000 -e PGID=1000 \
  -v ./data:/data \
  -v /mnt/media/videos:/library \
  ghcr.io/xantiagoma/casatube:latest

CasaOS

App Store → Custom Install → Import, then paste docker-compose.casaos.yml and adjust the two folders.

http://<your-server>:8520

Images

ghcr.io/xantiagoma/casatube, for amd64 and arm64. yt-dlp is the part that rots — sites change and it follows them — so releases are rebuilt every week with the newest one.

TagWhat it is
latestThe newest release, with the newest yt-dlp. Rebuilt weekly.
0.1, 0.1.0That release, with the newest yt-dlp. Rebuilt weekly.
0.1.0-ytdlp-2026.08.19Exactly that app and that yt-dlp. Never changes — pin this to update on purpose.
main, sha-abc1234The tip of the main branch, and one exact commit of it. Not releases.

Put it behind something

CasaTube has no login of its own. It is built for a private network, and anyone who can reach the port can use it — including the plugin editor, which runs code on the server by design. Reach it over Tailscale, through Cloudflare Access, or behind a reverse proxy that authenticates — docs/SECURING.md has the configurations.

Set CREDENTIALS_KEY before storing a cookie, a password or a Telegram session; without it they are kept in plain text, and the app says so.

Use it responsibly

  • Your downloads are your responsibility. Use CasaTube only for media you have the right to download and keep: your own uploads, public-domain or openly licensed works, and content whose owner or platform terms allow it. Copyright law and site terms differ by country and by site, and many platforms forbid downloading outside their own features.
  • No DRM circumvention. CasaTube does not decrypt or bypass DRM or other technical protection measures, and will not.
  • As is, no commitments. A personal, non-commercial project, provided without warranty under the MIT licence, with no support agreement or SLA.
  • Not affiliated. CasaTube is not a YouTube product and has no connection to YouTube, Google, Dailymotion, Vimeo, Telegram, Jellyfin, Plex, CasaOS or any other service named here; their names are trademarks of their owners, used only to describe compatibility.

The full disclaimer and the NOTICE — including the GPL software in the image — are in the repository.