Self-hosted Pawa Discord voice recording bot — configured for the razzorstack media server stack.
Pawa records Discord voice channels and saves them as MP3 files. Recordings are browseable via a password-protected web file browser.
Upstream project: gitlab.com/pawabot/pawa — see the Pawa README and Changelog for full documentation.
Once the bot is in your server, these slash commands are available:
| Command | Description |
|---|---|
/record |
Join your voice channel and start recording |
/save |
Finalize and upload the recording as an MP3 to the text channel |
/stop |
Stop recording and leave the voice channel |
/recover |
Recover a failed recording using a Session ID |
/autorecord |
Automatically start recording when someone joins a voice channel |
/autostop |
Automatically stop when the voice channel empties |
/autosave |
Automatically save recordings (on by default for self-hosted) |
/info |
Display recording info and guild settings |
/volume |
Adjust recording volume |
/lang |
Change the bot's language |
/ignore |
Exclude specific users or bots from the recording |
/alias |
Set command aliases |
Prefix commands (!record, !save, !stop, etc.) are also enabled.
Join a voice channel and use one of these workflows:
Hands-free (recommended) — autosave is on by default, so recordings save automatically:
- Join a voice channel
- Type
/recordin any text channel — bot joins and starts recording - When done, type
/stop— bot saves the MP3, posts it to the text channel, and leaves
Split a long session — save checkpoints without stopping:
/recordto start- Mid-meeting,
/saveto save what's been recorded so far (bot keeps recording) /saveagain later for another segment/stopwhen finished
Fully automatic — record every call with no commands:
/autorecordin a text channel — bot will automatically join and record whenever someone enters the voice channel/autostop— bot leaves when the channel empties- Autosave handles the rest — MP3 posted to the text channel automatically
Retrieve recordings later:
- Recordings are posted as MP3 attachments in the text channel
- Also browseable at
https://pawa.razzormail.com(password-protected)
These are the defaults configured in docker-compose.pawa.yml:
| Setting | Value | Description |
|---|---|---|
BOT_FILE_FORMAT |
mp3 |
Output format for recordings (Pawa always encodes MP3) |
BOT_RECORDER_TYPE |
LEGACY |
CombinedAudioRecorder — required for proper MP3 output with WAV format setting |
BOT_MP3_VBR |
0 |
Constant bitrate (CBR) for consistent quality |
BOT_STANDALONE |
true |
Self-hosted mode (no cloud features) |
BOT_PREFIX_COMMANDS |
true |
Enable !record / !save / !stop prefix commands |
BOT_LEAVE_GUILD_AFTER |
0 |
Never auto-leave inactive guilds |
BOT_ACTIVITY |
Voice Recording |
Bot status shown in Discord |
BOT_MAINTENANCE |
false |
Not in maintenance mode |
BOT_WEBSITE |
https://pawa.razzormail.com |
Recording file browser URL |
| File | Purpose |
|---|---|
docker-compose.pawa.yml |
Docker service definition (included by parent compose) |
.env.example |
All Pawa-specific environment variables |
postgres-initdb/create-pawa-db.sh |
Auto-creates pawa database on first Postgres init |
scripts/pawa_retention_cleanup.py |
Delete oldest recordings when exceeding a disk cap |
caddy/pawa.caddyfile |
Caddy config for the recording file browser with basic auth |
docs/SETUP.md |
Full setup guide and troubleshooting |
In discord.com/developers/applications → your Pawa app → Bot:
| Setting | Value | Why |
|---|---|---|
| Public Bot | ❌ Unchecked | Private — only you can invite it |
| Message Content Intent | ✅ Enabled | Required for !record / !save prefix commands |
| Server Members Intent | ❌ Not needed | |
| Presence Intent | ❌ Not needed |
Go to Installation (left sidebar):
| Setting | Value |
|---|---|
| Authorization Method | None |
Setting this to "None" is required when Public Bot is unchecked. Use the custom invite URL below instead.
The bot needs these Discord permissions to function:
| Permission | Integer | Required For |
|---|---|---|
| View Channel | 1024 |
See text and voice channels |
| Send Messages | 2048 |
Post recording notifications and MP3 files |
| Embed Links | 16384 |
Recording info embeds (/info, recording details) |
| Attach Files | 32768 |
Upload MP3 recordings to the text channel |
| Connect | 1048576 |
Join voice channels to record |
| Speak | 2097152 |
Required by Discord for voice channel interaction |
| Use Voice Activity | 33554432 |
Receive audio from voice channel participants |
| Change Nickname | 67108864 |
Set [REC] prefix while actively recording |
Total permission integer: 2251344896
Since Public Bot is unchecked, use this URL to add the bot to your server:
https://discord.com/oauth2/authorize?client_id=1483327849124335646&permissions=2251344896&scope=bot+applications.commands
After inviting, ensure the bot role has these permissions in any channel it will use:
- ✅ View Channel
- ✅ Send Messages
- ✅ Attach Files
- ✅ Embed Links
- ✅ Change Nickname
- ✅ Connect (voice channels)
- ✅ Speak (voice channels)
- ✅ Use Voice Activity (voice channels)
If the bot shows "CANNOT WRITE" as its nickname, it's missing Send Messages or Change Nickname in that channel.
This repo is consumed as a git submodule by razzorstack:
cd /path/to/razzorstack
git submodule update --init docker/pawaThe parent docker-compose.yml includes this via:
include:
- path: pawa/docker-compose.pawa.ymlCopy the variables from .env.example into the parent docker/.env:
# Required
PAWA_BOT_TOKEN=your_discord_bot_token # https://discord.com/developers/applications
PAWA_VERSION=2.17.0-be7c1c2b
# Recording file browser (pawa.razzormail.com)
PAWA_BASIC_AUTH_USER=your_username
PAWA_BASIC_AUTH_HASH=your_bcrypt_hash # Generate: docker exec caddy caddy hash-password --plaintext 'PASSWORD'
# Storage
PAWA_RECORDINGS_PATH=/path/to/recordings # Host path for recording filesSee docs/SETUP.md for the full setup guide, troubleshooting, and Discord permissions.
registry.gitlab.com/pawabot/pawa:2.17.0-be7c1c2b — Kotlin/JVM, Java 25, distroless container.
This deployment configuration is licensed under the Apache License 2.0, consistent with the upstream Pawa project.
All credentials (bot tokens, database passwords, basic auth hashes) are stored in docker/.env which is not tracked by git. The .env.example contains only placeholder values. Never commit real secrets.