MyTube: A Self-Hosted Video Downloader and Player Built Around yt-dlp
Self-hosted downloader and player for YouTube, Bilibili, Twitch, MissAV, and yt-dlp sites. Features channel subscriptions, auto-downloads, and local storage for media. Organize your library into collections with a sleek UI. Includes built-in Cloudflare Tunnel support for secure remote access without port forwarding. Docker-ready deployment.
At a glance
- What is it?
- MyTube is a TypeScript application that downloads videos with yt-dlp, stores them locally, and serves them through a player with subscriptions, auto-downloads, private RSS feeds and built-in Cloudflare Tunnel support. It targets a home server or NAS and ships as a frontend and a backend in one repository.
- Who is it for?
- MyTube fits a household or small team that wants its own searchable library of downloaded media, with subscriptions and an RSS feed that works inside an existing reader, and it does not fit anyone who needs a service that ships with content already licensed for redistribution, since the application is a downloader and player and nothing else.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 9 days ago.
- What is it written in?
- Mainly TypeScript, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 20, 2026, and from our analysis. They are not legal advice.
Editorial analysis
Two Packages, One Application
MyTube is described as a self-hosted downloader and player for YouTube, Bilibili, Twitch, MissAV and the sites supported by yt-dlp, with channel subscriptions, auto-downloads, local media storage and private RSS feed links for external readers. It is written in TypeScript and organised as a monorepo with a frontend/ and a backend/ directory, plus a chrome-extension/ directory for the browser integration.
The root package.json is the orchestration layer rather than the application itself. Its scripts start the two halves together with concurrently, and the frontend start waits for the backend to come up first through a script called waitForBackend.cjs before running the frontend dev server. The build script only builds the frontend, the lint and typecheck scripts target the frontend, and the test script runs the backend tests and then the frontend tests.
There is a version floor and it is checked for you. The preinstall script runs node ./backend/scripts/check-supported-node.cjs, and the engines field declares node >=22.22.0 <27, so an unsupported Node version fails the install rather than failing later at runtime. The package version is 1.11.14, and the project publishes no GitHub releases, so the changelog and the npm version are the record of what changed.
yt-dlp Does the Downloading, and the Settings Page Configures It
The downloading itself is delegated. The feature list describes video downloading from YouTube, Bilibili, Twitch, MissAV and other yt-dlp-supported sites with a simple URL input, and there is a dedicated feature for yt-dlp configuration where you can customise global yt-dlp arguments, the network proxy and other advanced settings through the settings page.
That is a sensible division. yt-dlp keeps up with site changes, and the part of the problem MyTube solves is everything around it: the queue, the progress display, the metadata, the local library organisation, the subscriptions and the player.
Two details of the download path are worth knowing. Parallel downloads let you queue several and track their progress at the same time, and batch download adds multiple URLs to the queue at once. There is also cookie management, where you upload a cookies.txt file so that age-restricted or premium content can be downloaded.
Local files can go in the other way too. Video upload lets you push local video files into the library, with automatic thumbnail generation, which is the path for content that was never on a video site at all.
Subscriptions, Task Hooks and Notifications
Subscriptions are the feature that turns the application from a downloader into a service. You can manage YouTube, Bilibili and Twitch channel subscriptions, and new content is downloaded automatically.
The automation extends past the download itself with task hooks. You can execute custom shell scripts at various stages of a download task, at the start, on success, on fail and on cancel. That is a small interface with a lot of leverage, since it lets you notify a chat system, move a file to a different storage tier, or run a post-processing script when a specific channel finishes.
Telegram notifications are built in as well, so you receive instant notifications through a Telegram bot when a download task succeeds or fails. Task hooks and Telegram notifications are different tools for the same need, and having both means the built-in path is enough for most people while the hook path is there for anything specific.
The uploads can also be pushed onwards. Cloud storage integration automatically uploads videos and thumbnails to cloud storage through OpenList or Alist after the download, which is how a library on a NAS gets backed up to remote storage without a separate job.
Private RSS Feeds for the Readers You Already Use
The private RSS feature is the one that changes how the application fits into your habits. You create private links for external feed readers, with per-link filters for channels, authors, tags, sources, recent videos and item limits.
The per-link filtering is what makes it more than a shortcut. A single feed can be limited to recent videos, another can be restricted to a single author or tag, and the item limit keeps a prolific channel from flooding the reader. Since the links are private, the library is not exposed by publishing a feed URL that anyone can guess.
Combined with subscriptions, the effect is that a channel you follow on a video site becomes a feed in the reader you already open every morning, and the download happens in the background. The alternative workflow, checking the channel page yourself, is exactly the chore this removes.
Keyboard shortcuts are handled at the same level of polish, with YouTube-style player shortcuts for play and pause, seeking, volume, speed, captions, fullscreen, cinema mode, frame stepping and Up Next navigation, and the documentation for them is in documents/en/keyboard-shortcuts.md alongside the rest of the per-feature guides in the documents/ directory.
Remote Access Without Port Forwarding
Built-in Cloudflare Tunnel support is the feature that makes self-hosting viable for a household, because it removes the requirement to open a port on the router and forward it to the host. The feature list describes it as built-in support to easily expose your local MyTube instance to the internet without port forwarding.
For a self-hosted media library this is a sensible default, because the alternative, a public port on a home router, is a security decision you have to make every time you add a service. With a tunnel the instance is reached through a domain, and TLS termination is handled by the tunnel rather than by your reverse proxy.
The Docker deployment path is the other half of the operational story. The repository is Docker ready, and the frontend and backend are started by the same concurrently script in development, while in a container the two processes are managed by the image. The site itself publishes a read-only live demo at mytube-demo.vercel.app, which is a reasonable way to look at the interface before deploying anything.
Access Control: Passwords, Passkeys and a Gesture Lock
The login protection feature is more elaborate than a single password, and it is the part to read carefully before exposing an instance to the internet.
There is password login, optional passkeys through WebAuthn, and an admin-only 3x3 gesture login. The gesture failure policy is described in detail: gesture failures are shared across devices, one or two failures expire 12 hours after the latest failure, and three lock gesture access until one successful admin password login.
Named read-only visitor accounts are also supported, which is the feature that makes sharing safe. A visitor account can browse the library without being able to change anything, so a household member or a friend can be given access to a specific set of videos without being given the download controls.
The internationalisation list is long, with English, Chinese, Spanish, French, German, Japanese, Korean, Arabic, Portuguese and Russian, which fits a project that is used internationally.
The browser extension is the other integration point, a Chrome extension to download videos directly from the browser, and there is a separate README for the direct download path, README-telegram-direct-download.md.
The Features That Reach Outside Your Server
Two features send data to third parties, and each is worth checking against your own comfort before enabling it.
The live audio translation feature is optional and admin only. It streams the playing video's audio to Google Gemini Live Translation and plays the translated speech with live subtitles in the player's subtitle menu. It is configured under Settings, Basic, Video Playback, with the enable switch, the Gemini API key, the model and the source and target language. The README states that the key is stored server-side and never sent to the browser, and that while the translation is active the video's audio is streamed to Google's Gemini API, with transcripts not persisted or logged. It requires an admin account when login is enabled and a same-origin, non-cross-origin, audio source.
The TMDB metadata scraping feature sends filenames to TMDB in order to match them against movie and television metadata, and the title, description, poster, director, year and rating are filled in from there. It supports localised content matching for the site language, and it needs a TMDB API key configured in settings.
The D Mode feature is the odd one out and the one with the most specific guidance. It uses Canvas and WebCodecs instead of a standard media element, which enables playback on compatible in-car entertainment screens that otherwise block ordinary players while the vehicle is moving. The README frames it as intended for passengers, asks that you always follow local laws, and says never to watch or operate the screen while driving.
Editorial conclusion
MyTube fits a household or small team that wants its own searchable library of downloaded media, with subscriptions and an RSS feed that works inside an existing reader, and it does not fit anyone who needs a service that ships with content already licensed for redistribution, since the application is a downloader and player and nothing else. Before deploying it, confirm the Node version you have is inside the supported range of 22.22.0 up to but not including 27, since the preinstall script checks it, and decide how you will expose it, because the built-in Cloudflare Tunnel and the password, passkey and gesture protections are separate decisions from the download configuration. The project is MIT licensed, the package version is 1.11.14, it publishes no GitHub releases, and the last push was on 2026-10-14.
Frequently asked questions
What does MyTube actually download?
The README describes support for YouTube, Bilibili, Twitch, MissAV and other sites supported by yt-dlp, with a simple URL input for the download. Downloading itself is delegated to yt-dlp, whose global arguments, network proxy and other advanced settings you can configure from the settings page.
How does MyTube expose itself to the internet?
There is built-in Cloudflare Tunnel support, which the README describes as letting you expose a local instance without port forwarding. The project is Docker ready, and there is a read-only live demo at mytube-demo.vercel.app.
Can MyTube send me notifications when a download finishes?
Yes. Telegram notifications are built in, giving instant notifications through a Telegram bot when a download task succeeds or fails. There are also task hooks, which run custom shell scripts at the start, success, fail and cancel stages of a download task.
What are the access control options in MyTube?
Password login, optional passkeys through WebAuthn, and an admin-only 3x3 gesture login whose failure policy is shared across devices, with one or two failures expiring 12 hours after the latest failure and three locking gesture access until a successful admin password login. Named read-only visitor accounts allow safe sharing.
What Node version does MyTube need?
The package.json engines field requires node >=22.22.0 <27, and a preinstall script runs backend/scripts/check-supported-node.cjs so an unsupported version fails at install time. The package version is 1.11.14 and the project publishes no GitHub releases.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/franklioxygen-mytube)Was this useful?