K
Docs
Building Bots

🎴 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.

1
Add pack to bot
Open Packs in the sidebar, click "Add pack"
2
Sparks appear
Canvas autocomplete shows lib.* entries from the pack
3
Use in flows
Reference with {{lib.filter.profanity}} anywhere in config
📐Under the hood — Pack types in TypeScript
TypeScript
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

🚫
The Naughty List
Content filtering, preloaded
naughty

Bad 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.

Sparks (6)
🤬
{{lib.filter.profanity}}array
Array of common profanity and strong language
{{lib.filter.slurs}}array
Array of racial, ethnic, and identity-based slurs
📨
{{lib.filter.spam_phrases}}array
Array of common spam and scam phrases
🔗
{{lib.filter.discord_invite}}regex
Regex — detects Discord invite links (discord.gg/...)
🌐
{{lib.filter.external_links}}regex
Regex — detects any http or https URL
📣
{{lib.filter.excessive_caps}}regex
Regex — detects 4+ consecutive uppercase characters (SHOUTING)
🔬
The Pattern Lab
Regex for the rest of us
patterns

Email, URL, phone, Discord ID, invite links, hex colors, IPs, and digits-only — validated with battle-tested regex patterns. No regex knowledge required.

Sparks (8)
📧
{{lib.validate.email}}regex
Regex — validates email address format (user@domain.tld)
🌐
{{lib.validate.url}}regex
Regex — validates http/https URLs
📞
{{lib.validate.phone}}regex
Regex — validates international phone numbers (E.164 style, optional +)
🆔
{{lib.validate.discord_id}}regex
Regex — validates Discord snowflake IDs (17–20 digit numbers)
💌
{{lib.validate.discord_invite}}regex
Regex — validates a Discord invite link or code
🎨
{{lib.validate.hex_color}}regex
Regex — validates hex color codes (#RGB or #RRGGBB)
📡
{{lib.validate.ip_address}}regex
Regex — validates IPv4 addresses (0.0.0.0 – 255.255.255.255)
🔢
{{lib.validate.number_only}}regex
Regex — validates that a string contains only digits (0–9)

📐Arrays vs Regex sparks

Pack sparks come in two flavors — each used slightly differently in conditions.

📋 Array sparks

A list of strings — check if a value is contained in the list.

{{message.content}}in{{lib.filter.profanity}}
🔤 Regex sparks

A regex pattern — check if a value matches the pattern.

{{message.content}}matches{{lib.filter.discord_invite}}

💻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.

condition node configJSON
{
  "id": "node_check",
  "piece": "base.condition",
  "config": {
    "left": "{{message.content}}",
    "operator": "matches",
    "right": "{{lib.filter.discord_invite}}"
  }
}
📐Under the hood — Equivalent checks in TypeScript
TypeScript
// 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.

💡Good to know

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.