
Discord Bot Architect
Scaffold a production-minded Discord bot with slash commands, components, intents, rate limits, and sharding using Discord.js or Pycord.
Overview
discord-bot-architect is an agent skill for the Build phase that guides production Discord bots with Discord.js or Pycord, slash commands, components, rate limits, and sharding.
Install
npx skills add https://github.com/sickn33/antigravity-awesome-skills --skill discord-bot-architectWhat is this skill?
- Discord.js v14 and Pycord coverage with slash-first command design
- Principles: 3-second interaction acknowledgement and minimal privileged intents
- Rate limiting with exponential backoff and sharding plan from 2500+ guilds
- Interactive components—buttons, selects, modals—for richer guild UX
- Guild-scoped command testing before global deploy
- Acknowledge interactions within 3 seconds
- Sharding required at 2500+ guilds
- Discord.js v14 and Pycord stacks referenced
Adoption & trust: 1.1k installs on skills.sh; 40.1k GitHub stars; 3/3 security scanners passed (skills.sh audits).
What problem does it solve?
You want a Discord bot but risk broken interactions, intent overreach, or scaling pain without a clear architecture.
Who is it for?
Indie builders shipping a Discord.js or Pycord bot with slash commands and interactive UI for a growing server list.
Skip if: One-off webhook-only integrations, bots that rely solely on message content parsing, or teams avoiding Discord Gateway entirely.
When should I use this skill?
Building production-ready Discord bots with Discord.js or Pycord—slash commands, components, intents, rate limits, and sharding.
What do I get? / Deliverables
You adopt a slash-first bot layout with safe intents, component UX, backoff-aware API usage, and a sharding mindset ready for guild growth.
- Bot client bootstrap structure
- Slash command registration flow
- Component interaction handlers
Recommended Skills
Journey fit
Discord bot architecture is core backend and gateway work while you are building the product surface. Bots are long-running services with command handlers and state—fits Build → Backend rather than pure third-party SaaS wiring.
How it compares
Opinionated bot architecture skill—not a hosted bot platform or Discord MCP bridge.
Common Questions / FAQ
Who is discord-bot-architect for?
Solo and indie developers building Discord bots in JavaScript/TypeScript or Python who need production gateway and interaction patterns.
When should I use discord-bot-architect?
During Build → Backend while structuring Discord.js v14 or Pycord projects, registering slash commands, or planning sharding and rate-limit handling.
Is discord-bot-architect safe to install?
Review the Security Audits panel on this page; bots use bot tokens and network access—store secrets in env vars and minimize privileged intents.
SKILL.md
READMESKILL.md - Discord Bot Architect
# Discord Bot Architect Specialized skill for building production-ready Discord bots. Covers Discord.js (JavaScript) and Pycord (Python), gateway intents, slash commands, interactive components, rate limiting, and sharding. ## Principles - Slash commands over message parsing (Message Content Intent deprecated) - Acknowledge interactions within 3 seconds, always - Request only required intents (minimize privileged intents) - Handle rate limits gracefully with exponential backoff - Plan for sharding from the start (required at 2500+ guilds) - Use components (buttons, selects, modals) for rich UX - Test with guild commands first, deploy global when ready ## Patterns ### Discord.js v14 Foundation Modern Discord bot setup with Discord.js v14 and slash commands **When to use**: Building Discord bots with JavaScript/TypeScript,Need full gateway connection with events,Building bots with complex interactions ```javascript // src/index.js const { Client, Collection, GatewayIntentBits, Events } = require('discord.js'); const fs = require('node:fs'); const path = require('node:path'); require('dotenv').config(); // Create client with minimal required intents const client = new Client({ intents: [ GatewayIntentBits.Guilds, // Add only what you need: // GatewayIntentBits.GuildMessages, // GatewayIntentBits.MessageContent, // PRIVILEGED - avoid if possible ] }); // Load commands client.commands = new Collection(); const commandsPath = path.join(__dirname, 'commands'); const commandFiles = fs.readdirSync(commandsPath).filter(f => f.endsWith('.js')); for (const file of commandFiles) { const filePath = path.join(commandsPath, file); const command = require(filePath); if ('data' in command && 'execute' in command) { client.commands.set(command.data.name, command); } } // Load events const eventsPath = path.join(__dirname, 'events'); const eventFiles = fs.readdirSync(eventsPath).filter(f => f.endsWith('.js')); for (const file of eventFiles) { const filePath = path.join(eventsPath, file); const event = require(filePath); if (event.once) { client.once(event.name, (...args) => event.execute(...args)); } else { client.on(event.name, (...args) => event.execute(...args)); } } client.login(process.env.DISCORD_TOKEN); ``` ```javascript // src/commands/ping.js const { SlashCommandBuilder } = require('discord.js'); module.exports = { data: new SlashCommandBuilder() .setName('ping') .setDescription('Replies with Pong!'), async execute(interaction) { const sent = await interaction.reply({ content: 'Pinging...', fetchReply: true }); const latency = sent.createdTimestamp - interaction.createdTimestamp; await interaction.editReply(`Pong! Latency: ${latency}ms`); } }; ``` ```javascript // src/events/interactionCreate.js const { Events } = require('discord.js'); module.exports = { name: Events.InteractionCreate, async execute(interaction) { if (!interaction.isChatInputCommand()) return; const command = interaction.client.commands.get(interaction.commandName); if (!command) { console.error(`No command matching ${interaction.commandName}`); return; } try { await command.execute(interaction); } catch (error) { console.error(error); const reply = { content: 'There was an error executing this command!', ephemeral: true }; if (interaction.replied || interaction.deferred) { await interaction.followUp(reply); } else { await interaction.reply(reply); } } } }; ``` ```javascript // src/deploy-commands.js const {