Spotify playlist roulette — one shared queue, no repeats.
604
A self-hosted PWA that picks a random song from a Spotify playlist with a decelerating roulette wheel of album covers and a synced tick sound. Built for a small party of players who take turns spinning — the app guarantees no player hears the same song twice.
/data/roulette.db) via Node's built-in node:sqlite. No database server./admin panel (set ADMIN_PASSWORD) for player management, resets, and per-player spin history.Source: github.com/PauloJf/song-randomizer.
docker compose (recommended)services:
app:
image: <your-dockerhub-user>/song-randomizer:latest
restart: unless-stopped
ports:
- "3000:3000"
environment:
SPOTIFY_CLIENT_ID: ${SPOTIFY_CLIENT_ID}
PLAYLIST_ID: ${PLAYLIST_ID}
PLAYERS: Alice,Bob,Carol,Dave
BASE_URL: https://your-domain.example
PORT: 3000
COOKIE_SECRET: ${COOKIE_SECRET}
volumes:
- roulette-state:/data
volumes:
roulette-state:
docker rundocker run -d --name spotify-roulette \
-p 3000:3000 \
-v roulette-state:/data \
-e SPOTIFY_CLIENT_ID=your_client_id \
-e PLAYLIST_ID=your_playlist_id \
-e PLAYERS=Alice,Bob,Carol,Dave \
-e BASE_URL=https://your-domain.example \
-e COOKIE_SECRET=$(openssl rand -hex 32) \
<your-dockerhub-user>/song-randomizer:latest
| Variable | Required | Purpose |
|---|---|---|
SPOTIFY_CLIENT_ID | yes | Spotify app client id (PKCE, no secret) |
PLAYLIST_ID | yes | Spotify playlist to roulette from |
PLAYERS | yes | Comma-separated player names |
BASE_URL | yes | Public origin, e.g. https://roulette.example.com |
PORT | no | Defaults to 3000 |
COOKIE_SECRET | yes | Random 32+ char string, signs the PKCE cookie |
ADMIN_PASSWORD | no | Enables the /admin panel (player management, resets, spin logs). Empty = admin disabled, resets open |
APP_PASSWORD | no | Password-protects the wheel itself (30-day session cookie). Empty = open |
${BASE_URL}/api/auth/callback. In dev mode, allowlist the host account under User Management.playlist-read-private, user-read-playback-state, user-modify-playback-state. The host account must be Premium for playback control.${BASE_URL} in a browser, tap Connect Spotify, and complete the OAuth flow once. Tokens land in /data/state.json and refresh automatically.Full deployment notes (Apache reverse-proxy vhost, HTTPS): see DEPLOY.md.
latest — the newest published tagX.Y.Z — pinned versionX.Y — floats within a minorState lives in an SQLite database at /data/roulette.db inside the container (a legacy state.json from older versions is imported automatically on first boot). Mount a named Docker volume so it survives image upgrades:
-v roulette-state:/data
docker compose down -v will remove that volume, so avoid it unless you want a hard reset.
Content type
Image
Digest
sha256:fb97d5d39…
Size
62.4 MB
Last updated
3 months ago
docker pull gatoserio/song-randomizer