Soundbored is an unlimited, no-cost, self-hosted soundboard for Discord. It allows you to play sounds in a voice channel.
![Screenshot 2025-01-18 at 1 26 07 PM](https://private-user-images.githubusercontent.com/726365/404554145-4a504100-5ef9-47bc-b406-35b67837e116.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg3OTcyMDgsIm5iZiI6MTczODc5NjkwOCwicGF0aCI6Ii83MjYzNjUvNDA0NTU0MTQ1LTRhNTA0MTAwLTVlZjktNDdiYy1iNDA2LTM1YjY3ODM3ZTExNi5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjA1JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIwNVQyMzA4MjhaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0wYWIwMWE5ZTlkM2EzOTYyZjRmZGFhZDVjOTY1M2RmYTRlNzE5NTU5YWEwYTk5ZGQyNGZjMzRjMzEyZGJjYWY2JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.U6rxu5u4OfnvZh-oISqoFIdTP1AWqSDKyhxE_gqrTf4)
- A bot token with the following permissions:
- Send Messages
- Read Message History
- View Channels
- Connect
- Speak
NOTE: Also remember to go under Bot and select PRESENCE INTENT, SERVER MEMBERS INTENT and MESSAGE CONTENT INTENT
You then need to invite the bot to your server by going to Oauth2
, checking bot
and then checking the same permisions as above. You can then take the generated URL at the bottom and invite the bot.
-
If you want to host publicly, a domain name is required so people can access your Soundbored instance.
-
Under
Redirect
inOauth2
put your domain likehttps://your.domain.com/auth/discord/callback
in the Discord Developer Portal. Copy theClient ID
andClient Secret
as you will need them for the environment variables below. -
You will need to host this publicly somewhere for other users to be able to use it. I recommend using Digital Ocean for this as its cheap and you can deploy Docker images directly.
The Docker needs the following environment variables, check .env.example:
DISCORD_TOKEN=your_actual_discord_token
DISCORD_CLIENT_ID=your_actual_client_id
DISCORD_CLIENT_SECRET=your_actual_client_secret
# Change this to your domain or to localhost if you're running locally
PHX_HOST=your.domain.com
# change this to http if running locally
SCHEME=https
# Change these to password protect your soundboard
BASIC_AUTH_USERNAME=admin
BASIC_AUTH_PASSWORD=admin
The application is containerized and published to Docker Hub. You can pull it with docker pull christom/soundbored:latest
. Or run immediately in localhost with: docker run -d -p 4000:4000 --env-file ./.env christom/soundbored
.
# Create .env file from example
cp .env.example .env
# Edit .env with your values, make sure:
PHX_HOST=localhost
SCHEME=http
# With Docker Image, run locally (no Caddy)
docker run -d -p 4000:4000 --env-file ./.env christom/soundbored
# Or with Project cloned, Run locally (no Caddy)
docker compose up
# Create .env file from example
cp .env.example .env
# Edit .env with your values, make sure:
PHX_HOST=your.domain.com
SCHEME=https
# Modiy the Caddyfile
your.domain.com {
reverse_proxy soundbored:4000
}
# Pull the latest image
docker pull christom/soundbored:latest
# Run in production (with Caddy)
docker compose -f docker-compose.prod.yml up -d
The deployment mode is automatically determined by the PHX_HOST value:
- If PHX_HOST=localhost: Runs without Caddy, accessible at http://localhost:4000
- If PHX_HOST=domain.com: Runs with Caddy, handles SSL automatically
Note: Make sure to create a Caddyfile in the same directory as your docker-compose.prod.yml file. The Caddyfile should contain your domain configuration. For example:
your.domain.com {
reverse_proxy soundbored:4000
}
Replace your.domain.com
with your actual domain name. Caddy will automatically handle SSL certificate generation for your domain.
After inviting the bot to your server, join a voice channel and type !join
to have the bot join the voice channel. Type !leave
to have the bot leave. You can upload sounds to Soundbored and trigger them there and they will play in the voice channel.
- Added random sound button.
- Added ability to add and trigger sounds from a URL.
- Allow ability to click tags inside sound Cards for filtering.
- Show what user uploaded a sound in the sound Card.
- Fixed bug where if you uploaded a sound and edited its name before uploading a file it would crash.
- Fixed bug where changing an uploaded sound name created a new sound in entry and didn't update the old.
- Implemented join/leave sound notifications
- Added Discord avatar support for member profiles
- Added week selector functionality to statistics page
- Fixed mobile menu navigation issues on statistics page
- Fixed statistics page not updating in realtime
- Fixed styling issues on stats page