🎴 Packs
Packsare booster add-ons that inject pre-built library sparks into your bot's Canvas. Filter word lists, validation regexes, and more — curated, tested, and ready to use with zero configuration.
⚙️How Packs Work
Unlike Expansions (which unlock new Piece types), Packs add library sparks — pre-built values accessible as {{lib.*}} in any Piece config. Think of them as named constants your bot can reference.
interface PackDef {
id: string; // e.g. "naughty"
name: string; // "The Naughty List"
tagline: string;
emoji: string;
sparks: PackSpark[];
}
interface PackSpark {
id: string; // e.g. "filter.profanity"
label: string; // Canvas label
hint: string; // Description
sparkType: SparkType; // "string" | "array"
emoji: string;
value: string | string[]; // The actual data the Engine injects
}
// In the Kit:
// { "packs": ["naughty", "patterns"] }
// Sparks then available as {{lib.filter.profanity}}, {{lib.validate.email}}, etc.📋Pack Catalog
naughtyBad words, slurs, spam phrases, Discord invite links, external URLs, and caps detection — all pre-written and ready to drop into your Conditions. Santa's got nothing on this list.
{{lib.filter.profanity}}array{{lib.filter.slurs}}array{{lib.filter.spam_phrases}}array{{lib.filter.discord_invite}}regex{{lib.filter.external_links}}regex{{lib.filter.excessive_caps}}regexpatternsEmail, URL, phone, Discord ID, invite links, hex colors, IPs, and digits-only — validated with battle-tested regex patterns. No regex knowledge required.
{{lib.validate.email}}regex{{lib.validate.url}}regex{{lib.validate.phone}}regex{{lib.validate.discord_id}}regex{{lib.validate.discord_invite}}regex{{lib.validate.hex_color}}regex{{lib.validate.ip_address}}regex{{lib.validate.number_only}}regex📐Arrays vs Regex sparks
Pack sparks come in two flavors — each used slightly differently in conditions.
A list of strings — check if a value is contained in the list.
A regex pattern — check if a value matches the pattern.
💻Using pack sparks in a flow
In a Condition piece, reference library sparks the same way as any other spark. Below: Kit JSON on the Canvas, then the equivalent moderation check in TypeScript.
{
"id": "node_check",
"piece": "base.condition",
"config": {
"left": "{{message.content}}",
"operator": "matches",
"right": "{{lib.filter.discord_invite}}"
}
}// Array spark — profanity list from The Naughty List pack
const badWords: string[] = lib.filter.profanity;
const words = message.content.toLowerCase().split(/\s+/);
const hasProfanity = words.some((w) => badWords.includes(w));
// Regex spark — invite link pattern from Patterns pack
const invitePattern = new RegExp(lib.filter.discord_invite, "i");
const hasInvite = invitePattern.test(message.content);
if (hasProfanity || hasInvite) {
await message.delete();
}📄Packs in the Kit
Active packs are stored as pack IDs on your bot (set in the Packs tab). The Engine resolves library sparks from the active pack list before executing any flow.
Packs are free. You can add as many as you want to any bot. They don't count against any limits and are included in export bundles — the Mini Engine resolves them identically.