All apps · 0 apps
Siphon
Docker app from WhydahGally's Repository
Overview
Readme
View on GitHubSiphon
A self-hosted playlist downloader & watcher that automatically downloads new additions on a schedule. Built to address shortcomings found in tools like MeTube.
Siphon uses YT-DLP and runs as a daemon with a web UI. Register your playlists, set a schedule, and forget about it. New tracks show up in your library automatically. Any platform supported by yt-dlp works, though Siphon is built and tested with a focus on YouTube.
Siphon is primarily developed using spec-driven development through OpenSpec. Every feature starts as a specification before a single line of code is written. This is not vibe coding. There are actual specs, actual designs, and actual task lists. Revolutionary, right?
Features
- Download - Entire playlists or single videos, with configurable concurrent workers.
- Format selection - Download audio (MP3, OPUS) or video formats (MP4, MKV, WEBM) with quality options.
- Playlist sync - Monitors playlists and auto-downloads newly added videos.
- Scheduled syncing - Configurable per-playlist sync intervals (hourly, daily, whatever you want).
- Smart auto-renaming - Cleans up filenames and titles using embedded metadata and MusicBrainz lookups.
- Manual renaming - Manually rename individual downloaded items from the Web UI or CLI. Changes are applied on disk and in metadata.
- SponsorBlock integration - Automatically removes sponsor segments, intros, outros and non-music sections from downloads using the SponsorBlock community database.
- Cookie support - Upload a browser cookie file to unlock private playlists, age-restricted videos, and members-only content.
- Audio metadata embedding - Embeds artist, title, album and cover art into audio files.
- Web UI - Manage playlists, view download history, configure settings and monitor progress from your browser.
- CLI - Full command-line interface for automation, scripting and debugging.
- Container-first - Designed to run in Docker, built for Unraid.
Screenshots
Setup
Unraid
Siphon is built container-first, designed for Unraid.
Install it from Community Apps (Coming soon):
- Open the Community Apps plugin in your Unraid dashboard.
- Search for Siphon.
- Click Install and configure:
- Downloads path - where your media gets saved (e.g.
/mnt/user/downloads/siphon/) - App Data path - where the database and logs live (e.g.
/mnt/user/appdata/siphon/) - PUID/PGID - user/group IDs for file ownership (defaults:
99/100)
- Downloads path - where your media gets saved (e.g.
- Start the container and open the web UI on port 8778.
Docker
docker run -d \
--name siphon \
-p 8778:8000 \
-v /path/to/downloads:/app/downloads \
-v /path/to/appdata:/app/.data \
-e PUID=1000 \
-e PGID=1000 \
ghcr.io/whydahgally/siphon:latest
Or with docker-compose:
services:
siphon:
image: ghcr.io/whydahgally/siphon:latest
container_name: siphon
restart: unless-stopped
ports:
- "8778:8000"
volumes:
- /path/to/downloads:/app/downloads
- /path/to/appdata:/app/.data
environment:
- PUID=1000
- PGID=1000
The web UI is available at http://<your-ip>:8778.
CLI Commands
| Command | Description |
|---|---|
siphon --help |
Show all available commands. |
siphon start |
Start the Siphon daemon (required for all other commands). |
siphon add <url> |
Register a playlist (--download, --no-watch, --interval, --format, --quality, --output-dir, --auto-rename, --sponsorblock). |
siphon list |
Show all registered playlists. |
siphon sync [<name>] |
Download new items for a specific playlist or all playlists. |
siphon sync-failed [<name>] |
Retry failed downloads for a specific playlist or all. |
siphon cancel |
Cancel all active download jobs. |
siphon delete <name> |
Remove a playlist from the registry. |
siphon delete-all-playlists |
Remove all playlists and sync history from the registry. |
siphon factory-reset |
Wipe all playlists, history and settings. Downloads are not affected. |
siphon config <key> [<value>] |
Get or set a global config value (log-level, interval, max-concurrent-downloads, mb-user-agent, auto-rename, theme, browser-logs, title-noise-patterns, sb-enabled, sb-cats, cookies-enabled, cookie-file). |
siphon config-playlist <name> [<key> [<value>]] |
Get or set per-playlist config (interval, auto-rename, watched, sponsorblock, sb-cats, cookies). |
siphon playlist-items <name> |
List all downloaded items for a playlist. |
siphon rename-item <playlist> <current-name> <new-name> |
Rename a downloaded item in a playlist. Renames the file on disk and sets the rename tier to manual. |
Browser Cookies
Some content requires authentication to download (private playlists, age-restricted videos, members-only posts). See the yt-dlp cookie authentication guide.
Note: Using extracted browser cookies may result in account bans.
Configuring cookies
- Web UI - Go to Settings → Cookies and click the upload button.
- CLI -
siphon config cookie-file /path/to/cookies.txt
Cookie File Security
Siphon communicates over HTTP (no TLS). If you are accessing Siphon over Wi-Fi from a remote server, a compromised device on the same network could intercept it.
Safe one-time alternative: copy the file directly into the container filesystem without touching the network:
docker exec -i siphon sh -c 'cat > /app/.data/cookies.txt' < /path/to/cookies.txt
Note: If you copy the cookie file manually while Siphon is running, the backend will detect it on the next download or sync. However, the web UI will only reflect the change after a browser refresh.
For ongoing encrypted access, place a TLS-terminating reverse proxy in front of Siphon.
Contributing
Contributions are welcome! AI-generated code is also welcome, but only if it follows spec-driven development through OpenSpec. No yolo PRs. Every change needs specs committed alongside the code.
Before opening a PR:
- New features - open a Discussion first to align on scope and approach before writing any specs or code.
- Bug fixes - open an Issue first to confirm the bug and agree on the fix.
When raising a PR:
- Include the OpenSpec artifacts (proposal, design, specs, tasks) in the
openspec/changes/directory. - Ensure specs exist for any new capabilities under
openspec/specs/. - Test your changes locally following the steps provided in the Local Development section below.
Local Development
Prerequisites: Python 3.10+, Node.js 22+, ffmpeg
# Clone and set up
git clone https://github.com/WhydahGally/Siphon.git
cd Siphon
# Python environment
python -m venv .venv
source .venv/bin/activate
pip install -e .
# Start the daemon
siphon start
# In another terminal, run CLI commands
siphon list
For the web UI:
cd src/ui
npm install
npm run dev
Running Tests
Unit tests (no daemon required):
pytest tests/unit/ -v
End-to-end tests require a running network connection and real URLs. Create tests/.env with your secrets:
export E2E_PLAYLIST_URL="https://www.youtube.com/playlist?list=..."
export E2E_SINGLE_VIDEO_URL="https://www.youtube.com/watch?v=..."
export E2E_MB_USER_AGENT="YourApp/1.0 (you@example.com)"
# macOS only - fixes SSL verification for MusicBrainz lookups
export REQUESTS_CA_BUNDLE=/opt/homebrew/etc/openssl@3/cert.pem
Then run (do not have the dev daemon running - the suite manages its own):
make -f tests/Makefile e2e
Submitting Issues
Siphon is a wrapper around yt-dlp. Many issues - especially download failures, authentication errors, format extraction problems are caused by yt-dlp, not Siphon.
Common yt-dlp issues:
- "Video unavailable" - the video is private, deleted, or region-locked.
- "Sign in to confirm your age" - requires cookie authentication. See the Browser Cookies section to configure a cookie file.
- Format extraction errors - usually fixed by updating yt-dlp. Siphon pins a specific yt-dlp version; check if a newer version resolves it.
Before opening an issue, check if it's a yt-dlp problem:
- Ensure that you are using the latest available version of Siphon. Siphon pins yt-dlp to a specific version and updates it with each release.
- Try downloading the same URL directly with yt-dlp from inside the Siphon container:
docker exec siphon yt-dlp <url>. - If yt-dlp fails, the issue is upstream. Check the yt-dlp version Siphon is using (shown in the web UI settings page) and search for matching issues in yt-dlp issues.
- If yt-dlp works fine with the same version or if there is no Siphon update available, we want to hear about it.
When opening an issue, include the following:
- A description of the problem and what you expected to happen.
- The playlist or video URL that triggered the issue.
- Your Siphon configuration at the time the issue occurred (auto-rename, sync interval, sb etc.).
- Your Siphon version and yt-dlp version (shown in the web UI settings page or use the CLI).
- The relevant section of your log file (set log level to
DEBUGfirst to capture more detail). - Steps to reproduce the issue.
Logging
Siphon writes a rolling log file to .data/siphon.log (5 MB max, 1 backup). In Docker, this is inside the app data volume you mapped (e.g. /path/to/appdata/siphon.log). Set the log level to DEBUG before reproducing an issue to capture the most detail.
Log Levels
Siphon supports four log levels, configurable via the CLI or the Settings page in the web UI:
| Level | Description |
|---|---|
DEBUG |
Verbose output including yt-dlp internals. Use when diagnosing issues. |
INFO |
Normal operation. Shows sync activity, downloads and renames. (default) |
WARNING |
Only warnings and errors. |
ERROR |
Only errors. |
Set the log level:
siphon config log-level DEBUG
Browser Logs
Siphon can stream server logs to the browser console for real-time debugging. Enable this in the web UI settings page by toggling Browser Logs. Once enabled, open the browser developer tools (F12) to see log output in the console.
License
Install Siphon on Unraid in a few clicks.
Find Siphon 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.
Categories
Related apps
Explore more like this
Explore allDetails
ghcr.io/whydahgally/siphon:latestRuntime arguments
- Web UI
http://[IP]:[PORT:8000]- Network
bridge- Privileged
- false
Template configuration
Port for the Siphon web interface
- Target
- 8000
- Default
- 8778
- Value
- 8778
Path to store downloaded media
- Target
- /app/downloads
- Default
- /mnt/user/downloads/siphon/
- Value
- /mnt/user/downloads/siphon/
Path to store application data (database, logs)
- Target
- /app/.data
- Default
- /mnt/user/appdata/siphon/
- Value
- /mnt/user/appdata/siphon/
User ID for file permissions
- Default
- 99
- Value
- 99
Group ID for file permissions
- Default
- 100
- Value
- 100
File permission mask for new files
- Default
- 000
- Value
- 000