TitanBot is a powerful, feature-rich Discord bot designed to enhance your server experience with comprehensive moderation tools, engaging economy systems, utility features, and much more. Built with modern Discord.js v14 and PostgreSQL for optimal performance and data persistence.
TitanBot offers a complete suite of tools for Discord server management and community engagement:
| ### Moderation & Administration - **Mass Actions** - Bulk ban/kick capabilities - **User Notes** - Keep detailed moderation records - **Case Management** - View and track all mod actions ### Chaos Credits (CC) & Games - **Clover wins** - Wins in the Clover games bot pay CC - **Group Games** - Roulette, musical chairs, mafia, trivia and more; the top 3 win CC - **Top CC** - Server leaderboard (see [docs/cc-and-games.md](/DISbot/docs/cc-and-games.html)) - **Invite Rewards** - 1000 CC for every invited member who reaches level 5, `top invites`, `انفايت @member` and invite roles - **Give** - Send CC to a member, with a tax that grows for frequent senders ### Fun & Entertainment - **Random Facts** - Learn something new - **Wanted Poster** - Create fun wanted images - **Text Reversal** - Reverse any text ### Advanced Ticket System - **Claim & Priority** - Staff ticket management - **Ticket Limits** - Prevent spam - **Transcript System** - Save ticket history ### Server Stats - **Member Counter** - Live member count channels - **Voice Counters** - Track voice stats - **Dynamic Updates** - Real-time channel updates ### Reaction Roles - **Role Assignment** - Self-assignable roles - **Emoji Selection** - Reaction-based system - **Multi-role Support** - Multiple role options | ### Leveling & XP System - **XP Tracking** - Automatic message-based XP - **Voice XP** - XP for every minute talking in voice with someone else, and `top voice` - **Level Roles** - Auto-assign roles by level - **Custom Configuration** - Personalize leveling ### Giveaways & Events - **Multiple Winners** - Support multi-winner giveaways - **Auto Picking** - Automatic winner selection - **Reroll System** - Pick new winners if needed ### Birthday System - **Birthday Tracking** - Never miss a birthday - **Auto Announcements** - Celebrate automatically - **Timezone Support** - Accurate worldwide tracking ### Utility Tools - **Report System** - Report issues to staff - **Todo Lists** - Personal task management - **First Message** - Jump to channel's first message ### Welcome System - **Welcome Messages** - Greet new members - **Auto Roles** - Assign roles on join - **Custom Embeds** - Personalized messages ### Music - **24/7 Mode** - Play music 24/7 - **Interative Button System** - Manage music through buttons - **Supports EVERY platform** - Supports spotify, deezer, youtube, apple music |
For a detailed step-by-step setup guide, watch our comprehensive video tutorial: TitanBot Setup Tutorial
TitanBot is fully containerized for easy deployment.
git clone https://github.com/codebymitch/TitanBot.git
cd TitanBot
cp .env.example .env
Set at minimum DISCORD_TOKEN, CLIENT_ID, and GUILD_ID. Docker Compose also reads POSTGRES_USER, POSTGRES_PASSWORD, and POSTGRES_DB from .env. POSTGRES_PASSWORD is required (Compose refuses to start without it); the user and database default to titanbot. If your database volume was created with the old default password password, keep that value or change the password inside Postgres first.
docker compose up -d --build
docker compose ps
curl http://localhost:3000/health
This starts the bot and PostgreSQL. The compose file sets POSTGRES_SSL=false and AUTO_MIGRATE=true for the bundled database. Music uses public Lavalink v4 nodes from lavalink/nodes.json by default.
Music uses Lavalink v4 via Riffy, similar to Musicify.
lavalink/nodes.json (sourced from lavalink.darrennathanael.com). Edit that file to add or remove nodes.docker compose --profile local-lavalink up -d and set single-node env vars in .env:
LAVALINK_HOST=lavalink
LAVALINK_PORT=2333
LAVALINK_PASSWORD=youshallnotpass
LAVALINK_SECURE=false
Remove or rename lavalink/nodes.json so the bot falls back to those env vars.
LAVALINK_NODES (JSON array) or point at another file with LAVALINK_NODES_FILE./play <song> from a voice channel, or /join to connect without playing. Prefix shortcuts: join, np, leave, pause, resume, skip, stop, volume <0-100>, or music <subcommand>. Use /nowplaying and /queue for status; /music for loop, shuffle, seek, and other controls.The bot is automatically published to GitHub Container Registry on every push to main.
docker pull ghcr.io/codebymitch/titanbot:main
git clone https://github.com/codebymitch/TitanBot.git
cd TitanBot
npm install
cp .env.example .env
Edit .env with your configuration (only the following variables require configuration, leave remaining variables as default):
# Discord Bot Configuration
DISCORD_TOKEN=your_discord_bot_token_here
CLIENT_ID=your_discord_client_id_here
GUILD_ID=your_discord_guild_id_here
# PostgreSQL Configuration (Primary Database)
POSTGRES_URL=postgresql://postgres:yourpassword@localhost:5432/titanbot
POSTGRES_HOST=localhost
POSTGRES_PORT=5432
POSTGRES_DB=titanbot
POSTGRES_USER=postgres
POSTGRES_PASSWORD=yourpassword
Production note:
NODE_ENV=productionLOG_LEVEL=warn for a clean production console (critical issues + startup status)LOG_LEVEL=info if you want more detailed operational logsPORT is already used, TitanBot automatically tries the next port(s)Environment options reference:
NODE_ENV: development, production, test (any non-production value is treated as non-production)LOG_LEVEL: error, warn, info, http, verbose, debug, sillyLOG_LEVEL in this bot: warns, warning, warnings → warnRecommended production .env (easy mode + default mode):
NODE_ENV=production
LOG_LEVEL=warn
WEB_HOST=0.0.0.0
PORT=3000
PORT_RETRY_ATTEMPTS=5
This gives clear startup/online status messages while keeping logs simple for non-technical operators.
If port 3000 is busy, the bot tries the next available ports automatically (up to PORT_RETRY_ATTEMPTS).
Slash commands are registered globally on startup (via CLIENT_ID), so the bot works in every server it is invited to. GUILD_ID stays in the tutorial .env for setup steps but is not used for command registration.
Notes:
guild:{guildId}:...)bot and applications.commands)# Create database and user
createdb titanbot
createuser titanbot
psql -c "ALTER USER titanbot PASSWORD 'yourpassword';"
psql -c "GRANT ALL PRIVILEGES ON DATABASE titanbot TO titanbot;"
npm run migrate:check
npm start
Note on database migrations: Schema tables and legacy key migrations run automatically on startup, so
managed hosts like **Railway** need no manual migration step — just deploy/restart. To disable auto-migration setAUTO_MIGRATE=false. You can still run a manual key migration locally withnode scripts/migrate-keys.js –dry-run(preview) ornode scripts/migrate-keys.js`.
TitanBot requires the following Discord intents:
TitanBot is released under the MIT License. See LICENSE for details.
Thank you for choosing TitanBot for your Discord server! We’re constantly working to improve and add new features based on community feedback.
Last updated: May 2026