Dreamliner’s Automod watches messages (and join bursts), awards points per hit, and runs one or more actions from a per-rule escalation ladder. Actions can create real moderation cases through the infractions system.
Automod is off by default. Enable it in the dashboard and Save before anything applies.
#Setup (dashboard)
- Open the guild dashboard → Automod.
- Turn the plugin Enabled, then click Save in the sidebar (same as other plugins).
- Optionally apply a preset (Light / Standard / Strict). Presets update the editor only until you Save.
- Open Configure on any filter to set:
- Trigger — thresholds / custom words / blocked domains
- Actions — one or more actions on the first hit (delete, warn, timeout, kick, softban, tempban, ban, staff note)
- Escalation — extra steps after more points in a rolling window
- Exceptions — channels and roles this rule should skip
- Set server-wide ignores under Settings, then Save.
Changes in the Automod UI are not live until you press Save.
#Server settings
| Setting | What it does |
|---|---|
| Ignored channels | Automod never runs in these channels (snowflake picker). |
| Ignored roles | Members with any of these roles bypass Automod. |
| Log channel | Optional channel for Automod hit logs. Falls back to the server moderation log channel. |
| DM members on warn | Default for warn DMs when a rule does not set its own notify toggle. |
#Configuring a rule
#Trigger
Each rule has its own detector settings, for example:
- Spam: messages allowed + time window
- Caps: percent + minimum length
- Links: link count + optional always-blocked domains
- Custom filters: your own words, phrases, or regex patterns
- Raid: join count + join window
Built-in packs (profanity, slurs, invites, @everyone / @here) need no numeric thresholds. In the dashboard, Profanity, Excessive swearing, and Slur detection include a View built-in word list control so you can see exactly which terms are matched (not editable there; add extras under Custom filters).
Word-pack matching is fuzzy: leetspeak (sh1t, a$$), spacing/punctuation (F - UCK, f.u.c.k), and elongation (fuuuuck) are normalized before compare. Innocent words like classic / assessment are not matched as ass.
#Actions (multi-select)
On the first trigger you can enable any combination of:
| Action | Notes |
|---|---|
| Delete message | Removes the offending message. |
| Warn | Creates a warn case. |
| Timeout | Discord timeout; set duration in minutes. |
| Kick | Kicks the member. |
| Softban | Ban then unban; optional delete history days (0–7). |
| Tempban | Temporary ban; set hours + optional delete history days. |
| Ban | Permanent ban; optional delete history days. |
| Staff note | Internal note case only. |
If no punishment actions are selected, Automod only logs (optionally with delete).
Shared rule options:
| Option | What it does |
|---|---|
| Points per hit | Each trigger adds this many points toward escalation (default 1). |
| Case points | Optional points stored on case metadata (defaults to points per hit). |
| Case reason | Optional reason override on created cases. |
| DM the member | Notify them when a case action runs. |
#Escalation
Hits are counted per user per rule in a rolling window (strike_window_ms, shown as minutes in the UI).
Score used for the ladder:
score = hitCount × points_per_hit
Each ladder step has an after N points threshold and its own multi-action set. The highest matching step runs (not every step below it).
#Per-rule exceptions
In addition to server defaults, a rule can ignore specific channels and roles.
#Rules catalog
#Content filters
| Rule | Description |
|---|---|
| Profanity | Built-in swear word pack |
| Slur detection | Hate-speech / slur terms |
| Excessive swearing | Many swears in one message |
| Custom filters | Your words, phrases, and regex (replaces Censor) |
#Spam & noise
| Rule | Description |
|---|---|
| Spam | Too many messages in a short window |
| Emoji spam | Too many emoji / emotes |
| Duplicate messages | Same user repeating the same message |
| Copypasta | Same text pasted across the server |
| Sticker & GIF spam | Rapid stickers / GIFs |
| Attachment spam | Rapid file uploads |
| Newline spam | Excessive line breaks |
| Wall of text | Extremely long messages |
| Repeated characters | Floods like aaaaaaa |
#Mentions & links
| Rule | Description |
|---|---|
| Mass mentions | Too many unique user mentions |
| @everyone / @here | Unauthorized everyone/here pings |
| Invite links | Discord invite links |
| Link spam | Too many links, or blocked domains |
#Presentation
| Rule | Description |
|---|---|
| Excessive caps | High % of capital letters |
| Zalgo / obfuscation | Abuse of combining marks |
#Image scanning
| Rule | Description |
|---|---|
| Image scanning | Checks image attachments against a shared blocklist of known scam-image fingerprints |
What it checks, for each image attachment (max 3 per message, 8MB each): a 64-bit perceptual fingerprint (pHash) of the image is compared against a shared, platform-wide blocklist of known scam images (fake celebrity/streamer giveaways, Nitro/gift-card generator templates, etc.). This is image similarity, not the text in it, so it catches the same picture reposted even after it's been recompressed, lightly cropped, or re-watermarked. The pHash max distance setting controls how close a match needs to be (0 = exact fingerprint only; higher = more lenient, more false positives).
This only runs on messages that actually have image attachments, so it costs nothing on ordinary text messages. It only looks at uploaded attachments, not link previews/embeds.
The pHash blocklist is global, not per-guild. It's one shared list every server's Image Scanning rule matches against, managed only from the platform dashboard by a superuser. See Managing the scam-image blocklist below, which also covers the Test an image tool for checking a match without posting in Discord.
Off by default. Enable it explicitly per rule the same as any other.
#Join protection
| Rule | Description |
|---|---|
| Raid detection | Burst of member joins |
#Presets
| Preset | Intent |
|---|---|
| Light | Few rules, lenient thresholds, light punishments |
| Standard | Balanced coverage for most servers |
| Strict | More rules, stricter thresholds, faster escalation |
Custom filter entries are preserved when you re-apply a preset.
#Discord commands
/automod status— overview (includes ignored roles)/automod test— dry-run sample text against content rules (uses saved config)/automod preset— apply Light / Standard / Strict/automod toggle— enable/disable a rule/automod filters list|add|remove— manage custom filter entries/automod ignore-channel/ignore-role— server-wide bypasses/automod native status— show which rules are synced into Discord's own native AutoMod/automod native sync— force a resync now (also happens automatically on Save and at boot)
Dashboard Test a message also uses the last saved bot config. Image Scanning is skipped by
Test a message and /automod test: both work on sample text, and Image Scanning matches
on the image itself. Use the Test an image tool on the Scam Images page instead (see below).
#Managing the scam-image blocklist
The Image Scanning rule's pHash blocklist is shared across every server and can only be
managed by a platform superuser, from the dashboard → Scam Images (/dashboard/scam-images,
not part of any per-guild dashboard). There is no Discord command for it. The page has its
own instructions, summarized here:
- Open Scam Images on the platform dashboard (superuser only).
- Add an entry either by:
- Uploading the scam image file directly, or
- Pasting a direct image URL, or
- Pasting a raw 16-character hex pHash if you already computed one elsewhere. Add a short label (e.g. "Fake MrBeast $500 giveaway template") so the automod hit log is readable later.
- The server computes (or accepts) the perceptual hash and adds it to the shared list. Every guild with Image Scanning enabled starts matching against it immediately (subject to the ~2 minute in-memory cache each bot process keeps).
- Remove an entry from the same page once it's stale or was added by mistake.
Add the original scam image, not a screenshot-of-a-screenshot. Extra recompression/cropping widens the fingerprint's distance from future reposts and can push real matches past the configured pHash max distance threshold.
#Test an image
The same page has a Test an image tool: upload a file or paste a URL and it runs the exact same hash-and-compare pipeline the live automod rule uses, then shows you the computed pHash and the distance to every blocklist entry, closest first, without posting anything in Discord or needing to check bot logs. Use it to confirm an entry you just added actually matches a repost, or to sanity-check a suspicious image before deciding whether to block it.
#How hits become cases
- A detector matches (unless the channel or role is ignored).
- A hit is stored in
automod_hits. - Recent hits in the rule’s window become a score (
hits × points). - The matching ladder step’s actions run (can be several at once).
- Case-creating actions call the infractions system and post case logs.
- An Automod moderation log entry is sent (rule log channel or server mod log).
Case metadata includes source: "automod", ruleId, hitCount, points, and score.
#Permissions
Base can_* flags — grant them to a Dreamliner Role on the dashboard's Roles page (or
/permissions role grant), see permissions.md:
can_status— check Automod statuscan_test— run Automod testscan_configure— configure Automod in Discord
#Migration
- Legacy automod (
enabled_rules, globalaction, etc.) is converted on config load. - Former Censor rules (
censor_rules+plugins.censor) are imported into Automod → Custom filters.