DWEEB
🗂️ Community App-owned webhook required

Discord Server Directory Template

Turn one message into a searchable directory for your whole server. Members open a menu to look up any channel, role or member and get a private list of clickable mentions back — all four auto-populated Discord select types working together in a single post.

Preview
Server DirectoryAPP

🗂️ Server Directory

One message to find anything in {server} — channels, roles, and members. Pick from a menu and your results come back privately, with clickable mentions to jump straight there.


🧭 Channels — find a place to read, post, or hop into voice.

Search for a channel…

Pick a channel


🎭 Roles — look up a role and who carries it.

Browse roles…

Pick a role


👋 Members — search for a member or staffer.

Look up a member…

Pick a member


🔎 Find anything — not sure what it is? Search members and roles together.

Find any member or role…

Pick a member or role

Wire each menu to the Picker plugin — every result is private to whoever searched. Pick up to five at a time.

Copy and paste the Discord Server Directory text

This is the template's text as Discord markdown. Paste it into any channel and the headings, bold text, lists and subtext format exactly as they do in the preview; the card, buttons and menus come with the full template when you open it in DWEEB. Words in {braces} are DWEEB placeholders that fill in when you send from DWEEB — replace them by hand if you paste the text yourself. The Discord text formatting guide explains every piece of syntax it uses.

# 🗂️ Server Directory
One message to find anything in **{server}** — channels, roles, and members. Pick from a menu and your results come back **privately**, with clickable mentions to jump straight there.

**🧭 Channels** — find a place to read, post, or hop into voice.

**🎭 Roles** — look up a role and who carries it.

**👋 Members** — search for a member or staffer.

**🔎 Find anything** — not sure what it is? Search members and roles together.

-# Wire each menu to the Picker plugin — every result is private to whoever searched. Pick up to five at a time.

When to use it

  • Giving a big server a single 'find anything' hub
  • Helping members locate channels, roles and people
  • Showcasing every Discord select-menu type at once

What's inside

Built with Discord's Components V2 layout system — the accent-striped card the Discord embed builder produces in place of a legacy embed:

  • Container with accent stripe
  • Formatted text
  • Separator
  • Auto-populated select menu

Tips

  • Every piece of text, colour, emoji and link is editable — open it in DWEEB and make it yours.
  • This template contains interactive components. Discord rejects it on a person-created webhook; use an application-owned webhook and configure the Picker plugin in DWEEB before sending.
  • Use the measured, high-fidelity preview to check the layout before you send.

How to use this template

  1. Open it in DWEEB. Click “Use this template free” to load the template into the visual editor — no sign-up, no install.
  2. Make it yours. Edit the text, colours, emoji, links and images to match your server. The live preview updates as you type.
  3. Connect an app-owned destination. Follow DWEEB's guided setup for Picker, then choose a connected server and channel. Discord rejects interactive components on person-created webhooks.
  4. Send it. Review the live preview, then hit Send. You can also save it, share it as a link, schedule it, or export the message JSON.

Template JSON and compatibility

This example contains 2 top-level blocks and 19 components including nested blocks. Its text fields use 648 characters of the editor's message budget. The JSON below is exported from the same template that opens in DWEEB.

Import it through DWEEB's JSON panel, or adapt it for your own application. This is a Components V2 payload with flags: 32768, not a legacy embeds array. When executing a webhook yourself, include with_components=true in the request URL. See the Components V2 JSON reference for delivery requirements.

The custom IDs in this example are setup placeholders. Downloading JSON does not configure a running interaction handler: use the template's guided plugin setup in DWEEB, or connect your own handler to the application that owns the webhook.

Replace example text, images, links and any server placeholders before posting. Discord does not expand DWEEB placeholders when you send raw JSON from your own code. Review allowed mentions before sending text that names users or roles.

Download Discord Server Directory JSON

View the complete template JSON
{
  "username": "Server Directory",
  "components": [
    {
      "type": 17,
      "accent_color": 1752220,
      "components": [
        {
          "type": 10,
          "content": "# 🗂️ Server Directory\nOne message to find anything in **{server}** — channels, roles, and members. Pick from a menu and your results come back **privately**, with clickable mentions to jump straight there."
        },
        {
          "type": 14,
          "divider": true,
          "spacing": 2
        },
        {
          "type": 10,
          "content": "**🧭 Channels** — find a place to read, post, or hop into voice."
        },
        {
          "type": 1,
          "components": [
            {
              "type": 8,
              "custom_id": "directory_channels",
              "placeholder": "Search for a channel…",
              "min_values": 1,
              "max_values": 5
            }
          ]
        },
        {
          "type": 14,
          "divider": true,
          "spacing": 1
        },
        {
          "type": 10,
          "content": "**🎭 Roles** — look up a role and who carries it."
        },
        {
          "type": 1,
          "components": [
            {
              "type": 6,
              "custom_id": "directory_roles",
              "placeholder": "Browse roles…",
              "min_values": 1,
              "max_values": 5
            }
          ]
        },
        {
          "type": 14,
          "divider": true,
          "spacing": 1
        },
        {
          "type": 10,
          "content": "**👋 Members** — search for a member or staffer."
        },
        {
          "type": 1,
          "components": [
            {
              "type": 5,
              "custom_id": "directory_members",
              "placeholder": "Look up a member…",
              "min_values": 1,
              "max_values": 5
            }
          ]
        },
        {
          "type": 14,
          "divider": true,
          "spacing": 1
        },
        {
          "type": 10,
          "content": "**🔎 Find anything** — not sure what it is? Search members and roles together."
        },
        {
          "type": 1,
          "components": [
            {
              "type": 7,
              "custom_id": "directory_anything",
              "placeholder": "Find any member or role…",
              "min_values": 1,
              "max_values": 5
            }
          ]
        }
      ]
    },
    {
      "type": 10,
      "content": "-# Wire each menu to the Picker plugin — every result is private to whoever searched. Pick up to five at a time."
    }
  ],
  "flags": 32768
}

Use this template in a bot

The same message as a discord.js or discord.py bot sends it. Both are generated from the template above by DWEEB's code generator; for a cURL, JavaScript or Python webhook request, open the template with the Code tab.

discord.js code
// Components V2 message — discord.js v14.19 or newer.
// Designed in DWEEB (https://dweeb.faizo.net). Edit the text, then send.
const {
  ActionRowBuilder,
  ChannelSelectMenuBuilder,
  ContainerBuilder,
  MentionableSelectMenuBuilder,
  MessageFlags,
  RoleSelectMenuBuilder,
  SeparatorBuilder,
  SeparatorSpacingSize,
  TextDisplayBuilder,
  UserSelectMenuBuilder,
} = require("discord.js");

const container = new ContainerBuilder()
  .setAccentColor(0x1abc9c)
  .addTextDisplayComponents(
    new TextDisplayBuilder().setContent(
      [
        "# 🗂️ Server Directory",
        "One message to find anything in **{server}** — channels, roles, and members. Pick from a menu and your results come back **privately**, with clickable mentions to jump straight there.",
      ].join("\n"),
    ),
  )
  .addSeparatorComponents(
    new SeparatorBuilder().setDivider(true).setSpacing(SeparatorSpacingSize.Large),
  )
  .addTextDisplayComponents(
    new TextDisplayBuilder().setContent(
      "**🧭 Channels** — find a place to read, post, or hop into voice.",
    ),
  )
  .addActionRowComponents(
    new ActionRowBuilder().addComponents(
      new ChannelSelectMenuBuilder()
        .setCustomId("directory_channels")
        .setPlaceholder("Search for a channel…")
        .setMinValues(1)
        .setMaxValues(5),
    ),
  )
  .addSeparatorComponents(
    new SeparatorBuilder().setDivider(true).setSpacing(SeparatorSpacingSize.Small),
  )
  .addTextDisplayComponents(
    new TextDisplayBuilder().setContent(
      "**🎭 Roles** — look up a role and who carries it.",
    ),
  )
  .addActionRowComponents(
    new ActionRowBuilder().addComponents(
      new RoleSelectMenuBuilder()
        .setCustomId("directory_roles")
        .setPlaceholder("Browse roles…")
        .setMinValues(1)
        .setMaxValues(5),
    ),
  )
  .addSeparatorComponents(
    new SeparatorBuilder().setDivider(true).setSpacing(SeparatorSpacingSize.Small),
  )
  .addTextDisplayComponents(
    new TextDisplayBuilder().setContent(
      "**👋 Members** — search for a member or staffer.",
    ),
  )
  .addActionRowComponents(
    new ActionRowBuilder().addComponents(
      new UserSelectMenuBuilder()
        .setCustomId("directory_members")
        .setPlaceholder("Look up a member…")
        .setMinValues(1)
        .setMaxValues(5),
    ),
  )
  .addSeparatorComponents(
    new SeparatorBuilder().setDivider(true).setSpacing(SeparatorSpacingSize.Small),
  )
  .addTextDisplayComponents(
    new TextDisplayBuilder().setContent(
      "**🔎 Find anything** — not sure what it is? Search members and roles together.",
    ),
  )
  .addActionRowComponents(
    new ActionRowBuilder().addComponents(
      new MentionableSelectMenuBuilder()
        .setCustomId("directory_anything")
        .setPlaceholder("Find any member or role…")
        .setMinValues(1)
        .setMaxValues(5),
    ),
  );

const text = new TextDisplayBuilder().setContent(
  "-# Wire each menu to the Picker plugin — every result is private to whoever searched. Pick up to five at a time.",
);

// Buttons and menus with a custom ID do nothing until your bot handles the
// interaction: client.on("interactionCreate", …) and match on customId.
// The design also sets username "Server Directory" — webhook-only options that
// channel.send() has no equivalent for. WebhookClient#send accepts them.

// Send it from any async context: a command handler, an event, a script.
await channel.send({
  components: [container, text],
  flags: MessageFlags.IsComponentsV2,
});
discord.py code
# Components V2 message — discord.py 2.6 or newer.
# Designed in DWEEB (https://dweeb.faizo.net). Edit the text, then send.
import discord
from discord import ui


def build_view() -> ui.LayoutView:
    view = ui.LayoutView(timeout=None)
    view.add_item(
        ui.Container(
            ui.TextDisplay(
                "# 🗂️ Server Directory\n"
                "One message to find anything in **{server}** — channels, roles, and members. Pick from a menu and your results come back **privately**, with clickable mentions to jump straight there.",
            ),
            ui.Separator(visible=True, spacing=discord.SeparatorSpacing.large),
            ui.TextDisplay(
                "**🧭 Channels** — find a place to read, post, or hop into voice.",
            ),
            ui.ActionRow(
                ui.ChannelSelect(
                    custom_id="directory_channels",
                    placeholder="Search for a channel…",
                    min_values=1,
                    max_values=5,
                ),
            ),
            ui.Separator(visible=True, spacing=discord.SeparatorSpacing.small),
            ui.TextDisplay("**🎭 Roles** — look up a role and who carries it."),
            ui.ActionRow(
                ui.RoleSelect(
                    custom_id="directory_roles",
                    placeholder="Browse roles…",
                    min_values=1,
                    max_values=5,
                ),
            ),
            ui.Separator(visible=True, spacing=discord.SeparatorSpacing.small),
            ui.TextDisplay("**👋 Members** — search for a member or staffer."),
            ui.ActionRow(
                ui.UserSelect(
                    custom_id="directory_members",
                    placeholder="Look up a member…",
                    min_values=1,
                    max_values=5,
                ),
            ),
            ui.Separator(visible=True, spacing=discord.SeparatorSpacing.small),
            ui.TextDisplay(
                "**🔎 Find anything** — not sure what it is? Search members and roles together.",
            ),
            ui.ActionRow(
                ui.MentionableSelect(
                    custom_id="directory_anything",
                    placeholder="Find any member or role…",
                    min_values=1,
                    max_values=5,
                ),
            ),
            accent_colour=0x1abc9c,
        ),
    )
    view.add_item(
        ui.TextDisplay(
            "-# Wire each menu to the Picker plugin — every result is private to whoever searched. Pick up to five at a time.",
        ),
    )
    return view


# Buttons and menus with a custom_id do nothing until your bot handles them:
# subclass ui.LayoutView with callbacks, or listen for on_interaction.
# The design also sets username "Server Directory" — webhook-only options that
# channel.send() has no equivalent for. discord.Webhook.send accepts them.

# Send it from any coroutine: a command, an event listener, a task.
await channel.send(view=build_view())

Ready to use this template?

Open it in the visual Discord message builder, customize it for your server, and review the result before sending.

Use “Discord Server Directory” →

Frequently asked questions

Do I need a bot to use this template?

It needs an application-owned webhook because it contains interactive components; Discord rejects those components on a person-created webhook. DWEEB detects the requirement and guides you through configuring Picker. Some handlers also need the DWEEB bot installed for server permissions.

How do I use this Server directory template?

Click “Use this template free” to load it into the visual editor, change the text, colours and links to fit your server, then pick a channel or paste your Discord webhook URL and hit Send. You can also share it as a single link or export the message JSON.

Is DWEEB free?

Yes. DWEEB's full visual builder is free and needs no account. Working drafts and browser saves are local by default; optional connected features such as schedules, server libraries, AI, and plugins use the data required to work.

Set up the interaction

This template is already paired with the matching DWEEB workflow:

Read next

Related templates