Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/betterdiscord/betterdiscord/llms.txt

Use this file to discover all available pages before exploring further.

Discord’s client is built using webpack, which bundles all modules together. BetterDiscord provides powerful tools to find and use these internal modules.

Getting modules

The BdApi.Webpack namespace provides methods to search for and retrieve webpack modules. Use getModule() to find a single module:
const module = BdApi.Webpack.getModule(
    BdApi.Webpack.Filters.byKeys("sendMessage")
);
Use getModules() to find all matching modules:
const modules = BdApi.Webpack.getModules(
    BdApi.Webpack.Filters.byKeys("sendMessage")
);

Wait for modules

Some modules may not be loaded immediately. Use waitForModule() to wait for them:
const module = await BdApi.Webpack.waitForModule(
    BdApi.Webpack.Filters.byKeys("sendMessage")
);
You can cancel waiting using an AbortSignal:
const controller = new AbortController();

const module = await BdApi.Webpack.waitForModule(
    BdApi.Webpack.Filters.byKeys("sendMessage"),
    { signal: controller.signal }
);

// Cancel if needed
controller.abort();

Filters

Filters help you find the exact modules you need. All filters are available under BdApi.Webpack.Filters.

byKeys

Find modules with specific property keys:
const filter = BdApi.Webpack.Filters.byKeys("sendMessage", "editMessage");
const module = BdApi.Webpack.getModule(filter);

byPrototypeKeys

Find modules with specific prototype properties:
const filter = BdApi.Webpack.Filters.byPrototypeKeys("render", "componentDidMount");
const Component = BdApi.Webpack.getModule(filter);

byStrings

Find modules containing specific strings in their code:
const filter = BdApi.Webpack.Filters.byStrings("INVALID_TOKEN", "LOGIN_ERROR");
const module = BdApi.Webpack.getModule(filter);

bySource

Find modules by source code content (supports regex):
const filter = BdApi.Webpack.Filters.bySource("sendMessage", /getMessage\(\w+\)/);
const module = BdApi.Webpack.getModule(filter);

byRegex

Find modules matching a regular expression:
const filter = BdApi.Webpack.Filters.byRegex(/send.*Message/);
const module = BdApi.Webpack.getModule(filter);

byDisplayName

Find React components by their display name:
const filter = BdApi.Webpack.Filters.byDisplayName("MessageContent");
const Component = BdApi.Webpack.getModule(filter);

byStoreName

Find Flux stores by name:
const filter = BdApi.Webpack.Filters.byStoreName("UserStore");
const UserStore = BdApi.Webpack.getModule(filter);
You can also use the shorthand:
const UserStore = BdApi.Webpack.getStore("UserStore");

combine

Combine multiple filters (all must match):
const filter = BdApi.Webpack.Filters.combine(
    BdApi.Webpack.Filters.byKeys("sendMessage"),
    BdApi.Webpack.Filters.byStrings("CHANNEL_ID")
);

not

Invert a filter (find modules that don’t match):
const filter = BdApi.Webpack.Filters.not(
    BdApi.Webpack.Filters.byKeys("deprecated")
);

byComponentType

Find React functional components:
const filter = BdApi.Webpack.Filters.byComponentType(
    (component) => component.toString().includes("UserModal")
);

Search options

defaultExport

Return the default export instead of the full module:
const sendMessage = BdApi.Webpack.getModule(
    BdApi.Webpack.Filters.byKeys("sendMessage"),
    { defaultExport: true }
);

searchExports

Search through module exports instead of the module itself:
const module = BdApi.Webpack.getModule(
    BdApi.Webpack.Filters.byKeys("sendMessage"),
    { searchExports: true }
);

raw

Return the raw webpack module:
const rawModule = BdApi.Webpack.getModule(
    BdApi.Webpack.Filters.byKeys("sendMessage"),
    { raw: true }
);

Bulk queries

Retrieve multiple modules at once for better performance:
const [MessageStore, UserStore, ChannelStore] = BdApi.Webpack.getBulk(
    BdApi.Webpack.Filters.byStoreName("MessageStore"),
    BdApi.Webpack.Filters.byStoreName("UserStore"),
    BdApi.Webpack.Filters.byStoreName("ChannelStore")
);
Or with keys for easier destructuring:
const { messages, users, channels } = BdApi.Webpack.getBulkKeyed({
    messages: BdApi.Webpack.Filters.byStoreName("MessageStore"),
    users: BdApi.Webpack.Filters.byStoreName("UserStore"),
    channels: BdApi.Webpack.Filters.byStoreName("ChannelStore")
});

Mangled modules

Some Discord modules use minified/mangled property names. Use getMangled() to find them:
const module = BdApi.Webpack.getMangled(
    BdApi.Webpack.Filters.byKeys("sendMessage"),
    {
        send: BdApi.Webpack.Filters.byKeys("content", "channelId"),
        edit: BdApi.Webpack.Filters.byKeys("messageId")
    }
);

// Use the found properties
module.send({ content: "Hello", channelId: "123" });

Direct access

By module ID

Access modules directly by their webpack ID:
const module = BdApi.Webpack.getById("12345");

All modules

Access all webpack modules:
const allModules = BdApi.Webpack.modules;

// Iterate through modules
for (const id in allModules) {
    const module = allModules[id];
    // Process module
}
Direct module access bypasses filters and safety checks. Use with caution.

Shorthand methods

BdApi provides convenient shorthand methods:
// Instead of getModule + Filters.byKeys
const module = BdApi.Webpack.getByKeys("sendMessage", "editMessage");

// Instead of getModule + Filters.byStrings
const module = BdApi.Webpack.getByStrings("INVALID_TOKEN");

// Instead of getModule + Filters.bySource
const module = BdApi.Webpack.getBySource("sendMessage", /getMessage/);

// Instead of getModule + Filters.byRegex
const module = BdApi.Webpack.getByRegex(/send.*Message/);

// Instead of getModule + Filters.byPrototypeKeys
const Component = BdApi.Webpack.getByPrototypeKeys("render");
All shorthand methods support the same options as getModule(). Use getAll* variants to get all matches:
const modules = BdApi.Webpack.getAllByKeys("sendMessage");

Best practices

  • Cache module references instead of searching repeatedly
  • Use specific filters to avoid finding the wrong module
  • Combine multiple filters for more precise matches
  • Use waitForModule() for modules that load asynchronously
  • Test your searches after Discord updates
Webpack module structure may change with Discord updates. Always test your code after updates.