New to Claude Skills? Learn how to install them โ†’

davila7 on GitHub

Discord Bot Architect

Free

Build production-ready Discord bots with ease.

Get this skill

Free ยท Opens the source repo

What Discord Bot Architect does

Discord Bot Architect is a specialized skill designed to assist developers in creating production-ready Discord bots using either JavaScript with Discord.js or Python with Pycord. It provides a comprehensive guide on setting up bots with modern features such as slash commands, interactive components, and efficient handling of gateway intents. This skill is particularly useful for those looking to implement complex interactions and maintain performance through techniques like rate limiting and sharding.

The skill includes detailed patterns for both Discord.js and Pycord, allowing users to choose their preferred programming language. For JavaScript developers, it covers the foundational setup for Discord.js v14, including the necessary intents and event handling. Python developers benefit from a similar structure with Pycord, which emphasizes asynchronous programming and application commands. The skill also provides examples of interactive components, such as buttons and select menus, which enhance user experience by allowing for richer interactions beyond simple command responses.

Whether you are a beginner looking to create your first Discord bot or an experienced developer aiming to implement advanced features, Discord Bot Architect offers the resources and structure needed to streamline the development process. By leveraging the provided code snippets and patterns, you can quickly adapt and expand your bot's functionality to meet your specific needs.

When to use it

Use this skill when you need to create a Discord bot and want to leverage modern features like slash commands and interactive components.

When not to use it

This skill may not be suitable for projects that require non-Discord integrations or for developers looking for a more general-purpose bot framework.

What you can build with it

Creating a Simple Bot

Use the provided JavaScript or Python templates to quickly set up a basic bot that responds to commands.

Implementing Interactive Features

Leverage the interactive components section to add buttons and menus to your bot for enhanced user engagement.

Managing Bot Events

Utilize the event handling patterns to efficiently manage and respond to various Discord events.

How to install Discord Bot Architect

View source

1. Install with the skills CLI

npx skills add davila7/claude-code-templates/discord-bot-architect --agent claude-code

2. Or install it manually

Download the skill folder and drop it into ~/.claude/skills/ for all projects, or .claude/skills/ to scope it to one repo. Restart Claude Code so it picks up the new skill.

Anthropic's agentic coding CLI, and the reference implementation of Agent Skills. Drop a skill folder into ~/.claude/skills and Claude Code loads it automatically whenever a task matches the skill's description. Claude Code docs

Inside SKILL.md

Written by davila7

Discord Bot Architect

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);
// 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`);
  }
};
// src/events/interactionCreate.js
const { Events } = require('discord.js');

module.exports = {
  name: Event

Pycord Bot Foundation

Discord bot with Pycord (Python) and application commands

When to use: ['Building Discord bots with Python', 'Prefer async/await patterns', 'Need good slash command support']

```python
# main.py
import os
import discord
from discord.ext import commands
from dotenv import load_dotenv

load_dotenv()

# Configure intents - only enable what you need
intents = discord.Intents.default()
# intents.message_content = True  # PRIVILEGED - avoid if possible
# intents.members = True          # PRIVILEGED

bot = commands.Bot(
    command_prefix="!",  # Legacy, prefer slash commands
    intents=intents
)

@bot.event
async def on_ready():
    print(f"Logged in as {bot.user}")
    # Sync commands (do this carefully - see sharp edges)
    # await bot.sync_commands()

# Slash command
@bot.slash_command(name="ping", description="Check bot latency")
async def ping(ctx: discord.ApplicationContext):
    latency = round(bot.latency * 1000)
    await ctx.respond(f"Pong! Latency: {latency}ms")

# Slash command with options
@bot.slash_command(name="greet", description="Greet a user")
async def greet(
    ctx: discord.ApplicationContext,
    user: discord.Option(discord.Member, "User to greet"),
    message: discord.Option(str, "Custom message", required=False)
):
    msg = message or "Hello!"
    await ctx.respond(f"{user.mention}, {msg}")

# Load cogs
for filename in os.listdir("./cogs"):
    if filename.endswith(".py"):
        bot.load_extension(f"cogs.{filename[:-3]}")

bot.run(os.environ["DISCORD_TOKEN"])
# cogs/general.py
import discord
from discord.ext import commands

class General(commands.Cog):
    def __init__(self, bot):
        self.bot = bot

    @commands.slash_command(name="info", description="Bot information")
    async def info(self, ctx: discord.ApplicationContext):
        embed = discord.Embed(
            title="Bot Info",
            description="A helpful Discord bot",
            color=discord.Color.blue()
        )
        embed.add_field(name="Servers", value=len(self.bot.guilds))
        embed.add_field(name="Latency", value=f"{round(self.bot.latency * 1000)}ms")
        await ctx.respond(embed=embed)

    @commands.Cog.

Interactive Components Pattern

Using buttons, select menus, and modals for rich UX

When to use: ['Need interactive user interfaces', 'Collecting user input beyond slash command options', 'Building menus, confirmations, or forms']

```javascript
// Discord.js - Buttons and Select Menus
const {
  SlashCommandBuilder,
  ActionRowBuilder,
  ButtonBuilder,
  ButtonStyle,
  StringSelectMenuBuilder,
  ModalBuilder,
  TextInputBuilder,
  TextInputStyle
} = require('discord.js');

module.exports = {
  data: new SlashCommandBuilder()
    .setName('menu')
    .setDescription('Shows an interactive menu'),

  async execute(interaction) {
    // Button row
    const buttonRow = new ActionRowBuilder()
      .addComponents(
        new ButtonBuilder()
          .setCustomId('confirm')
          .setLabel('Confirm')
          .setStyle(ButtonStyle.Primary),
        new ButtonBuilder()
          .setCustomId('cancel')
          .setLabel('Cancel')
          .setStyle(ButtonStyle.Danger),
        new ButtonBuilder()
          .setLabel('Documentation')
          .setURL('https://discord.js.org')
          .setStyle(ButtonStyle.Link)  // Link buttons don't emit events
      );

    // Select menu row (one per row, takes all 5 slots)
    const selectRow = new ActionRowBuilder()
      .addComponents(
        new StringSelectMenuBuilder()
          .setCustomId('select-role')
          .setPlaceholder('Select a role')
          .setMinValues(1)
          .setMaxValues(3)
          .addOptions([
            { label: 'Developer', value: 'dev', emoji: '๐Ÿ’ป' },
            { label: 'Designer', value: 'design', emoji: '๐ŸŽจ' },
            { label: 'Community', value: 'community', emoji: '๐ŸŽ‰' }
          ])
      );

    await interaction.reply({
      content: 'Choose an option:',
      components: [buttonRow, selectRow]
    });

    // Collect responses
    const collector = interaction.channel.createMessageComponentCollector({
      filter: i => i.user.id === interaction.user.id,
      time: 60_000  // 60 seconds timeout
    });

    collector.on('collect', async i => {
      if (i.customId === 'confirm') {
        await i.update({ content: 'Confirmed!', components: [] });
        collector.stop();
      } else if (i.custo

Anti-Patterns

โŒ Message Content for Commands

Why bad: Message Content Intent is privileged and deprecated for bot commands. Slash commands are the intended approach.

โŒ Syncing Commands on Every Start

Why bad: Command registration is rate limited. Global commands take up to 1 hour to propagate. Syncing on every start wastes API calls and can hit limits.

โŒ Blocking the Event Loop

Why bad: Discord gateway requires regular heartbeats. Blocking operations cause missed heartbeats and disconnections.

โš ๏ธ Sharp Edges

IssueSeveritySolution
Issuecritical## Acknowledge immediately, process later
Issuecritical## Step 1: Enable in Developer Portal
Issuehigh## Use a separate deploy script (not on startup)
Issuecritical## Never hardcode tokens
Issuehigh## Generate correct invite URL
Issuemedium## Development: Use guild commands
Issuemedium## Never block the event loop
Issuemedium## Show modal immediately

Frequently asked questions about Discord Bot Architect

Similar skills