YT-Zero

YT-Zero

Docker app from Pelski's Repository

Overview

A self-hosted YouTube inbox for people who want subscriptions, not recommendations. YT Zero reads public YouTube RSS feeds, stores everything locally in SQLite, and provides a calm place to sort, schedule, watch, archive and revisit videos from chosen creators. No Google account, API key or algorithmic home feed is required. The app starts empty; add channels from Settings, then Channels.

YT Zero

A self-hosted YouTube inbox for people who want subscriptions, not recommendations.

Release Docker image License: AGPL-3.0 Wiki GitHub stars

YT Zero turns YouTube back into a simple reader for channels you chose on purpose. No Google account. No API key. No algorithmic home feed pushing videos you did not ask for.

It reads public YouTube RSS feeds, stores everything locally in SQLite, and gives you a calm place to sort, schedule, watch, archive, and revisit videos from creators you already follow. With the optional yt-dlp integration it can even download those videos and play them from disk, in its own player.

If the problem is "YouTube is good at surfacing more, not better," YT Zero is the opposite: a quiet inbox, your own rules, and a player built around intentional watching.

YT Zero main feed

Standard player Theater player
YT Zero standard video player YT Zero theater video player
Tags and rules Display settings
YT Zero tags and rules settings YT Zero display settings

Why it exists

YouTube is excellent at keeping attention and bad at staying out of the way. If all you want is:

  • your subscriptions in one place
  • a clean watch queue
  • no forced sign-in
  • no API setup
  • no recommendation loop

then the default YouTube experience keeps adding noise around the thing you actually came for.

YT Zero removes that layer. It keeps subscriptions, watch progress, playlists, tags, and playback controls. It drops the account dependency and the recommendation machinery.

What makes it useful

  • Focused inbox — all new videos from followed channels in one chronological feed.
  • No Google dependency — works without a Google account or YouTube Data API key.
  • Local-first state — subscriptions, progress, history, playlists, tags, and rules are stored in SQLite.
  • Built for triage — schedule videos for later, archive the ones you will not watch, and come back on your terms.
  • Organized watching — use tags, inherited channel tags, rules, and local playlists to shape your own feed.
  • Real playback controls — theater view, captions, quality, display settings, and optional SponsorBlock support.
  • Downloads & local playback — the optional yt-dlp plugin fetches videos to disk and plays them in YT Zero's own player: instant seeking, no embeds, no buffering, works offline.
  • Works for households — profiles, authentication modes, child profiles with watch-time limits, and child lock make one install usable by more than one person.
  • Pulse — understand actual viewing time by profile, channel, tag, hour, weekday, and content type without sending analytics outside your server.

Features

  • Subscription inbox — all new videos from followed channels in one feed.
  • Channel import — add channels manually, import OPML, or import subscriptions.csv from Google Takeout.
  • Live and upcoming streams — dedicated live view with automatic status refresh, plus a per-profile option to keep live and Upcoming entries out of the main feed.
  • Watch later buckets — schedule videos for Today, Tonight, Tomorrow, Tomorrow evening, or Weekend.
  • Archive flow — reject videos, restore them later, and keep the main feed clean.
  • History and progress — record watched videos and resume partially watched ones.
  • Tags & rules — tag videos and channels, inherit channel tags to videos, and automate sorting with rules.
  • User playlists — local playlists with icons, manual additions, and rules.
  • Profiles — multiple isolated profiles on one install, each with its own state.
  • Pulse — an optional, default-hidden sidebar view with combined and per-profile viewing patterns, favorite channels and tags, activity hours, content mix, and time saved by SponsorBlock.
  • Authentication — none, shared login, per-profile login, OIDC, or proxy headers, with password and passkey support.
  • Child lock — PIN-protect household settings while leaving each profile's own tags and playlists editable.
  • Child profiles — daily watch-time limits, parent-approved extensions, subscribed-content-only mode, optional Shorts/live blocking, downloaded-videos-only mode, reduced settings access, and a parent activity panel with immediate stop/unlock controls.
  • Downloads (yt-dlp) — an optional plugin that downloads scheduled or fresh videos, plays them in a built-in local player, shows download progress on thumbnails and in a dedicated Downloads tab, and cleans up after itself with retention rules and a storage cap.
  • Shorts tab & player — a followed-channels-only vertical Shorts feed with format-native cards and a full-screen swipe player.
  • SponsorBlock — optionally skip sponsored segments, intros, outros, and more.
  • Playback and display controls — theater view, captions, quality, display customization, and optional auto-fullscreen when a phone rotates to landscape.
  • Internationalization — English, Polish, and German UI.

See the full list with screens in the Features wiki page.

Downloads & offline playback (yt-dlp)

The YT-DLP Integration plugin (disabled by default) uses yt-dlp to keep local copies of the videos you actually plan to watch — and plays them in YT Zero's own player instead of the YouTube embed:

  • Automatic downloads — videos you schedule for later are fetched ahead of time; optionally every fresh upload from followed channels.
  • Watch your way — when a video isn't downloaded yet, choose: play from YouTube now, or wait for a priority download and watch locally. Either can be the default.
  • A real player — instant seeking, chapter and SponsorBlock markers on the seek bar, keyboard shortcuts, picture-in-picture, Media Session — with the same progress tracking as the embedded player.
  • Smart retention — keep files for N days, drop them after watching, protect liked and pinned videos, and cap total disk usage. Everything is cleaned up automatically.
  • Household-aware — one download serves every profile, and child profiles can be limited to downloaded videos only.

The Docker image bundles yt-dlp and ffmpeg and keeps yt-dlp updated daily. Details and the full settings reference: YT-DLP Integration.

How it works

YT Zero does not scrape your account or sync with YouTube through a private API. It watches public channel feeds, fetches the metadata needed to build your local library, and serves that library back as a quieter interface. With the yt-dlp plugin enabled, it additionally downloads the video files themselves — everything else stays the same.

That means:

  • easy self-hosting
  • no API quota headaches
  • local ownership of your app state
  • a product that stays narrow on purpose

Quick start

YT Zero can run as a regular Docker container, an Unraid Community App, a native systemd service, or in its own Proxmox LXC:

Method Best for How it runs
Docker Compose Most servers and NAS systems Published multi-architecture GHCR image
Unraid Unraid users who prefer DockerMan / Community Apps The same GHCR image with persistent appdata
Proxmox VE Homelabs managed from a PVE host Unprivileged Debian LXC, without Docker inside
Debian / Ubuntu LXC, VM or bare-metal Linux Native Bun application managed by systemd

Docker

Run with the published GHCR image:

services:
  ytzero:
    image: ghcr.io/pelski/ytzero:latest
    container_name: ytzero
    ports:
      - "3001:3001"
    volumes:
      - ./data:/data
    restart: unless-stopped
docker compose up -d

Unraid

The repository includes an official-layout Community Apps template. Once YT Zero is listed, find it by searching for YT Zero under Apps. Until then, load the bundled template from an Unraid terminal:

curl -fsSL https://raw.githubusercontent.com/Pelski/ytzero/main/templates/ytzero.xml \
  -o /boot/config/plugins/dockerMan/templates-user/my-ytzero.xml

Reload Docker → Add Container, select the ytzero template, review the /mnt/user/appdata/ytzero data path and port 3001, then apply it.

Proxmox VE

On the Proxmox host — creates an unprivileged Debian LXC and installs YT Zero natively inside it:

bash -c "$(curl -fsSL https://raw.githubusercontent.com/Pelski/ytzero/main/scripts/proxmox-lxc.sh)"

Debian / Ubuntu (LXC, VM, bare metal)

As root — installs Bun, ffmpeg and yt-dlp, and runs YT Zero as a systemd service. Re-run it to update:

bash -c "$(curl -fsSL https://raw.githubusercontent.com/Pelski/ytzero/main/scripts/install.sh)"

Open http://localhost:3001. The app starts empty — add channels from Settings → Channels.

Full instructions (Proxmox and installer options, Unraid, local development, production-like start) are in Installation.

The native and Proxmox commands require a release that includes the packaged ytzero-vX.Y.Z.tar.gz asset. Older tags without that asset are Docker/local only.

Documentation

Full documentation lives in the Wiki:

Browser extension

Use YTZero Redirect, a Firefox and Chrome extension by @pekempy. Set your YT Zero address once, then YouTube video, Shorts, playlist, channel, and handle URLs automatically take you to the matching page in your self-hosted YT Zero instance — with no telemetry or data collection.

Tech stack

Layer Stack
Backend Bun, Hono, bun:sqlite
Frontend React, Vite, TypeScript
Storage SQLite
Downloads yt-dlp + ffmpeg (optional plugin, bundled in Docker)
Runtime Docker/Unraid, a Proxmox LXC or Debian/Ubuntu host via systemd, or local Bun

Privacy & license

YT Zero does not require a Google account or a YouTube Data API key, and stores app data locally in SQLite. It still connects to YouTube to fetch RSS feeds, metadata, thumbnails, pages, and embedded videos. With the YT-DLP Integration plugin enabled it also downloads video files from YouTube via yt-dlp; those files are stored locally and removed by the plugin's retention rules.

YouTube is a trademark of Google LLC. This project is not affiliated with, endorsed by, or associated with YouTube or Google LLC.

Licensed under the GNU Affero General Public License v3.0 only (AGPL-3.0-only). See LICENSE. More in Privacy & License.

Mentions

Thanks

Thanks to Green-Kite for help with the German language support and updating the wiki.

Thanks to baldemar-wuda for extensive testing, great suggestions, and finding bugs.

Development note

AI-assisted coding tools have been used selectively to support development tasks such as code exploration, prototyping, and review. Project direction, architectural decisions, validation, and responsibility for the final code remain with the maintainers.

Media gallery

1 / 3

Install YT-Zero on Unraid in a few clicks.

Find YT-Zero in Community Apps on your Unraid server, review the template, and click Install. Unraid handles the Docker app or plugin setup from the published template.

Open the Apps tab on your Unraid server Search Community Apps for YT-Zero Review the template variables and paths Click Install

Requirements

Internet access is required to fetch channel feeds, metadata and videos. Persistent storage is required for /data.

Related apps

Details

Repository
ghcr.io/pelski/ytzero:latest
Last Updated2026-07-17
First Seen2026-07-17

Runtime arguments

Web UI
http://[IP]:[PORT:3001]/
Network
bridge
Shell
bash
Privileged
false

Template configuration

WebUI PortPorttcp

Port exposed for the YT Zero web interface.

Target
3001
Default
3001
AppdataPathrw

Database, image cache, avatars, logs and downloaded videos. Back up this directory.

Target
/data
Default
/mnt/user/appdata/ytzero
Feed refresh (minutes)Variable

How often to poll channel RSS feeds for new videos.

Target
REFRESH_INTERVAL_MINUTES
Default
5
Metadata maintenance age (days)Variable

Maximum video age considered by automatic Shorts and duration metadata backfills.

Target
VIDEO_MAINTENANCE_MAX_AGE_DAYS
Default
90
Idle timeout (seconds)Variable

HTTP idle timeout. Manual synchronization can take longer than Bun's default.

Target
IDLE_TIMEOUT_SECONDS
Default
120
yt-dlp auto-updateVariable

Keep the bundled yt-dlp binary updated daily. Only matters when the Downloads plugin is enabled.

Target
YTDLP_AUTO_UPDATE
Default
1
App URLVariable

External URL, for example https://ytzero.example.com. Needed for OIDC and passkeys behind a reverse proxy.

Target
APP_URL