Troubleshooting
The 90% of support questions, with the fix inline. If your issue isn't here, file a GitHub issue.
Library + import
My library scan finished but no music shows up
Check the /music mount inside the container:
docker exec vynl ls /music | head
If you see "No such file" or an empty dir, the volume mount path is wrong. Edit docker-compose.yml → volumes: → confirm the LEFT side of /path:/music:ro is your real music folder, then docker compose up -d.
Scan is "stuck" at the same number for hours
Check the logs:
docker compose logs vynl --tail=100 -f
Most common cause: a single corrupt audio file is hanging the metadata parser. Look for the last filename in the log; remove or fix that file, restart.
Beets sync brought in tracks but album art is missing
Beets stores embedded art inside the audio files. Vynl extracts it on first read, but only if the file is reachable. If your /music mount path differs from where beets imported the files originally, the file paths in library.db will be wrong. Fix:
# Inside the container — confirm beets can read its own paths
docker exec vynl node -e "
const Database = require('better-sqlite3');
const db = new Database('/music/.beets/library.db', { readonly: true });
const row = db.prepare('SELECT path FROM items LIMIT 1').get();
console.log('Beets thinks files are at:', row.path.toString());
"
If the printed path doesn't exist (docker exec vynl ls <that-path> fails), you need to either move the music to that path inside the container, or use beets' move command to fix the paths.
Covers + images
Album covers show the Dragon DJ logo instead of art
This is the default placeholder for any album with no cover yet. To find covers:
- Open the album
- Hover the cover slot → click the small Image icon (bottom-left)
- Pick from the search results
If you've already done this and the cover STILL shows as the dragon, see the next issue.
"Find Cover Art" downloaded the file but it doesn't display
This was a bug in versions before 0.6.33. Update:
docker compose pull && docker compose up -d
The 0.6.33+ release added /api/covers/[filename] and includes a boot migration that rewrites old /covers/... paths to /api/covers/... automatically.
Hard refresh doesn't help
Clear the browser cache for the Vynl host, then reload.
Sonos
No Sonos rooms appear
Most common cause: Vynl isn't running on the same LAN as your Sonos speakers, OR isn't using network_mode: host. Sonos discovery uses SSDP (UDP multicast) which doesn't traverse Docker bridge networks.
Fix in docker-compose.yml:
services:
vynl:
network_mode: host # required for Sonos discovery
# remove the `ports:` section when using host mode — it's redundant
Sonos rooms appear but pressing play does nothing (Error 701)
The Sonos speaker can't reach Vynl's audio URL. Two checks:
- Is
NEXT_PUBLIC_VYNL_HOSTset to a LAN-reachable IP, not a Tailscale hostname?docker exec vynl env | grep NEXT_PUBLIC_VYNL_HOST # Expect: NEXT_PUBLIC_VYNL_HOST=http://192.168.x.x:3101 - Can the speaker reach that IP? Sonos speakers are on the LAN; Tailscale hostnames don't resolve for them.
AI features
"Generate Playlist" returns nothing
Most likely: the Anthropic API key isn't set. Go to Settings → API Keys → fill in Anthropic API Key → Save → retry.
If the key is set: check the logs for 429 (rate-limited) or 401 (invalid key).
AI Discovery says my taste profile is empty
You need at least 5 rated tracks (any star rating) AND 20 played tracks for the taste profile generator to have anything to work with.
Spotify Migration
"0 tracks matched" after sync
The matcher is fuzzy on (title, artist, album, ISRC). Common reasons for low match rates:
- Your beets library uses heavily-cleaned titles (e.g. "feat." stripped) that don't match Spotify's titles
- Many tracks in your library don't have ISRC tags
- Different release years for the same album in your library vs Spotify
Workaround: re-run the matcher after running Library Doctor → Metadata Enrichment, which fills missing ISRCs from MusicBrainz.
Containers + Docker
"Cannot connect to the Docker daemon" on macOS
Docker Desktop isn't running. Open it from /Applications.
Vynl restarts on a loop
docker compose logs vynl --tail=200
If the last lines reference SQLite locking or "database is locked", your container is restarting too fast. Add a healthcheck delay or ensure you're not running two Vynl containers against the same vynl-data volume.
Container is healthy but page hangs
Usually a Next.js hydration mismatch — happens once in a blue moon after a major version jump. Fix:
docker compose restart vynl
# If that doesn't fix it:
docker compose down && docker compose up -d
File watcher
Watcher imported 0 tracks but didn't error
Pre-v0.6.30, this would silently auto-delete the source folder. Don't run a Vynl older than 0.6.30 — update immediately. The current watcher never deletes files under any condition.
Watcher isn't triggering on new files
Check Settings → File Watcher → confirm:
- The watch path exists inside the container
- The path is correctly mapped via
docker-compose.ymlvolumes - The watcher status shows "Running" (not stopped)
- Debounce isn't set so high (e.g., 300 seconds) that you're not waiting long enough
Getting more help
- Logs first:
docker compose logs vynl --tail=200is the single best diagnostic - GitHub Discussions: https://github.com/48Nauts-Operator/vynl-app/discussions
- GitHub Issues: https://github.com/48Nauts-Operator/vynl-app/issues
- Don't email Anthropic about Vynl — Vynl uses the Anthropic API but is unrelated to Anthropic the company
