A self-hosted, multi-user "Netflix for Twitch VODs" — track the streamers you follow, browse their past broadcasts, and watch them with resume, watched state, synced chat replay, split-view, and a real-world clock. Runs entirely on your own hardware; private to your LAN.
Website: vault.felixkargl.dev
Twitch VODs are scattered, hard to keep up with, and disappear after a few weeks. There's no good way to see new VODs across all the streamers you follow, track what you've already watched, or resume where you left off — and once a VOD is deleted, it's gone.
Vault is a personal dashboard that fixes that. It's a discovery and viewing layer on top of Twitch (not an archive): it polls the streamers you subscribe to, surfaces their VODs in one feed, and remembers your progress — like a private Netflix for your Twitch follows.
Features
- Personal feed — VODs from your subscribed streamers, with watched badges, resume progress bars, live indicators, and "age" stamps.
- Multi-user — everyone logs in with their own Twitch account and gets their own follows, watched state, and progress (shared streamer/VOD catalog). The first user becomes admin and controls registration + users in-app.
- Player & theater mode — embedded Twitch player with resume, auto-mark-watched at 90%, a continue-watching row, and a layout that fills the screen without fullscreen.
- Real-world clock — overlay showing the actual time of day a moment aired.
- Synced chat replay — original stream chat scrolls in time with playback.
- Game chapters — jump to each game played during a stream.
- Split view — two players side by side, with one-click sync to the same real-world moment (great for multi-POV roleplay).
- One-click download — save a VOD to your computer as a single playable
.tsfile, streamed straight from Twitch's CDN. - Deleted detection + best-effort recovery — deleted VODs are flagged, and recently-deleted ones can often still be played back.
- Categories + filters, mark-older-watched, dark & light themes saved per account.
Tech stack: TanStack Start (React, SSR) · PostgreSQL + Drizzle ORM · Better Auth (Twitch OAuth) · shadcn/ui + Tailwind v4 · BullMQ + Redis · pnpm · Docker + Caddy.
Everyone needs: a free Twitch application
(Client ID + Secret) with the OAuth redirect URL
https://<your-host>/api/auth/callback/twitch. The login page shows your
exact URL. Then pick where you're running Vault:
Private to your network. A bundled Caddy serves HTTPS with a self-signed cert (Twitch OAuth requires https off-localhost).
git clone https://github.com/Bumpfi/vault.git && cd vault
cp .env.production.example .env # fill Twitch creds, a secret, your host
docker compose -f docker-compose.prod.yml --env-file .env up -d --build
docker compose -f docker-compose.prod.yml exec web node_modules/.bin/drizzle-kit push --force --config drizzle.config.ts
docker compose -f docker-compose.prod.yml restart workerOpen https://<your-host>, accept the certificate warning, sign in.
Real HTTPS via Coolify's proxy — use docker-compose.coolify.yml (no
bundled Caddy, env via Coolify's UI). New resource → Docker Compose → set the
compose location, put your domain on the web service as
https://app.yourdomain.com:3000, fill the env vars, deploy. Full
click-by-click in DEPLOY.md.
No Docker stack needed beyond Postgres/Redis — see Contributing below.
Full step-by-step for every path (DNS, Twitch redirect URL, updates, 502 troubleshooting) is in DEPLOY.md.
- Sign in with Twitch — the first account becomes the admin, who can
enable/disable registration for further users and manage them in
Settings → Administration. (An optional
ALLOWED_TWITCH_USER_IDSallowlist additionally restricts signups.) The login page has a built-in setup guide with your exact OAuth callback URL. - Settings → Import follows to pull in the channels you follow, then toggle subscriptions and assign categories ("RP", "Variety", …).
- Browse the feed — filter by category, streamer, or "unwatched only"; pick up where you left off in the continue-watching row.
- Watch — resume, auto-watched at 90%, synced chat replay, real-world clock, and game-chapter jump points.
- Split view — open a VOD → Split view → pick a second one → sync both to the same real-world moment.
- Download — on any VOD's watch page, Download saves it to your machine
as a single
.tsfile (plays in VLC/mpv).
VOD polling (every 15 min) and availability checks run automatically in the background worker.
Contributions welcome. To run Vault locally for development:
git clone https://github.com/Bumpfi/vault.git
cd vaultpnpm install
docker compose up -d # local Postgres + Rediscp .env.example .env.local
# fill TWITCH_CLIENT_ID / TWITCH_CLIENT_SECRET, and generate a secret:
# openssl rand -base64 32 -> BETTER_AUTH_SECRETRegister http://localhost:3000/api/auth/callback/twitch as an OAuth Redirect
URL in your Twitch app.
pnpm db:push
pnpm dev # web app on http://localhost:3000
pnpm worker # background jobs (second terminal)pnpm test # vitest
pnpm lint # eslintIf you'd like to contribute, please fork the repository and open a pull request
against the main branch.
- Chat replay, game chapters, deleted-VOD recovery, and downloads use Twitch's unofficial endpoints/CDN paths — undocumented and may break if Twitch changes them (the app degrades gracefully).
- Deleted VODs are only recoverable for a short window while their segments remain on Twitch's CDN; recovered VODs play in a basic HLS player without chat.
Vault is an independent project, not affiliated with or endorsed by Twitch. It uses the official Twitch API where possible; some features (chat replay, recovery, downloads) rely on unofficial endpoints and may conflict with Twitch's Terms of Service — use them at your own discretion, for personal use. Downloaded VODs are the copyright of their creators/Twitch: keep them private, don't re-upload or redistribute.