Twitch deletes old broadcasts on a schedule. Sub-only VODs vanish when the sub lapses. Even when a video survives, the chat replay you remember is often gone or stuck inside Twitch's player. If you treat streams as your actual archive, "it's on Twitch" is not a retention policy.
Ganymede (~1k GitHub stars, GPL-3.0) is a self-hosted platform built for that problem: record VODs and live streams, store them in a plain directory layout you can browse without the app, and replay chat in real time inside Ganymede plus export a rendered chat file for long-term keeping. It is the successor to Ceres, with a proper queue, SSO, and watched channels that auto-grab past and live broadcasts when filters match.
What it actually does
- Watched channels — subscribe to creators; Ganymede pulls eligible past broadcasts and can capture live streams with stall detection on FFmpeg progress.
- Chat pipeline — download chat logs, render them for playback alongside video, tune render settings; live chat playback in the UI.
- Video pipeline — downloads via tooling in the yt-dlp / TwitchDownloader lineage; optional FFmpeg post-processing; sprite thumbnails for scrubbing.
- Library features — playlists, watch progress, admin UI for VODs/channels/users, webhooks when jobs finish.
- Auth — local users or OpenID Connect SSO; optional force-login so your archive is not public by accident.
- Archival layout — files on disk follow a documented structure (wiki) so a future you can migrate off Ganymede and still open the folder.
Under the hood: Dockerized API/worker plus PostgreSQL. Images on ghcr.io/zibbp/ganymede; shutdown can take ~80 seconds, so compose sets stop_grace_period: 90s.
Why self-host?
You own the terabytes. Mount /data/videos to a NAS or a fat VPS volume in Beauharnois or Toronto; retention is your disk budget, not Twitch's product rules.
Chat and video stay together. Rendered chat plus MP4 (or your chosen format) land in one archive policy, backed up like any other critical media.
Control who watches. REQUIRE_LOGIN, SSO, and OAuth fit a small team or community that should not expose every capture to the open internet.
Recoverable queues. Temp and logs live on the host so a crash mid-download does not silently lose the job story.
Reality check. You need a Twitch application (client ID and secret). Archiving third-party channels must respect Twitch's terms and the broadcaster's rights; Ganymede is infrastructure, not permission to republish someone else's content. GPL-3.0: fine for private or community use; understand obligations if you redistribute a modified version as a service.
What running it takes
Official requirements: Linux, Docker, PostgreSQL (bundled in compose or external), 50 GB+ free space to start (wiki scales this up fast for 1080p libraries). Chat downloads are memory-heavy (~1.9 GB per parallel execution in docs); chat renders hammer CPU. Plan worker limits (MAX_*_EXECUTIONS) to match your box.
# After editing paths, Twitch keys, and DB passwords in docker-compose.yml:
docker compose up -d
# UI on mapped port (example 4800:4000); default login admin / ganymede — change immediately
Point /data/videos at bulk storage. NFS/SMB users set SKIP_CHOWN=true and fix permissions manually. Rootless runs use PUID/PGID like LinuxServer docs describe.
Who it's for (and who should skip it)
Good fit: streamers archiving their own channels, communities preserving allowed creator content, homelabbers who already run Docker and a Postgres backup job.
Skip it: if occasional clips are enough (use Twitch's tools or simple yt-dlp scripts); if you only have a small shared hosting account without Docker and terabytes; if you will not register Twitch API credentials or monitor disk growth.
Hosting in Canada
Ganymede is a storage and bandwidth app disguised as a web UI. A CloudBox VPS with a large data volume, or a VPS that mounts your NAS over the network, keeps captures in-country for teams that care where video sits. Put reverse-proxy TLS in front of the mapped port; do not expose Postgres to the world.
Talk with Swift Host if you want disk sizing for 1080p VODs, chat render concurrency, and backup scope for /data/videos. We are in St. Albert and actually answer the phone.