If you’ve ever watched a Twitch stream and wished you could save it for later, Ganymede might be the solution you’re looking for. This open-source software is designed to make archiving Twitch streams straightforward and automated. Whether you're a content creator, a fan, or someone experimenting with a home lab, Ganymede can help you preserve your favorite streaming moments.
In this blog post, we’ll break down what Ganymede is, how it works, why you might want to archive streams, its use cases, pros and cons, and things to consider before setting it up at home.
What is Ganymede?
Ganymede is an open-source tool designed for automatically archiving Twitch streams. Developed by Zibbp and hosted on GitHub, Ganymede has a Go server and web interface and uses Twitch's API to monitor specific channels. When a stream goes live, Ganymede detects it and begins recording the stream directly to your storage device.
Here’s a quick overview of how it works:
- Setup: You configure Ganymede with your Twitch account and the channels you want to monitor.
- Detection: The software uses Twitch's API to detect when a stream goes live.
- Recording: It records the live stream in real time, saving it to a specified location.
- Archival: Streams are saved in an organized format, often with timestamps and channel names for easy retrieval.
Why Archive Twitch Streams?
Archiving Twitch streams can be useful for several reasons:
- Content Preservation: Twitch streams are not permanently stored on the platform. Archiving can preserve a copy for later viewing or permitted editing. Capture, storage and backup must still succeed.
- Content Creation: Streamers can use archived footage for highlights, YouTube videos, or promotional content.
- Fan Engagement: Fans may want to save streams from their favorite creators for personal viewing or to preserve moments that resonate with them.
- Education and Research: Archiving allows you to study streaming techniques, gameplay, or audience interactions.
- Offline Viewing: Having an archive allows you to watch streams when you don’t have an internet connection.
Use Cases for Ganymede
Here are some practical scenarios where Ganymede can shine:
- For Streamers: Monitor selected channels and archive available broadcasts for future editing or archiving.
- For Fans: Keep a personal library of streams from your favorite Twitch creators.
- For Home Labs: Use Ganymede as part of a media server setup, allowing you to store and serve streams locally.
- For Educators or Researchers: Archive streams for analysis or training purposes, such as eSports coaching or studying audience engagement.
Pros and Cons of Ganymede
Pros:
- Free and Open Source: No cost to use, and you can modify the software if needed.
- Automated: Once set up, Ganymede handles detection and recording without manual intervention.
- Customizable: Configure it to monitor specific channels or save recordings in a format that suits your needs.
- Local Control: Save streams directly to your local storage, giving you control over where the archive is stored. Remote service access, application credentials and viewing permissions still need attention.
Cons:
- Technical Setup: Requires some technical knowledge to install and configure.
- Storage Requirements: Archiving streams can consume a lot of storage space quickly.
- Limited to Twitch: Ganymede is designed specifically for Twitch streams and may not support other platforms.
- Resource Usage: Running Ganymede on a low-powered machine may impact performance.
Considerations for Using Ganymede
Before diving into Ganymede, here are some important things to keep in mind:
- Storage Space: Ensure you have enough storage to accommodate large video files. Use external drives or a dedicated NAS if necessary.
- Network Bandwidth: Recording high-quality streams requires a stable and fast internet connection.
- Power Requirements: If running on a home server or lab, consider the impact on power usage.
- Legal Considerations: Always check the creator’s terms and permissions before archiving their streams. Respect copyright and intellectual property rights.
- Updates and Maintenance: As open-source software, Ganymede may require occasional updates or troubleshooting.
Install from the Supported Container Deployment
The current upstream installation uses a Linux environment with Docker, a Ganymede server container and PostgreSQL. Follow the project's installation documentation for the selected release. The server and browser interface are packaged together in the current image; old deployment instructions may describe a different service layout.
Choose a stable Ganymede image tag and keep the configuration appropriate to that release. The Ganymede GitHub page includes the upstream Compose file and release links. Download the deployment file for your chosen version, read it and customise its environment and storage settings before starting it. If you use Git for source work, Git for Windows provides the tooling; a source checkout alone is not an installed server.
Prepare Storage and Credentials
Define persistent locations for /data/videos, /data/config, /data/logs and /data/temp, plus the PostgreSQL database. Match each container path to the corresponding environment setting. Temporary files are important for recovery and can occupy substantial space while tasks are running.
Create a Twitch application through the Twitch Developer Portal and provide its Client ID and Client Secret in the documented environment variables. These are application credentials; do not confuse them with an ordinary account password or assume copying an ID creates every type of access token. Keep secrets out of public repositories and protect the private configuration file.
The following adaptation of the current upstream example uses a local-only web port and keeps PostgreSQL inside the Compose network. It uses the PostgreSQL 14 layout shown upstream; confirm release compatibility and the database's support lifecycle before adopting a database version for a long-lived deployment. Database major-version upgrades require a migration plan, not simply changing the image number.
Before using the example, create the five local storage directories and set private GANYMEDE_IMAGE, GANYMEDE_DB_PASSWORD, TWITCH_CLIENT_ID and TWITCH_CLIENT_SECRET values in a protected .env file. The image value must include a stable release tag. Save this as compose.yml:
services:
ganymede:
image: "${GANYMEDE_IMAGE:?Set a stable ghcr.io/zibbp/ganymede release tag}"
restart: unless-stopped
depends_on:
ganymede-db:
condition: service_healthy
environment:
TZ: Africa/Johannesburg
DB_HOST: ganymede-db
DB_PORT: "5432"
DB_USER: ganymede
DB_PASS: "${GANYMEDE_DB_PASSWORD:?Set a private database password}"
DB_NAME: ganymede-prd
DB_SSL: disable
TWITCH_CLIENT_ID: "${TWITCH_CLIENT_ID:?Set Twitch application ID}"
TWITCH_CLIENT_SECRET: "${TWITCH_CLIENT_SECRET:?Set Twitch application secret}"
VIDEOS_DIR: /data/videos
TEMP_DIR: /data/temp
LOGS_DIR: /data/logs
CONFIG_DIR: /data/config
REQUIRE_LOGIN: "true"
volumes:
- ./videos:/data/videos
- ./temp:/data/temp
- ./logs:/data/logs
- ./config:/data/config
ports:
- "127.0.0.1:4800:4000"
ganymede-db:
image: postgres:14
restart: unless-stopped
environment:
POSTGRES_PASSWORD: "${GANYMEDE_DB_PASSWORD:?Set a private database password}"
POSTGRES_USER: ganymede
POSTGRES_DB: ganymede-prd
volumes:
- ./database:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
interval: 30s
timeout: 10s
retries: 5
start_period: 60s
The identical database credentials connect the two services. DB_SSL: disable follows the local upstream example; it is not a recommendation for an untrusted remote database connection. Network-attached storage also needs working ownership or ACLs. Upstream documents PUID/PGID and SKIP_CHOWN options; set them deliberately if needed, and verify writable directories without opening permissions broadly.
Start and Secure the First Run
mkdir -p videos temp logs config database
docker compose config --quiet
docker compose up -d
docker compose ps
docker compose logs --tail=80 ganymede
Open http://localhost:4800/ on the Docker host. Upstream documents an initial admin account with password ganymede. Change that password immediately, or establish another administrator before removing the default account. Review registration and viewing access before making the service reachable by other devices.
For LAN or remote use, plan an authenticated access path and an appropriate HTTPS proxy or private VPN. Another container's localhost refers to itself, so configure proxy networking according to the deployment rather than assuming it can reach this loopback port automatically. Keep the database service private.
Understand the Archive Work and Storage Budget
Ganymede's documented output includes video, metadata, chat JSON, a rendered chat video and thumbnails. Its recoverable queue makes the stages visible, but successful detection is not proof that the completed files are usable. Video downloading, conversion, thumbnail creation, chat download and rendering have distinct resource demands and concurrency controls.
Custom FFmpeg parameters may perform conversion rather than a lossless remux. Chat rendering can add significant CPU work and storage. Do not assume all captures are frame-perfect or include every chat event: network interruptions, source availability, authentication and service changes can affect what is obtained.
As a planning calculation, a constant total bitrate of 6 Mb/s for one hour is approximately 2.7 GB in decimal units, before extra files and any processing copies. Eight hours would be roughly 21.6 GB at that bitrate. Resolution alone does not determine file size. Leave headroom for temporary and converted video, chat rendering and several concurrent tasks; the project's storage guide explains why a working archive can briefly need much more than its final video size.
Test One Archive Before Automating Many
Start with a short available broadcast you own or have permission to archive. Watch the queue and logs, confirm the expected output directory and play the beginning, middle and end. Check audio sync and chat playback if required. Then add one watched channel and verify the selected filters and live/VOD behaviour.
Keep polling and concurrency within the project's supported configuration. A recoverable task cannot reconstruct a segment that was never captured and is no longer available from the source. Monitor failures and free space, rather than trusting automation silently. Retaining a local video does not itself give permission to redistribute it, and chat archives may contain information you should not publish.
Maintenance and Recovery
Back up PostgreSQL using a supported consistent method, along with configuration and archive files. Retain a copy outside the server and test restoration of metadata and a representative video. Files are intentionally usable outside Ganymede, but losing the database can still lose application organisation and playback state.
Review release notes and deployment changes before upgrading the pinned application tag. Wait for or account for active jobs, keep a recoverable backup and validate login and archiving afterward. Monitor mounted storage so a disconnected NAS does not quietly redirect writes onto an unsuitable local filesystem.
For optional analysis of your own archive metadata, Python can be useful; the official Python website provides installers for those separate scripts. It is not a prerequisite for running the container deployment.
Conclusion
Ganymede is an excellent option to consider for an organised Twitch archive, with useful automation and local control. Its value is strongest when the capture, storage, permissions and recovery plan are clear. Start with a small verified archive, then expand the watched channels and retention policy as your server and storage allow.
Read the Ganymede GitHub page, storage guidance and file-structure reference. Consult the Ganymede GitHub issues page when a reproducible problem remains.



