A powerful Discord bot for on-demand voice channel creation, built with the Rhidium framework. This bot allows users to create temporary voice channels automatically by joining a configured trigger channel, with full permission controls and customization options.
Because pay-walling basic voice-channel creation behind subscriptions is exploitative and unnecessary. This bot keeps that core feature free and in your control.
- GreedMaster (originally VoiceMaster) (Β£39.99-Β£199.99 !!!! per year)
- TempVoice (4-6 EUR/month, recommended if you cannot host yourself)
- Tempy (2,99$/month PER USER)
- EmptyManager (3.50-10 EUR/month)
- Auto Voice Channels (3-13.50 EUR/month)
Why pay for a service when you can just host it yourself? If you feel like something is missing from this free, open-source, alternative - create a feature request.
Hosting voice-channel bots is expensive β but only if the bot itself is in the channel consuming bandwidth. Since this bot purely manages permissions and channel creation, hosting costs are negligible. There's no reasonable justification for charging up to Β£200+ per year for that functionality.
- π€ Click-to-Create Voice Channels - Users join a trigger channel and automatically get their own private voice channel
- π§ Highly Configurable - Fine-grained control over channel names, permissions, user limits, position, etc.
- π― YAML-Based Configuration - Easy-to-read configuration with reusable permission templates
- ποΈ PostgreSQL Database - Persistent tracking of dynamic channels via Prisma ORM
- π³ Docker Ready - Production-ready Docker Compose setup with health checks
- π Multi-Language Support - Built-in localization system (English & Dutch included)
- π Role-Based Permissions - Granular control over who can use which features
- π§Ή Auto-Cleanup - Dynamic channels are automatically deleted when empty + reconciliation on boot/restart
- Node.js 20+ (or Docker)
- PostgreSQL 15+ (or use Docker Compose)
- pnpm 10.4.1+
- A Discord bot token (Discord Developer Portal)
- Clone the repository with submodules:
git clone --recurse-submodules https://github.com/rhidium/dynamic-voice-channels.git
cd dynamic-voice-channels- Install dependencies:
pnpm install- Set up environment variables:
cp .env.example .env
# Edit .env with your configuration- Configure the bot:
# Copy and edit the config files
cp config/config.example.json config/config.json
nano config/config.json
nano click-to-create.yaml- Set up the database:
# Generate Prisma client
pnpm db:generate
# Run migrations
pnpm db:migrate- Build and start:
# Development mode (with watch)
pnpm dev
# Production build
pnpm build
pnpm startFor production deployment with Docker:
# Build and start all services
docker compose up -d
# View logs
docker compose logs -f client
# Stop services
docker compose downKey environment variables in .env:
NODE_ENV=production # Environment: production or development
RHIDIUM_CONFIG_DIR=./config # Config directory location
RHIDIUM_LOCALES_DIR=./locales # Locales directory location
# Database Configuration
POSTGRES_HOST=localhost # Change to "database" for Docker
POSTGRES_PORT=5432
POSTGRES_USER=postgres
POSTGRES_PASSWORD=your_password_here
POSTGRES_DB=dynamic-voice-channels
DATABASE_URL="postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}?schema=public"
DIRECT_DATABASE_URL="postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}?schema=public"Edit config/config.json:
{
"client": {
"id": "YOUR_BOT_CLIENT_ID",
"token": "YOUR_BOT_TOKEN",
"development_server_id": "YOUR_DEV_SERVER_ID"
},
"permissions": {
"owner_id": "YOUR_DISCORD_USER_ID",
"system_administrator_ids": [],
"developer_ids": []
}
}Configure trigger channels in config/click-to-create.yaml:
- channelId: "1234567890123456789" # Voice channel to join
categoryId: "9876543210987654321" # Category where channels are created
maxChannels: 10 # Max concurrent channels from this trigger
channelName: "{creator}'s Channel" # {creator} is replaced with username
channelUserLimit: 0 # 0 = unlimited
channelBitrate: 64000 # Bitrate in bps
channelPermissions:
- roleId: "@everyone"
allow:
- ViewChannel
- Speak
- Stream
deny:
- Connect
- roleId: "{{creatorId}}" # Special template for creator
allow:
- Connect
- ManageChannels
- MoveMembers
deny: []The config supports YAML anchors for reusable permission templates:
# Define reusable permission sets
- channelId: "123"
channelPermissions:
- &creator-perms
roleId: "{{creatorId}}"
allow: [Connect, ManageChannels]
deny: []
# Reuse in another config
- channelId: "456"
channelPermissions:
- *creator-perms # Reuses the same permissionsView logs in real-time:
# View all logs
docker compose logs -f
# View only client logs
docker compose logs -f client
# View only database logs
docker compose logs -f database- Verify
DATABASE_URLis correctly formatted - Make sure
DIRECT_DATABASE_URLpoints to your database server directly, no intermediaries. - For Docker: use
POSTGRES_HOST=database(service name) - For local: use
POSTGRES_HOST=localhost - Check PostgreSQL is running:
docker compose psorsystemctl status postgresql
Run pnpm db:generate after any schema changes and before starting the bot.
If migrations are out of sync:
# Check status
pnpm db:status
# For development (β οΈ destroys data):
pnpm db:reset
# For production, resolve manually:
npx prisma migrate resolve --applied <migration-name>Contributions are welcome! Please:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
For more information on development & contributing, please see the contribution guidelines.
This project is licensed under the ISC License - see the LICENSE file for details.
Richard Hillebrand (Mirasaki)
- Website: mirasaki.dev
- Email: me@mirasaki.dev
- π Rhidium Documentation
- π Issue Tracker
- π¬ Discord Server (if available)
Built with the Rhidium framework - A powerful, modular Discord bot framework.