Docs/Plugins

Automod

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)

  1. Open the guild dashboard → Automod.
  2. Turn the plugin Enabled, then click Save in the sidebar (same as other plugins).
  3. Optionally apply a preset (Light / Standard / Strict). Presets update the editor only until you Save.
  4. Open Configure on any filter to set:
    1. Trigger — thresholds / custom words / blocked domains
    2. Actions — one or more actions on the first hit (delete, warn, timeout, kick, softban, tempban, ban, staff note)
    3. Escalation — extra steps after more points in a rolling window
    4. Exceptions — channels and roles this rule should skip
  5. Set server-wide ignores under Settings, then Save.

Changes in the Automod UI are not live until you press Save.

#Server settings

SettingWhat it does
Ignored channelsAutomod never runs in these channels (snowflake picker).
Ignored rolesMembers with any of these roles bypass Automod.
Log channelOptional channel for Automod hit logs. Falls back to the server moderation log channel.
DM members on warnDefault 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:

ActionNotes
Delete messageRemoves the offending message.
WarnCreates a warn case.
TimeoutDiscord timeout; set duration in minutes.
KickKicks the member.
SoftbanBan then unban; optional delete history days (0–7).
TempbanTemporary ban; set hours + optional delete history days.
BanPermanent ban; optional delete history days.
Staff noteInternal note case only.

If no punishment actions are selected, Automod only logs (optionally with delete).

Shared rule options:

OptionWhat it does
Points per hitEach trigger adds this many points toward escalation (default 1).
Case pointsOptional points stored on case metadata (defaults to points per hit).
Case reasonOptional reason override on created cases.
DM the memberNotify 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:

text
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

RuleDescription
ProfanityBuilt-in swear word pack
Slur detectionHate-speech / slur terms
Excessive swearingMany swears in one message
Custom filtersYour words, phrases, and regex (replaces Censor)

#Spam & noise

RuleDescription
SpamToo many messages in a short window
Emoji spamToo many emoji / emotes
Duplicate messagesSame user repeating the same message
CopypastaSame text pasted across the server
Sticker & GIF spamRapid stickers / GIFs
Attachment spamRapid file uploads
Newline spamExcessive line breaks
Wall of textExtremely long messages
Repeated charactersFloods like aaaaaaa
RuleDescription
Mass mentionsToo many unique user mentions
@everyone / @hereUnauthorized everyone/here pings
Invite linksDiscord invite links
Link spamToo many links, or blocked domains

#Presentation

RuleDescription
Excessive capsHigh % of capital letters
Zalgo / obfuscationAbuse of combining marks

#Image scanning

RuleDescription
Image scanningChecks 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

RuleDescription
Raid detectionBurst of member joins

#Presets

PresetIntent
LightFew rules, lenient thresholds, light punishments
StandardBalanced coverage for most servers
StrictMore 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:

  1. Open Scam Images on the platform dashboard (superuser only).
  2. 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.
  3. 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).
  4. 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

  1. A detector matches (unless the channel or role is ignored).
  2. A hit is stored in automod_hits.
  3. Recent hits in the rule’s window become a score (hits × points).
  4. The matching ladder step’s actions run (can be several at once).
  5. Case-creating actions call the infractions system and post case logs.
  6. 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 status
  • can_test — run Automod tests
  • can_configure — configure Automod in Discord

#Migration

  • Legacy automod (enabled_rules, global action, etc.) is converted on config load.
  • Former Censor rules (censor_rules + plugins.censor) are imported into Automod → Custom filters.