A Discord music bot written in Kotlin. Plays music in voice channels, manages a queue, and provides AI-powered commentary on tracks.
- Plays music from any source supported by Lavalink
- Queue management (view, skip, stop)
- Sponsorblock integration to automatically skip sponsored segments
- Silly AI-generated commentary on currently playing tracks
| Command | Description |
|---|---|
/play <query> |
Add a track to the queue (YouTube search or URL) |
/skip |
Skip to the next track |
/queue |
View the current queue |
/stop |
Stop playback and clear the queue |
- Java 21+
- A running Lavalink server
- A Discord bot token and application ID
Set the following environment variables before running:
| Variable | Required | Description |
|---|---|---|
BOT_TOKEN |
Yes | Discord bot token |
BOT_CLIENT_ID |
Yes | Discord application/client ID |
LAVALINK_URI |
Yes | URI of the Lavalink server (e.g. ws://localhost:2333) |
LAVALINK_PASSWORD |
Yes | Lavalink server password |
MISTRAL_API_KEY |
No | Mistral AI API key for track commentary |
A sample Lavalink configuration is provided in
lavalink/application.yaml.
./gradlew app:runA pre-built Docker image is published to the GitHub Container Registry on every push to main:
docker pull ghcr.io/outadoc/bruitage:latestUsing docker-compose:
services:
bruitage:
image: ghcr.io/outadoc/bruitage:latest
container_name: bruitage
depends_on:
- lavalink
environment:
- LAVALINK_URI=ws://lavalink:2333
- BOT_CLIENT_ID=${BOT_CLIENT_ID}
- BOT_TOKEN=${BOT_TOKEN}
- LAVALINK_PASSWORD=${LAVALINK_PASSWORD}
- MISTRAL_API_KEY=${MISTRAL_API_KEY}
restart: unless-stopped
networks:
- lavalink
lavalink:
image: ghcr.io/lavalink-devs/lavalink:4-alpine
container_name: lavalink
restart: unless-stopped
environment:
- LAVALINK_SERVER_PASSWORD=${LAVALINK_PASSWORD}
volumes:
- /mnt/user/appdata/lavalink/application.yml:/opt/Lavalink/application.yml
networks:
- lavalink
expose:
- 2333
networks:
lavalink:
name: lavalink# Build only
./gradlew build
# Build a distributable archive
./gradlew app:assembleDist
# Run all checks
./gradlew check
# Clean build outputs
./gradlew cleanA Lavalink server is provided for development purposes in the lavalink directory.
- Kotlin
- Kord as the Discord API client
- LavaKord + Lavalink for Discord audio playback
- LangChain4j for AI commentary
Claude Code was used to generate some of the code of this bot, but it was mostly built from scratch by hand.