A safe, self-hosted YouTube client for kids: strict whitelist only, per-kid profiles, offline downloads. Your home server downloads every approved video (via yt-dlp) — the app plays exclusively these local copies. No ads, no recommendations, no escape hatches.
- Parents whitelist single videos, playlists, or entire channels in a PIN-protected parent area.
- The server (Fastify + SQLite + youtubei.js + yt-dlp) syncs metadata, downloads the videos, and serves app + media. Channels mirror their latest 10 uploads, playlists their first 20 entries (configurable).
- Kids pick their profile in a PWA (React + Vite) and see only what's assigned to them. Search runs entirely on-device.
- Tap ⬇ to store a video on the tablet — full offline playback on planes and road trips, including search and UI.
- Nothing is exposed to the internet: LAN at home, VPN (WireGuard/Tailscale) on the road, HTTPS via DNS-01 certificates (Caddy + Cloudflare DNS).
git clone <this repo> glotzi && cd glotzi
cp .env.example .env # set ADMIN_PIN, DOMAIN, CF_API_TOKEN
docker compose up -d --buildRequires a Docker host on your home network and a Cloudflare-managed domain. Full walkthrough — DNS record, API token, Portainer/GHCR deployment, VPN setup, troubleshooting: docs/SETUP.md.
.env: ADMIN_PIN (parent area PIN — long & random), DOMAIN, CF_API_TOKEN (Cloudflare, Zone:DNS:Edit + Zone:Zone:Read).
Optional (docker-compose.yml / stack environment):
| Variable | Default | Meaning |
|---|---|---|
MAX_HEIGHT |
1080 |
Max video resolution (720 saves ~50% storage) |
SYNC_INTERVAL_HOURS |
6 |
Re-check interval for channels/playlists |
MAX_VIDEOS_PER_CHANNEL |
10 |
Channels are mirrored to their N most recent uploads |
MAX_VIDEOS_PER_PLAYLIST |
20 |
Playlists are mirrored to their first N entries |
All data (DB, videos, thumbnails) lives in the /data volume — that's your backup target.
cd web && npm install
GLOTZI_API=https://glotzi.yourdomain.tld npm run dev # frontend at localhost:5173, real backendHot reload against your running instance — no build, no deploy. Omit GLOTZI_API to proxy to a locally running server instead (cd server && npm install && DATA_DIR=../data ADMIN_PIN=1234 node src/index.js, needs yt-dlp + ffmpeg in PATH). The service worker is disabled on localhost; secure-context APIs (OPFS etc.) work there without HTTPS.
A Capacitor shell ships the app as a sideloadable APK — app-owned storage (no browser eviction of downloads), real app icon, Amazon-Kids-profile capable. Build it via GitHub Actions or locally: see docs/APK.md.
- Capacitor APK for Fire tablets
- Amazon Appstore submission (official Kids profile support)
- Custom APK app icon
- Screen time limits / bedtime mode
- English UI (currently German)
This software is intended for personal, private use — e.g. curating a safe media library for your own children from content you have legitimate access to. Downloading videos may violate the YouTube Terms of Service; check the laws and terms applicable to you before using this software. Do not use Glotzi to redistribute or publicly re-host content. The authors provide this software as-is, without warranty of any kind, and accept no responsibility for how it is used.