Intelligent Music & Video Automation Platform
See the code
Find it, fetch it, verify it, tag it, file it, play it. SoulSync replaces a stack of *arr apps, taggers and scripts with one app that actually knows your library.
Website · Discord · Install · Setup guide · Issues
[!IMPORTANT] If you use Soulseek, share files in slskd (
http://localhost:5030/shares). Leechers get banned by the network.
Most self-hosted media setups are a relay race: one app wants things, another searches, a third downloads, a fourth tags, a fifth tells the server, and when a handoff fails nobody notices. SoulSync runs the whole race itself and keeps the receipts.
| Download sources | Soulseek (slskd), Tidal, Qobuz, Deezer, HiFi, YouTube, SoundCloud, Lidarr, Torrent and Usenet (via Prowlarr). One source or a drag-ordered hybrid chain. |
| Metadata | Spotify (with or without an account), Apple Music / iTunes, Deezer, Discogs, MusicBrainz, plus 14 background enrichment workers |
| Media servers | Plex, Jellyfin, Navidrome, or SoulSync Standalone (no server needed) |
| Playlist sources | Spotify, Tidal, Qobuz, Deezer, YouTube, YouTube Music, Apple Music links, ListenBrainz, Last.fm, Beatport, SoulSync's own mixes, and CSV / TSV / TXT / M3U files |
| Video | Movies, TV and YouTube channels with TMDB / TVDB, Prowlarr, qBittorrent / Transmission / Deluge / SABnzbd / NZBGet, Plex and Jellyfin |
| Automation | Visual WHEN → DO → THEN builder, 60+ triggers and actions, Discord / Telegram / Pushbullet / webhook notifications |
| Runs on | Docker (amd64 + arm64), Unraid, or plain Python 3.11 |

The home screen is split in two: your music on the left, the machine on the right.
Bring a playlist in from anywhere, keep a mirror of it, and keep your media server's copy in step on a schedule.
One search box with three modes.
Sources. Use one, or build a hybrid chain in the order you prefer. If a source can't meet your quality profile, SoulSync falls through to the next.
| Source | Notes |
|---|---|
| Soulseek | via slskd. Whole-album grabs from one peer, peer quality scoring, search throttling, free-disk guard |
| Tidal | device-flow login, up to FLAC 24-bit Hi-Res |
| Qobuz | up to Hi-Res Max (24-bit/192 kHz) |
| Deezer | ARL token, FLAC → MP3 320 → MP3 128 fallback |
| HiFi | free lossless via public instances, no account, automatic failover |
| Amazon Music | RETIRED — the public proxy it relied on is gone; saved chains silently drop it |
| YouTube | yt-dlp, cookies supported |
| SoundCloud | anonymous |
| Lidarr | hand an album to Lidarr's indexers, import only the tracks you need |
| Torrent | Prowlarr search; qBittorrent, Transmission, Deluge or aria2; seeding goals; archive extraction |
| Usenet | Prowlarr search; SABnzbd or NZBGet; remote path mappings |
Downloads page. Live batches with speed and ETA, "download this next", per-track audit trails (lifecycle, embedded tags, lyrics), a Review queue for anything that needs a human, and a Clients pane that manages slskd, your torrent client and your usenet client from one place.
$albumartist/$album/$track - $title and friends), including beets-compatible $atypes release labels so [2017][EP][Live] Audiotree Live and a plain [2019] Tokyo come out of the same template.$albumartist/$albumartist - $album/$track - $title and friends).A personal front page shaped by your library, your listening and your watchlist.
An inbox for everything in your staging folder, with a Picard-style matcher.
A full web player built into the sidebar.
A complete video side with its own database, pages and pipeline. Switch sides from the header; each profile can be given music, video, or both.
Library
Detail pages
Finding things
Getting things
Making it yours
YouTube
A visual WHEN → DO → THEN builder shared by music and video.
{variables}.Soulseek rooms and private messages through slskd, in a Discord-style layout.
/np, /want, /poll and friends./api/v1 covering library, search, wishlist, watchlist, downloads, playlists, discover, settings, profiles and video.
POST /api/v1/request with a query and SoulSync searches, matches and downloads it. Good for Discord bots and shortcuts.SoulSync Companion puts your server's knowledge on the pages where you discover music. While browsing Spotify, Deezer, YouTube, Bandcamp, SoundCloud or Tidal, small pills next to artists, albums, tracks and playlists show your real library state — ✓ In library, + Wishlist, 👁 Watching — and one click wishlists a track, watches an artist, or saves a whole playlist straight to your server. Chrome and Firefox, one Manifest V3 codebase.
curl -O https://raw.githubusercontent.com/Nezreka/SoulSync/main/docker-compose.yml
docker compose up -d
# open http://localhost:8008
The image runs as a non-root user with PUID / PGID / UMASK support, and bundles ffmpeg, fpcalc (AcoustID), Deno and a current yt-dlp.
| Port | Used for |
|---|---|
8008 | Web UI and API |
8888 | Spotify OAuth callback |
8889 | Tidal OAuth callback |
| Channel | Image | What it is |
|---|---|---|
| Stable | boulderbadgedad/soulsync:latest | Promoted from dev to main when a release is ready. Recommended. |
| Pinned | boulderbadgedad/soulsync:3.4.9 or ghcr.io/nezreka/soulsync:3.4.9 | A permanent tag for each stable release |
| Dev | ghcr.io/nezreka/soulsync:dev | Rebuilt on every push to dev. New features first, occasional rough edges |
| Nightly | ghcr.io/nezreka/soulsync:nightly | Built at 04:00 UTC when dev changed that day |
| Snapshot | ghcr.io/nezreka/soulsync:dev-YYYYMMDD-<sha> | An exact dev build to pin to |
To switch, change image: in docker-compose.yml, then docker compose pull && docker compose up -d.
Install from Community Applications, or add the template manually:
https://raw.githubusercontent.com/Nezreka/SoulSync/main/templates/soulsync.xml
Set PUID / PGID to match your share permissions (default 99 / 100). For the dev channel, change the container's Repository to ghcr.io/nezreka/soulsync:dev. See Support/UNRAID.md.
git clone https://github.com/Nezreka/SoulSync
cd SoulSync
python -m pip install -r requirements.txt
# build the web UI (Docker does this for you)
cd webui && npm ci && npm run build && cd ..
gunicorn -c gunicorn.conf.py wsgi:application
# open http://localhost:8008
After every git pull, rebuild the web UI (cd webui && npm ci && npm run build) before restarting. If webui/static/dist/.vite/manifest.json is missing or stale, pages won't load correctly.
For YouTube streaming and music videos on bare metal you also need:
winget install DenoLand.Deno, or see deno.com).python -m pip install -U --pre "yt-dlp[default]".Two terminals, so the backend and Vite reload independently:
# backend (restarts on Python changes)
python -m pip install -r requirements-dev.txt
gunicorn -c gunicorn.dev.conf.py wsgi:application
# frontend (hot reload)
cd webui && npm ci && npm run dev
python dev.py starts both on any OS (./dev.sh on Unix). Run tests with python -m pytest, and see webui/README.md for frontend notes.
settings.yml under web > authentication > api_keys, then restart slskd.http://127.0.0.1:8888/callback.Behind Docker or a remote host? See Support/DOCKER-OAUTH-FIX.md.
Open http://localhost:8008. The setup wizard walks you through the basics; everything else lives in Settings:
localhost (inside Docker that means the container itself).| What | Container path | Notes |
|---|---|---|
| Config | /app/config | |
| Logs | /app/logs | |
| Databases | /app/data | Use a named volume (soulsync_database:/app/data). Bind-mounting a host path here can hide files the app needs. |
| Downloads | /app/downloads | The same folder slskd and your clients download to |
| Library output | /app/Transfer | Where organized music is filed |
| Import | /app/Staging | Optional, for importing music you already have |
| Music videos | /app/MusicVideos | Optional |
| Podcasts / audiobooks | /app/podcasts, /app/audiobooks | Optional |
| Video | /media/movies, /media/tv, /media/youtube | Optional, for the video side |
Useful environment variables: PUID, PGID, UMASK, TZ, SOULSYNC_URL_BASE (serve under a sub-path, see docs/REVERSE_PROXY_SUBPATH.md), and SOULSYNC_LOG_LEVEL.
SoulSync uses a dev → main flow:
main: releases. :latest builds from here, and it only receives merges from dev.dev: integration. :dev and nightly images build from here.dev, and open PRs against dev.To open a PR:
dev: git checkout -b fix/your-change devdev (not main).Ruff config lives in pyproject.toml. It's intentionally lenient: it catches real bugs, not style nits.
Bugs and ideas: open a GitHub issue. For help, Discord is fastest.
MIT. See license.txt.
If SoulSync saves you time, consider supporting it on Ko-fi.
919 followers · starred Jan 2026
2,288 followers · starred Dec 2025
145 followers · starred Jun 2026
82 followers · starred Feb 2026
Intelligent Music & Video Automation Platform
See the code
Find it, fetch it, verify it, tag it, file it, play it. SoulSync replaces a stack of *arr apps, taggers and scripts with one app that actually knows your library.
Website · Discord · Install · Setup guide · Issues
[!IMPORTANT] If you use Soulseek, share files in slskd (
http://localhost:5030/shares). Leechers get banned by the network.
Most self-hosted media setups are a relay race: one app wants things, another searches, a third downloads, a fourth tags, a fifth tells the server, and when a handoff fails nobody notices. SoulSync runs the whole race itself and keeps the receipts.
| Download sources | Soulseek (slskd), Tidal, Qobuz, Deezer, HiFi, YouTube, SoundCloud, Lidarr, Torrent and Usenet (via Prowlarr). One source or a drag-ordered hybrid chain. |
| Metadata | Spotify (with or without an account), Apple Music / iTunes, Deezer, Discogs, MusicBrainz, plus 14 background enrichment workers |
| Media servers | Plex, Jellyfin, Navidrome, or SoulSync Standalone (no server needed) |
| Playlist sources | Spotify, Tidal, Qobuz, Deezer, YouTube, YouTube Music, Apple Music links, ListenBrainz, Last.fm, Beatport, SoulSync's own mixes, and CSV / TSV / TXT / M3U files |
| Video | Movies, TV and YouTube channels with TMDB / TVDB, Prowlarr, qBittorrent / Transmission / Deluge / SABnzbd / NZBGet, Plex and Jellyfin |
| Automation | Visual WHEN → DO → THEN builder, 60+ triggers and actions, Discord / Telegram / Pushbullet / webhook notifications |
| Runs on | Docker (amd64 + arm64), Unraid, or plain Python 3.11 |

The home screen is split in two: your music on the left, the machine on the right.
Bring a playlist in from anywhere, keep a mirror of it, and keep your media server's copy in step on a schedule.
One search box with three modes.
Sources. Use one, or build a hybrid chain in the order you prefer. If a source can't meet your quality profile, SoulSync falls through to the next.
| Source | Notes |
|---|---|
| Soulseek | via slskd. Whole-album grabs from one peer, peer quality scoring, search throttling, free-disk guard |
| Tidal | device-flow login, up to FLAC 24-bit Hi-Res |
| Qobuz | up to Hi-Res Max (24-bit/192 kHz) |
| Deezer | ARL token, FLAC → MP3 320 → MP3 128 fallback |
| HiFi | free lossless via public instances, no account, automatic failover |
| Amazon Music | RETIRED — the public proxy it relied on is gone; saved chains silently drop it |
| YouTube | yt-dlp, cookies supported |
| SoundCloud | anonymous |
| Lidarr | hand an album to Lidarr's indexers, import only the tracks you need |
| Torrent | Prowlarr search; qBittorrent, Transmission, Deluge or aria2; seeding goals; archive extraction |
| Usenet | Prowlarr search; SABnzbd or NZBGet; remote path mappings |
Downloads page. Live batches with speed and ETA, "download this next", per-track audit trails (lifecycle, embedded tags, lyrics), a Review queue for anything that needs a human, and a Clients pane that manages slskd, your torrent client and your usenet client from one place.
$albumartist/$album/$track - $title and friends), including beets-compatible $atypes release labels so [2017][EP][Live] Audiotree Live and a plain [2019] Tokyo come out of the same template.$albumartist/$albumartist - $album/$track - $title and friends).A personal front page shaped by your library, your listening and your watchlist.
An inbox for everything in your staging folder, with a Picard-style matcher.
A full web player built into the sidebar.
A complete video side with its own database, pages and pipeline. Switch sides from the header; each profile can be given music, video, or both.
Library
Detail pages
Finding things
Getting things
Making it yours
YouTube
A visual WHEN → DO → THEN builder shared by music and video.
{variables}.Soulseek rooms and private messages through slskd, in a Discord-style layout.
/np, /want, /poll and friends./api/v1 covering library, search, wishlist, watchlist, downloads, playlists, discover, settings, profiles and video.
POST /api/v1/request with a query and SoulSync searches, matches and downloads it. Good for Discord bots and shortcuts.SoulSync Companion puts your server's knowledge on the pages where you discover music. While browsing Spotify, Deezer, YouTube, Bandcamp, SoundCloud or Tidal, small pills next to artists, albums, tracks and playlists show your real library state — ✓ In library, + Wishlist, 👁 Watching — and one click wishlists a track, watches an artist, or saves a whole playlist straight to your server. Chrome and Firefox, one Manifest V3 codebase.
curl -O https://raw.githubusercontent.com/Nezreka/SoulSync/main/docker-compose.yml
docker compose up -d
# open http://localhost:8008
The image runs as a non-root user with PUID / PGID / UMASK support, and bundles ffmpeg, fpcalc (AcoustID), Deno and a current yt-dlp.
| Port | Used for |
|---|---|
8008 | Web UI and API |
8888 | Spotify OAuth callback |
8889 | Tidal OAuth callback |
| Channel | Image | What it is |
|---|---|---|
| Stable | boulderbadgedad/soulsync:latest | Promoted from dev to main when a release is ready. Recommended. |
| Pinned | boulderbadgedad/soulsync:3.4.9 or ghcr.io/nezreka/soulsync:3.4.9 | A permanent tag for each stable release |
| Dev | ghcr.io/nezreka/soulsync:dev | Rebuilt on every push to dev. New features first, occasional rough edges |
| Nightly | ghcr.io/nezreka/soulsync:nightly | Built at 04:00 UTC when dev changed that day |
| Snapshot | ghcr.io/nezreka/soulsync:dev-YYYYMMDD-<sha> | An exact dev build to pin to |
To switch, change image: in docker-compose.yml, then docker compose pull && docker compose up -d.
Install from Community Applications, or add the template manually:
https://raw.githubusercontent.com/Nezreka/SoulSync/main/templates/soulsync.xml
Set PUID / PGID to match your share permissions (default 99 / 100). For the dev channel, change the container's Repository to ghcr.io/nezreka/soulsync:dev. See Support/UNRAID.md.
git clone https://github.com/Nezreka/SoulSync
cd SoulSync
python -m pip install -r requirements.txt
# build the web UI (Docker does this for you)
cd webui && npm ci && npm run build && cd ..
gunicorn -c gunicorn.conf.py wsgi:application
# open http://localhost:8008
After every git pull, rebuild the web UI (cd webui && npm ci && npm run build) before restarting. If webui/static/dist/.vite/manifest.json is missing or stale, pages won't load correctly.
For YouTube streaming and music videos on bare metal you also need:
winget install DenoLand.Deno, or see deno.com).python -m pip install -U --pre "yt-dlp[default]".Two terminals, so the backend and Vite reload independently:
# backend (restarts on Python changes)
python -m pip install -r requirements-dev.txt
gunicorn -c gunicorn.dev.conf.py wsgi:application
# frontend (hot reload)
cd webui && npm ci && npm run dev
python dev.py starts both on any OS (./dev.sh on Unix). Run tests with python -m pytest, and see webui/README.md for frontend notes.
settings.yml under web > authentication > api_keys, then restart slskd.http://127.0.0.1:8888/callback.Behind Docker or a remote host? See Support/DOCKER-OAUTH-FIX.md.
Open http://localhost:8008. The setup wizard walks you through the basics; everything else lives in Settings:
localhost (inside Docker that means the container itself).| What | Container path | Notes |
|---|---|---|
| Config | /app/config | |
| Logs | /app/logs | |
| Databases | /app/data | Use a named volume (soulsync_database:/app/data). Bind-mounting a host path here can hide files the app needs. |
| Downloads | /app/downloads | The same folder slskd and your clients download to |
| Library output | /app/Transfer | Where organized music is filed |
| Import | /app/Staging | Optional, for importing music you already have |
| Music videos | /app/MusicVideos | Optional |
| Podcasts / audiobooks | /app/podcasts, /app/audiobooks | Optional |
| Video | /media/movies, /media/tv, /media/youtube | Optional, for the video side |
Useful environment variables: PUID, PGID, UMASK, TZ, SOULSYNC_URL_BASE (serve under a sub-path, see docs/REVERSE_PROXY_SUBPATH.md), and SOULSYNC_LOG_LEVEL.
SoulSync uses a dev → main flow:
main: releases. :latest builds from here, and it only receives merges from dev.dev: integration. :dev and nightly images build from here.dev, and open PRs against dev.To open a PR:
dev: git checkout -b fix/your-change devdev (not main).Ruff config lives in pyproject.toml. It's intentionally lenient: it catches real bugs, not style nits.
Bugs and ideas: open a GitHub issue. For help, Discord is fastest.
MIT. See license.txt.
If SoulSync saves you time, consider supporting it on Ko-fi.
919 followers · starred Jan 2026
2,288 followers · starred Dec 2025
145 followers · starred Jun 2026
82 followers · starred Feb 2026