Documentation
Guides for the commands that do the real work: custom embeds, automated messages, role systems and server security.
Getting started
Invite Kelly with the Administrator permission so every module can manage itself, or use a custom invite and grant permissions per module. Commands work with either prefix , or slash, and you can run them in any channel the bot can see. Most settings can also be managed from the dashboard.
Some modules are off until you configure them. If a command says the module is disabled, run its setup subcommand first, like ,welcome set or ,log channel.
Welcomer embeds
A plain welcome message is fine, but an embed is better. Embeds let you control the title, color, thumbnail, fields and footer, and they stay aligned with Discord's UI.
Step 1: pick a channel
Point the welcomer at a channel. If the channel doesn't exist yet, create it first:
,welcome set #welcomeStep 2: choose embed mode
The setup will ask what to send. Choose embed to use the JSON builder. You can switch back to plain text anytime:
,welcome set #welcome embedStep 3: write the embed
Send the embed as JSON in **one message**, then confirm. This example covers most of what you need:
{
"title": "Welcome to {server}!",
"description": "Hey {user.mention}, you're member #{member.count}.\nCheck out <#123456789012345678> to see the rules.",
"color": "#e879f9",
"thumbnail": {
"url": "{user.avatar}"
},
"footer": {
"text": "Joined {time}"
},
"fields": [
{
"name": "Useful links",
"value": "[Rules]({server.rules}) • [Support](https://discord.gg/kelly)"
}
]
}Use {placeholder} tokens to fill in info about the member and server automatically:
| Placeholder | Replaced with |
|---|---|
| {user.mention} | Mentions the new member |
| {user.name} | Member's username |
| {user.tag} | Username and discriminator (like kelly#0001) |
| {user.avatar} | Member's avatar URL |
| {server.name} | Your server's name |
| {server.icon} | Your server's icon URL |
| {member.count} | Current member count |
| {time} | The join time, auto-formatted |
Step 4: preview before saving
Always preview. It sends a test message to the channel so you can see it exactly as members will:
,welcome preview,welcome reset,welcome reset turns the welcomer off. The embed stays saved, so you can turn it back on without rewriting it.
One missing comma or quote will reject the whole embed. If you get an error, paste your JSON into a validator and check the embed-json section below.
Goodbye & boost messages
The same builder powers the other automatic messages:
| Command | Sends when |
|---|---|
,goodbye set #channel embed | A member leaves |
,boost set #channel embed | A member boosts the server |
,goodbye preview | Test the goodbye message |
,boost preview | Test the boost message |
For goodbye, {member.count} reflects the member count after the leave, and {time} is the leave time.
Embed JSON reference
Every field below works in the welcome, goodbye, boost, sticky and timer messages. Anything you leave out is simply omitted.
| Field | What it does |
|---|---|
| title | String, max 256 characters. Shown at the top of the embed. |
| description | String, max 4096 characters. Markdown is supported. |
| url | Makes the title a link to this address. |
| color | Accent color: hex (#e879f9) or an integer. |
| timestamp | ISO 8601 date; rendered as a small time in the footer. |
| image.url | Large image shown at the bottom of the embed. |
| thumbnail.url | Small image shown in the top-right corner. |
| author | Object: { name, url, icon_url }. Small line above the title. |
| footer | Object: { text, icon_url }. Small line at the bottom. |
| fields | Array of { name, value, inline } blocks in the middle. |
In JSON, use the two-character sequence \n (backslash n) inside a string to force a new line in the embed.
Sticky messages
A sticky message always stays at the bottom of a channel. If members chat over it, the bot re-posts it. Great for rules, trade info or event announcements.
,stickymessage set #rules **Please read the rules before chatting.**The content supports the same embed JSON. To use an embed, replace the text with your JSON and set the message in embed mode:
,stickymessage set #rules embed,stickymessage stop #rules,stickymessage previewEach sticky message costs a small amount of bot traffic. One or two per server is plenty; don't sticky every channel.
Timers
Timers post a message on a repeating schedule. Use them for bump reminders, weekly events or "check the poll" nudges.
,timer set #general "Vote in today's poll!" 2hDurations accept compact units: 30m, 2h, 1d. List and remove timers with:
,timer list,timer remove <id>Like sticky messages, timers accept embed JSON instead of plain text. Pass the JSON after the interval with --embed.
Logging
Logging is a three-step setup: pick where logs go, pick which modules log, then fine-tune events.
1. Set the channel
,log channel #mod-logs2. Enable modules
,log modules messages,log modules members,log modules moderation3. Fine-tune events
,log events,log events opens a menu of every individual event: message edits, role changes, channel updates, joins and more. Toggle just the ones you care about.
Point moderation actions at a staff-only channel and member events at a public one. Members seeing every ban can get messy.
Reaction & button roles
Let members assign roles themselves, no moderators needed.
Reaction roles
Post a message first (any channel), then run:
,reactionrole addThe bot asks for the message link, the emoji, and the role to give. Add more emoji/role pairs to the same message by running it again with the same link.
Button roles
,buttonrole addSame flow, but members click a button instead of reacting. Buttons are clearer and work on mobile, but there's a limit per message, so plan your layout.
,reactionrole list,buttonrole list,reactionrole remove <id>Kelly can only assign roles that sit below its own highest role. Move Kelly's role above any roles you want it to hand out.
Autorole
Give every new member a role automatically, like a base role, a "Members" tag, or a muted-by-default role for new accounts.
,autorole add @Member,autorole list,autorole remove @MemberAutorole won't assign server-boost or managed roles (like bot roles). It also can't assign roles above Kelly's top role.
Level rewards
Reward active members with roles at certain levels. First enable leveling, then attach roles:
,levels config,levels reward add 10 @Active Member,levels reward add 25 @Regular,levels reward list,levels reward remove 25Tune how fast levels are earned with:
,levels xpRoles are given when a member crosses the level. They aren't taken away if the reward is later removed, so clean those up manually if needed.
Auto-mod filters
The ,filter command runs the automated moderation shown on the homepage: blocked words, invites, links, spam and caps. It's built from small pieces you turn on one at a time.
Word filters
,filter word add <banned word>,filter word list,filter word remove <banned word>Link, invite & spam control
,filter invites on,filter links on,filter spam on,filter caps onPunishment & exceptions
,filter punishment mute,filter ignore #memes,filter punishment sets what happens when someone triggers a filter: warn, mute, kick or ban. Strikes build up over time, so repeat offenders escalate automatically.
Use ,filter ignore for channels like #memes where caps and spammy content are expected.
Anti-raid & anti-nuke
These two switches protect your server from the loud and the quiet attacks: raids of new accounts, and admin actions that shouldn't happen.
Anti-raid
,antiraid on,antiraid threshold 10Anti-raid watches join speed and blocks suspicious accounts like new profiles, no avatar, or mass joins. ,antiraid threshold sets how many joins per minute are allowed before protection kicks in.
Anti-nuke
,antinuke on,antinuke limit ban 5,antinuke whitelist @StaffAnti-nuke limits destructive actions such as bans, kicks and channel deletes, and punishes whoever goes past the limit, even if they have admin permissions. Use ,antinuke whitelist for trusted staff.
Don't enable anti-nuke while a raid is already happening. Set your limits in advance so the system has clean data to work from.
Tickets & giveaways
Tickets
,tickets panelCreates the ticket panel. Members click a button to open a private channel; staff close it when done. Configure which category tickets open in and who can see them with:
,tickets category,tickets close,tickets transcriptGiveaways
,giveaway start 4h Nitro,giveaway end,giveaway reroll,giveaway start takes a duration and a prize. Winners are picked when it ends; reroll picks a new winner if the first one was invalid.