A modern, beautiful web interface for controlling Navidrome's Jukebox mode. Control music playback on your server from any device with a sleek, responsive UI.
- ποΈ Full Jukebox Control - Play, pause, skip, shuffle, and manage your music queue
- π Real-time Search - Search your entire music library and add songs instantly
π¨ Modern UI - Beautiful glassmorphic design with smooth animationsOld classic Winamp style π- π± Responsive - Works seamlessly on desktop, tablet, and mobile devices
- ποΈ Volume Control - Adjust playback volume remotely
- π Repeat Modes - Repeat off, repeat all, or repeat one track
- π² Random Song - Add random songs to your queue with one click
- β±οΈ Live Progress - Real-time playback position and duration tracking
- πΌοΈ Album Art - High-quality cover art display
- π HTTPS Support - Secure connection with Let's Encrypt certificates
- π³ Docker Ready - Easy deployment with Docker Compose
- Navidrome server with Jukebox mode enabled
- Docker and Docker Compose (for deployment)
- Node.js 18+ (for development)
- MPV player installed on the server (for audio playback)
- ALSA audio system configured
- Let's Encrypt SSL certificates (optional, for HTTPS)
git clone https://github.com/bgpntx/kneep.git
cd kneepEdit docker-compose.yml to match your setup:
volumes:
- /big/Muz:/music:ro # Your music library (read-only)
- /nvme1/navidrome:/data # Navidrome data directory
- ./navidrome.toml:/data/navidrome.toml:roUpdate paths in docker-compose.yml:
volumes:
- /etc/letsencrypt/archive/nest.vps.pw/fullchain3.pem:/etc/nginx/ssl/fullchain.pem:ro
- /etc/letsencrypt/archive/nest.vps.pw/privkey3.pem:/etc/nginx/ssl/privkey.pem:roVerify your audio device name:
aplay -LUpdate docker-compose.yml if needed:
environment:
ND_MPV_CMD_TEMPLATE: "mpv --no-video --audio-device='alsa/sysdefault:CARD=U24XL' ${INPUT}"And in navidrome.toml:
Jukebox.Devices = [
["U24XL", "alsa/sysdefault:CARD=U24XL"]
]
Jukebox.Default = "U24XL"Review and adjust navidrome.toml settings:
# Base Configuration
MusicFolder = "/music"
DataFolder = "/data"
LogLevel = "DEBUG"
SessionTimeout = "48h"
# Jukebox Configuration
Jukebox.Enabled = true
Jukebox.AdminOnly = false
Jukebox.Devices = [
["U24XL", "alsa/sysdefault:CARD=U24XL"]
]
Jukebox.Default = "U24XL"
# MPV Configuration
MPVPath = "/usr/bin/mpv"
MPVCmdTemplate = "mpv --no-video --audio-device=%d --input-ipc-server=%s %f"
# Library Scanner
Scanner.Schedule = "@every 24h"
# Cache Settings
ImageCacheSize = "100MiB"
TranscodingCacheSize = "100MiB"
# Last.fm Integration (optional)
[LastFM]
Enabled = true
ApiKey = "your-api-key"
Secret = "your-secret"
Language = "en"# Build the frontend
npm install
npm run build
# Start services
docker-compose up -d
# Check logs
docker-compose logs -fThe application is accessible on multiple ports:
- HTTP:
http://your-server:8080 - HTTPS:
https://your-server:8443 - Navidrome HTTPS:
https://your-server:4533
For this setup with domain nest.vps.pw:
https://nest.vps.pw:8443- Web interfacehttps://nest.vps.pw:4533- Navidrome API
- User/Group: Container runs as UID 1000, GID 1000
- Audio Group: GID 29 for ALSA device access
- Timezone: Europe/Kyiv (configurable in docker-compose.yml)
- Device Access:
/dev/sndmust be accessible
- Open the web player at
http://your-server:8080 - Scroll to the configuration section at the bottom
- Enter your credentials:
- Server URL:
http://your-server:4533(orhttps://nest.vps.pw:4533) - Username: Your Navidrome username
- Token & Salt: Get these from Navidrome's web interface
- Server URL:
- Click Save & Connect
- Log into Navidrome's web interface
- Open browser DevTools (F12) β Network tab
- Play any song or make any API request
- Look at the request URL and copy the
t=ands=values - Paste these into the Token and Salt fields
Note: Token/salt credentials are valid for 48 hours (configurable via SessionTimeout).
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Docker Compose Stack β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β Nginx Web Server β
β β - Port 8080 (HTTP) β
β β - Port 8443 (HTTPS) β
β β - Port 4533 (Navidrome HTTPS Proxy) β
β β - Serves React Frontend from ./dist β
β β - SSL: Let's Encrypt (nest.vps.pw) β
β ββββββββββββββββ¬βββββββββββββββββββββββββββββββββββ€
β β β
β ββββββββββββββββΌβββββββββββββββββββββββββββββββββββ€
β β Navidrome Service β
β β - Container: navidrome β
β β - Image: navidrome-mpv (custom build) β
β β - User: 1000:1000 β
β β - Audio Group: 29 β
β β - Internal Port: 4533 β
β β - Jukebox API Enabled β
β β - Music: /big/Muz (read-only) β
β β - Data: /nvme1/navidrome β
β ββββββββββββββββ¬βββββββββββββββββββββββββββββββββββ€
β β β
β ββββββββββββββββΌβββββββββββββββββββββββββββββββββββ€
β β MPV Player β
β β - Audio Output: ALSA β
β β - Device: U24XL β
β β - Hardware: /dev/snd β
β β - No Video Output β
β βββββββββββββββββββββββββββββββββββββββββββββββββββ€
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
services:
navidrome:
build:
context: .
dockerfile: Dockerfile
image: navidrome-mpv
container_name: navidrome
user: "1000:1000"
environment:
TZ: Europe/Kyiv
ND_MUSICFOLDER: /music
ND_DATAFOLDER: /data
ND_LOGLEVEL: debug
ND_JUKEBOX_ENABLED: "true"
ND_JUKEBOX_ADMINONLY: "false"
ND_MPV_CMD_TEMPLATE: "mpv --no-video --audio-device='alsa/sysdefault:CARD=U24XL' ${INPUT}"
expose:
- "4533"
volumes:
- /big/Muz:/music:ro
- /nvme1/navidrome:/data
- ./navidrome.toml:/data/navidrome.toml:ro
devices:
- /dev/snd:/dev/snd
group_add:
- "29" # Audio group
restart: unless-stopped web:
image: nginx:alpine
container_name: jukebox-web
depends_on:
- navidrome
ports:
- "8080:80" # HTTP
- "8443:8443" # HTTPS
- "4533:4533" # Navidrome HTTPS proxy
volumes:
- ./dist:/usr/share/nginx/html:ro
- ./nginx.default.conf:/etc/nginx/conf.d/default.conf:ro
- /etc/letsencrypt/archive/nest.vps.pw/fullchain3.pem:/etc/nginx/ssl/fullchain.pem:ro
- /etc/letsencrypt/archive/nest.vps.pw/privkey3.pem:/etc/nginx/ssl/privkey.pem:ro
restart: unless-stopped# Install dependencies
npm install
# Start dev server
npm run dev
# Access at http://localhost:5173# Production build
npm run build
# Preview production build
npm run previewnavidrome-jukebox-web/
βββ src/
β βββ App.jsx # Main application component
β βββ App.css # Styles
β βββ jukeboxApi.js # Navidrome API client
β βββ main.jsx # Entry point
βββ dist/ # Production build output
βββ docker-compose.yml # Docker services configuration
βββ Dockerfile # Custom Navidrome image with MPV
βββ nginx.default.conf # Nginx proxy configuration
βββ navidrome.toml # Navidrome server configuration
βββ package.json # Dependencies and scripts
- Verify your token and salt are correct
- Check if the token has expired (regenerate from Navidrome)
- Ensure the server URL is correct and accessible
- Verify SessionTimeout in navidrome.toml (default: 48h)
-
Check MPV installation:
docker exec navidrome which mpv -
Verify audio device:
docker exec navidrome aplay -L -
Check audio group permissions:
ls -l /dev/snd/ getent group 29 # Should show audio group -
View Navidrome logs:
docker-compose logs -f navidrome
-
Test MPV directly:
docker exec navidrome mpv --audio-device=alsa/sysdefault:CARD=U24XL /music/test.mp3
# Check container status
docker-compose ps
# Restart services
docker-compose restart
# Rebuild with no cache
docker-compose build --no-cache
docker-compose up -d
# View all logs
docker-compose logs- Verify certificate paths exist:
ls -l /etc/letsencrypt/archive/nest.vps.pw/
- Check Nginx configuration:
docker exec jukebox-web nginx -t - Review Nginx logs:
docker-compose logs web
If using Firefox with local HTTP:
- Click the π lock icon in the address bar
- Select "Turn off HTTPS-Only Mode"
- Reload the page
# Add user to audio group on host
sudo usermod -aG audio $(whoami)
# Or adjust group_add in docker-compose.yml to match your system
getent group audio # Check audio GID-
Check volume mount permissions:
docker exec navidrome ls -la /music -
Trigger manual scan:
- Log into Navidrome web UI
- Go to Settings β Library
- Click "Full Rescan"
-
Check scanner schedule in navidrome.toml:
Scanner.Schedule = "@every 24h"
- Click track number to jump to that song
- Remove individual tracks with β button
- Clear entire queue with Clear button
- View current playing track highlighted
- Shuffle queue order
- Real-time search as you type
- Search across title, artist, and album
- Click any result to add to queue
- Automatically starts playback if queue is empty
- Play/Pause: Toggle playback
- Previous: Go to previous track (or restart if >3s into song)
- Next: Skip to next track
- Shuffle: Randomize queue order
- Repeat: Off β All β One
- Stop: Stop playback and reset
- Clear: Remove all tracks from queue
- Random: Add a random song from your library
- Smooth volume slider (0-100%)
- Real-time volume adjustment
- Persists between sessions via localStorage
- Credentials stored in browser's
localStorage - Token/salt authentication follows Subsonic API standard
- No password storage - only pre-generated tokens
- HTTPS supported via Let's Encrypt certificates
- Nginx reverse proxy for secure API access
- Read-only music volume mount
Configure via Docker Compose:
environment:
TZ: Europe/Kyiv # Timezone
ND_MUSICFOLDER: /music # Music library path
ND_DATAFOLDER: /data # Data directory
ND_LOGLEVEL: debug # Log level (info, debug, trace)
ND_JUKEBOX_ENABLED: "true" # Enable jukebox mode
ND_JUKEBOX_ADMINONLY: "false" # Allow non-admin jukebox access
ND_MPV_CMD_TEMPLATE: "..." # MPV command template# Follow all logs
docker-compose logs -f
# Navidrome only
docker-compose logs -f navidrome
# Nginx only
docker-compose logs -f web
# Last 100 lines
docker-compose logs --tail=100
# Check resource usage
docker stats navidrome jukebox-webdocker-compose pull
docker-compose up -dnpm install
npm run build
docker-compose restart web# Backup data directory
tar -czf navidrome-backup-$(date +%Y%m%d).tar.gz /nvme1/navidrome
# Backup configuration
cp navidrome.toml navidrome.toml.backup
cp docker-compose.yml docker-compose.yml.backupContributions are welcome! Please feel free to submit a Pull Request.
This project is licensed under the MIT License.
- Navidrome - The excellent music server
- React - UI framework
- Vite - Build tool
- MPV - Media player
- Nginx - Web server and reverse proxy
For issues and questions:
- Check the Troubleshooting section
- Review Navidrome documentation
- Check MPV documentation
- Open an issue on GitHub
Made with β€οΈ for music lovers who want a better jukebox experience
Configured for nest.vps.pw with U24XL audio device