Production-ready Discord bot for the Zenith Crest community server.
Built with Node.js, Discord.js v14, and SQLite.
- Welcome System — Welcome/goodbye embeds, auto-role, member count
- Moderation — Warn, kick, ban, mute, purge, lock/unlock, nicknames
- Tickets — Support, mod applications, reports, partnerships with HTML transcripts
- Moderator Applications — Discord modals with accept/reject workflow
- Verification — Button-based role verification
- Leveling — XP from messages, ranks, leaderboard
- Giveaways — Timed giveaways with auto-end and reroll
- Suggestions — Upvote/downvote suggestion system
- Logging — Message edits/deletes, joins/leaves, channel/role changes
- Automod — Anti-spam, invite links, mass mentions, caps, bad words
- Utility — User/server info, avatar, banner, ping, and more
- Staff Tools — Announce, embed builder, say commands
- Node.js 18 or higher
- A Discord bot application (Discord Developer Portal)
Invite the bot with these permissions:
- Manage Channels
- Manage Roles
- Manage Messages
- Kick Members
- Ban Members
- Moderate Members
- Send Messages
- Embed Links
- Attach Files
- Read Message History
- Use Application Commands
Required Intents (enable in Developer Portal):
- Server Members Intent
- Message Content Intent
# Clone or navigate to the project
cd zenith-bot
# Install dependencies
npm install
# Copy environment file
cp .env.example .envTOKEN=your_bot_token
CLIENT_ID=your_bot_client_id
GUILD_ID=your_discord_server_idOptional overrides:
WELCOME_CHANNEL=
LOG_CHANNEL=
TICKET_CATEGORY=
TICKET_LOG_CHANNEL=
APPLICATION_CHANNEL=
VERIFICATION_ROLE=
MEMBER_ROLE=
STAFF_ROLE=
MODERATOR_ROLE=
SUGGESTION_CHANNEL=Fill in IDs for your Zenith Crest server:
{
"guildId": "YOUR_GUILD_ID",
"clientId": "YOUR_CLIENT_ID",
"token": "",
"welcomeChannel": "WELCOME_CHANNEL_ID",
"logChannel": "LOG_CHANNEL_ID",
"ticketCategory": "TICKET_CATEGORY_ID",
"ticketLogChannel": "TICKET_LOG_CHANNEL_ID",
"applicationChannel": "APPLICATION_REVIEW_CHANNEL_ID",
"verificationRole": "VERIFIED_ROLE_ID",
"memberRole": "MEMBER_ROLE_ID",
"staffRole": "STAFF_ROLE_ID",
"moderatorRole": "MODERATOR_ROLE_ID",
"suggestionChannel": "SUGGESTION_CHANNEL_ID"
}Note: Store your bot token in
.envonly — never commit it to version control.
npm run deploynpm startFor development with auto-restart:
npm run dev- Create roles: Member, Verified, Staff, Moderator
- Create channels: welcome, logs, ticket-log, applications, suggestions
- Create a ticket category
- Fill in
config.jsonand.env - Run
npm run deploy - Run
npm start - Use
/verificationpaneland/ticketpanelin your server - Use
/setwelcomechanneland/setautoroleif needed
| Command | Description |
|---|---|
/setwelcomechannel |
Set welcome/goodbye channel |
/setautorole |
Set auto-assigned member role |
/setapplicationchannel |
Set mod application review channel |
/automod enable/disable |
Toggle automod |
/setxprate |
Set XP multiplier |
/verificationpanel |
Post verification button panel |
/ticketpanel |
Post ticket panel |
/announce |
Send an announcement embed |
/embedbuilder |
Build and send a custom embed |
/say |
Make the bot say a message |
| Command | Description |
|---|---|
/warn |
Warn a user |
/warnings |
View user warnings |
/clearwarnings |
Clear user warnings |
/kick |
Kick a user |
/ban |
Ban a user |
/unban |
Unban by user ID |
/mute |
Timeout a user |
/unmute |
Remove timeout |
/purge |
Bulk delete messages |
/lock |
Lock a channel |
/unlock |
Unlock a channel |
/nickname |
Change a nickname |
| Command | Description |
|---|---|
/close |
Close ticket with transcript |
/claim |
Claim a ticket |
/rename |
Rename ticket channel |
/adduser |
Add user to ticket |
/removeuser |
Remove user from ticket |
/transcript |
Generate HTML transcript |
| Command | Description |
|---|---|
/userinfo |
User information |
/serverinfo |
Server information |
/avatar |
View avatar |
/banner |
View banner |
/ping |
Bot latency |
/botinfo |
Bot information |
/roleinfo |
Role information |
/channelinfo |
Channel information |
/rank |
View XP rank |
/leaderboard |
XP leaderboard |
/suggest |
Submit a suggestion |
/giveaway start/end/reroll |
Manage giveaways |
zenith-bot/
├── src/
│ ├── commands/
│ │ ├── administration/
│ │ ├── applications/
│ │ ├── moderation/
│ │ ├── tickets/
│ │ └── utility/
│ ├── events/
│ │ ├── guild/
│ │ ├── interaction/
│ │ └── logging/
│ ├── handlers/
│ ├── database/
│ ├── config/
│ ├── utils/
│ └── index.js
├── data/ # SQLite DB & transcripts (auto-created)
├── .env.example
├── deploy-commands.js
├── package.json
└── README.md
npm install -g pm2
pm2 start src/index.js --name zenith-bot
pm2 save
pm2 startupCreate a Dockerfile:
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
CMD ["node", "src/index.js"]- Set environment variables in the hosting dashboard
- Set start command:
node src/index.js - Ensure the
data/directory persists between restarts
SQLite database is stored at data/zenith.db.
Tables: users, warnings, tickets, applications, levels, giveaways, suggestions, settings, suggestion_votes
- Never share your bot token
- Keep role hierarchy correct (bot role above managed roles)
- Review automod bad word list for your community standards
- Back up
data/zenith.dbregularly
MIT — Zenith Crest Community