A self-hosted music downloader with REST API and web interface built with Go and Vue.js. Scyd wraps multiple music downloaders to support various platforms and helps you build your personal music library.
Scyd provides a unified interface for downloading music from multiple platforms using popular tools like yt-dlp and streamrip. Perfect for self-hosters and music enthusiasts who want to create and organize their personal music collections.
- 🎥 YouTube - Videos and playlists
- 🎧 SoundCloud - Tracks and sets
- 🎼 Qobuz - High-quality audio
- 🎵 Deezer - Music streaming platform
- 🔓 Open Source & Self-Hosted - Complete control over your music downloads
- 🔌 REST API - Integrate with automation tools and custom workflows
- 🖥️ Web Interface - User-friendly UI with real-time download progress via WebSockets
- ⚙️ Configurable - Customize download behavior with YAML configuration
- 📁 Auto-Organization - Automatically organize downloaded music for media servers (Jellyfin, Plex)
- 🪝 Hooks - Execute custom commands on download completion or errors
- 📱 Progressive Web App (PWA) - Install on devices and use share functionality from other apps
- 🔗 Share Integration - Download music directly from your devices's share menu
When served over HTTPS, Scyd can be installed as a PWA on your devices. This enables powerful share functionality - simply share a YouTube link or SoundCloud track from your device, select Scyd, and the download starts automatically!
- Docker and/or Docker Compose
- HTTPS setup (required for PWA features)
- Basic understanding of YAML configuration
docker run -d \
--name scyd \
-p 3000:3000 \
-v ./downloads:/downloads \
-v ./output:/output \
-v ./config:/app/config \
--restart unless-stopped \
ghcr.io/nicolassutter/scyd:latestCreate a compose.yaml file:
services:
scyd:
image: ghcr.io/nicolassutter/scyd:latest
container_name: scyd
ports:
- "3000:3000" # Web UI + REST API
volumes:
- ./downloads:/downloads # Temporary download directory
- ./output:/output # Final organized music library
- ./config:/app/config # Configuration directory
restart: unless-stopped
environment:
- TZ=UTC # Set your timezoneRun with:
docker-compose up -d| Path | Purpose |
|---|---|
/downloads |
Temporary storage for downloads in progress |
/output |
Final organized music library (point your media server here) |
/config |
Configuration files directory |
Create a config.yaml file in your config directory.
Example minimal configuration:
users:
username1:
password_hash: "<bcrpt hashed password>"
username2:
password_hash: "<bcrpt hashed password>"
sort_after_download: true # can disable automatic sorting
hooks:
on_error: curl https://your-webhook-url/error
on_download_complete: curl https://your-webhook-url/successPrequisites: bun, Go, Docker, air, make
-
Clone the repository
git clone https://github.com/nicolassutter/scyd.git cd scyd -
Backend (Go)
cd backend go mod download -
Frontend (Vue.js/Nuxt)
cd frontend bun install -
Run Backend and Frontend
make dev
The REST API provides automatic documentation at /docs. Endpoints are protected with cookie-based authentication.
You would first call the /login endpoint to obtain a session cookie and then send this cookie with subsequent requests.
Do not hesitate to open issues or submit pull requests. Contributions are welcome!
This project is licensed under the MIT License - see the LICENSE file for details.
This tool is for educational and personal use only. Please respect copyright laws and the terms of service of the platforms you download from. Users are responsible for ensuring their usage complies with applicable laws and platform policies.