A Discord music bot powered by Lavalink. Simple to deploy, easy to use.
Everything you need for music in Discord.
YouTube, SoundCloud, Bandcamp, Twitch, and Vimeo — all supported out of the box.
Search Spotify tracks and playlists, resolved seamlessly via YouTube.
Never let the music stop. Autoplay queues related tracks automatically.
Shuffle, loop, play-next, and full queue control at your fingertips.
Browse search results and pick the exact track you want to play.
Available in English, Spanish, Turkish, and Italian.
Role-based permissions to control who can use the bot.
One command to deploy. Pre-built images, no host dependencies.
No self-hosted server needed. Auto-connects to free public Lavalink nodes.
Simple slash commands. Nothing to memorize.
/play <query>Play a song or add to queue/search <query>Search and select tracks/pausePause or resume playback/skipSkip to next track/backGo to previous track/stopStop and disconnect/queueView the current queue/shuffleShuffle the queue/autoplayToggle autoplay mode/loopToggle loop mode/clearClear the queue/volume <1-100>Set playback volume/lyricsShow lyrics for current song/filterApply audio effects and EQ/nowplayingCurrent track info/inviteGet bot invite link/aboutBot info and statsFrom zero to music in under a minute.
Head to the Discord Developer Portal and create a new application. Enable all Privileged Gateway Intents.
Create your .env and docker-compose.yml, then run docker compose up -d.
Use /play in any voice channel. BeatDock handles the rest.
Need more detail? See the full setup guide below.
Everything you need to get BeatDock running on your server.
Create a new application, then go to the Bot tab and enable all 3 Privileged Gateway Intents:
Copy your bot token from this page — you'll need it for the .env file.
Create a .env file. Only TOKEN is required — everything else is optional.
# Required
TOKEN=your_discord_bot_token
# Spotify (optional)
SPOTIFY_ENABLED=false
SPOTIFY_CLIENT_ID=
SPOTIFY_CLIENT_SECRET=
# Playback
DEFAULT_VOLUME=80
AUTOPLAY_DEFAULT=false
DEFAULT_SEARCH_PLATFORM=ytmsearch
# Language: en, es, tr, it
DEFAULT_LANGUAGE=en
# Access control (optional)
# ALLOWED_ROLES=role_id_1,role_id_2
# Lavalink (leave commented for public server fallback)
# LAVALINK_HOST=lavalink
# LAVALINK_PORT=2333
# LAVALINK_PASSWORD=youshallnotpass
# Timeouts
QUEUE_EMPTY_DESTROY_MS=30000
EMPTY_CHANNEL_DESTROY_MS=60000
| Variable | Default | Description |
|---|---|---|
TOKEN | — | Discord bot token (required) |
SPOTIFY_ENABLED | false | Enable Spotify search support |
SPOTIFY_CLIENT_ID | — | Spotify app client ID |
SPOTIFY_CLIENT_SECRET | — | Spotify app client secret |
DEFAULT_LANGUAGE | en | Bot language (en, es, tr, it) |
DEFAULT_VOLUME | 80 | Default playback volume (0–100) |
AUTOPLAY_DEFAULT | false | Enable autoplay by default |
ALLOWED_ROLES | — | Comma-separated role IDs to restrict access |
DEFAULT_SEARCH_PLATFORM | ytmsearch | Default search platform |
LAVALINK_PASSWORD | youshallnotpass | Lavalink server password |
QUEUE_EMPTY_DESTROY_MS | 30000 | Disconnect after queue empties (ms) |
EMPTY_CHANNEL_DESTROY_MS | 60000 | Disconnect from empty channel (ms) |
mkdir beatdock && cd beatdock
# Add your .env and docker-compose.yml, then:
docker compose up -d
docker compose logs -f # View logs
docker compose restart # Restart
docker compose down # Stop
docker compose pull && \
docker compose up -d # Update to latest
No self-hosted Lavalink? No problem — leave the Lavalink variables commented out and BeatDock will automatically connect to free public servers.