Get Vynl running on your box.
Drop the compose file on a Mac mini, NAS, or Linux host. Mount your music read-only, start the container, and open Vynl in your browser. Run Vynl beside your music, not instead of it.
The compose, tuned per OS.
The Vynl image is the same on every platform. Network mode, volume paths, and a couple of Docker-specific notes are not — that's what the three tabs handle.
On Linux, network_mode: host gives Vynl direct access to your LAN — Sonos and AirPlay discovery just work. On macOS, Docker Desktop's host networking is limited; if Sonos doesn't show up, switch to ports: ["3101:3101"] and read the discovery notes in About Docker.
services:
vynl:
image: cand0rian/vynl-app:latest
container_name: vynl
restart: unless-stopped
# Linux: full host networking. macOS Docker Desktop has limited host networking — see "About Docker" below.
network_mode: host
volumes:
# Linux example: - /srv/music:/music
# macOS example: - /Users/you/Music:/music
- /srv/music:/music # change to your Music path
- vynl-data:/app/data # Vynl state (SQLite + AI cache)
- vynl-covers:/app/public/covers # cover-art cache
- ./beets-config.yaml:/home/vynl/.config/beets/config.yaml:ro
environment:
- DOCKERHUB_IMAGE=cand0rian/vynl-app
- MUSIC_LIBRARY_PATH=/music/library
- BEETS_DB_PATH=/music/library.db
- VYNL_DB_DIR=/app/data
- PODCAST_STORAGE_PATH=/music/podcasts
- VYNL_HOST=http://<YOUR_IP_HERE>:3101
- NEXT_PUBLIC_VYNL_HOST=http://<YOUR_IP_HERE>:3101
# Optional: uncomment and fill in for Spotify/AI features
# - ANTHROPIC_API_KEY=
# - SPOTIFY_CLIENT_ID=
# - SPOTIFY_CLIENT_SECRET=
# - SPOTIFY_REDIRECT_URI=http://<YOUR_IP_HERE>:3101/api/spotify/callback
volumes:
vynl-data:
vynl-covers:
<YOUR_IP_HERE> (or <YOUR_NAS_IP>) with your LAN IP — e.g. 192.168.1.42. Localhost won't work for Sonos discovery.First time with Docker?
Docker is how Vynl ships a working stack — Node, FFmpeg, Beets, the AI engine, the web UI — as one immutable image you pull and run. Everything below applies to every platform tab above.
One published image at cand0rian/vynl-app. Pull :latest to track the current release, or pin to a tag like :0.6.36 for reproducibility.
/music— your library, mounted from the host (read-only is fine)/app/data— Vynl's SQLite, AI cache, listening history/app/public/covers— cover-art cache (small, frequently written)beets-config.yaml— your Beets config, mounted read-only
Host networking (Linux, NAS) gives Vynl direct LAN access — Sonos and AirPlay discover the container as if it were a host process. Port mapping (Mac, Windows) exposes only port 3101; discovery often needs an extra mDNS relay or running Sonos/AirPlay devices on the same subnet as the host.
Don't have Docker yet?
- File permissions: Make sure the user running Docker can read your music directory. On Linux this usually means matching UID/GID; on NAS, the shared-folder permissions UI.
- Sonos discovery on Mac/Windows: If speakers don't appear, install an mDNS relay (e.g.
avahi-publish) or use a thin Linux VM/host withnetwork_mode: host. - Beets DB path mismatch: If you already have a Beets library with absolute host paths, use
BEETS_PATH_REMAPto translate them to the container's mount points. - Updating: Pull the new image and recreate — your data and covers volumes persist across container recreations.
One image. A whole stack.
No spelunking through a dozen repos. The Vynl image bundles every component, pinned and tested together.
Every flag, explained.
The compose above includes the full set. Here's what each one does, whether you need it, and where to put your own values.
MUSIC_LIBRARY_PATHWhere the container looks for your music library (inside the container path).BEETS_DB_PATHPath to the Beets SQLite library DB. Sits next to your library.BEETS_PATH_REMAPMap external paths used by an existing Beets DB to the container's mount points. Semicolon-separated pairs in the form host::container.VYNL_DB_DIRWhere Vynl writes its own state — listening history, AI cache, playlist data.PODCAST_STORAGE_PATHWhere downloaded podcast episodes are stored.VYNL_HOSTPublic-facing URL Vynl uses internally (e.g. http://192.168.1.10:3101). Needed for Sonos handoff.NEXT_PUBLIC_VYNL_HOSTSame URL, exposed to the web client. Replace <YOUR_IP_HERE> with your LAN IP.ANTHROPIC_API_KEYEnables AI Discovery, taste profile, and Library Doctor. Vynl works fine without it; AI features stay disabled.SPOTIFY_CLIENT_ID / SECRETRequired only for one-time Spotify playlist migration. Disconnect after import if you want.DOCKERHUB_IMAGESource image identifier — used by the in-app updater to check for newer builds.Anything from a Pi to a NAS
Signed and reproducible.
Every release tag is signed with cosign and published to GHCR with a transparent supply-chain log. You don't have to verify, but the option is there.
Four things to do next.
/volume1/Music paths to your real library.<YOUR_IP_HERE> so Sonos can reach the container.Need to go deeper?
The install guide on this site walks through every step. The GitHub repo holds the source, the issue tracker, and the place to ask the maintainer questions directly.
