Caps Spam
Flag messages that are mostly uppercase letters. A per-message shouting check that ignores emoji, digits, and punctuation.
Open AutoMod →Caps Spam fires when too high a fraction of a message's alphabetic characters are uppercase. It is the classic "stop shouting" rule — one ratio, one length floor, and the message either trips or it doesn't.
What is this?
A rule that fires when too much of a message is uppercase letters. Defaults to 70% caps over 8 alphabetic characters. Digits, punctuation, spaces, and emoji don't count toward the ratio, so a message like GG!!! won't trip.
Why you might want it
If you're tired of one-line all-caps rants drowning out actual discussion, this is the cheapest fix. No word list to maintain, no false positives on legitimate short caps like acronyms. Most servers pair it with a delete action and a short cooldown so the offender doesn't just keep shouting.
min_length and the uppercase share of those letters is strictly greater than max_percent.Why use this rule?
- Stops users who shout at the channel with sustained all-caps messages.
- Catches low-effort attention-grabbers that disrupt a conversation without being overtly hostile.
- Keeps announcements and help channels scannable — no screaming replies drowning out real questions.
- Cheap insurance — one ratio threshold covers the entire server without needing a word list.
What it detects
A single message where the uppercase share of alphabetic characters is above your threshold, and the message has enough letters to evaluate fairly. The evaluator counts only c.isalpha() characters, computes (upper / alpha) * 100, and fires when that percentage is strictly greater than max_percent.
matched_pattern = "100% caps". 26 alpha chars, all uppercase. Action: delete + warn.What it does NOT detect
- Messages with fewer alphabetic characters than
min_length— short bursts likeOK,LOL, orNO!!!are skipped by design. - Yelling via repetition (
stop stop stop stop) — that is the job of Duplicate Message and Spam Detection. - Emphasis inside embeds, bold formatting, or sticker names — only the raw message text is scanned.
- Non-cased scripts — Arabic, Hebrew, and CJK have no uppercase form, so they never contribute to the caps ratio.
- A single uppercase word buried in an otherwise-lowercase paragraph. The ratio averages over the whole message; one shouted word in 100 normal ones won't trip the rule.
Configuration
| Field | Type | Default | What it means |
|---|---|---|---|
| min_length | integer | 10 | Minimum alphabetic-character count before the rule evaluates at all. Messages with fewer letters are skipped entirely. |
| max_percent | integer (0–100) | 70 | The rule fires when the uppercase share of alphabetic characters is strictly greater than this percentage. |
Recommended starter settings
A balanced baseline for most community servers:
{
"min_length": 12,
"max_percent": 75
}Keep min_length at 10 or above so brief emphatic replies aren't flagged. A max_percent between 70 and 80 is the sweet spot — lower catches more shouting, higher tolerates common acronyms. Run in Log Only mode for a week before flipping to Live.
Common false positives
- Gamer-tag banter —
GG WP EZ MODOis 100% caps and culturally neutral in many communities. - Stacked acronyms —
AFAIK LOL IDK IMO TBH SMHcan push the ratio over the threshold even in normal chat. - Celebrating a single long word —
CONGRATULATIONSon its own is 15 alpha chars and 100% caps. - Emoji-heavy messages —
🔥🔥🔥🔥🔥 FIREevaluates onFIREonly, and FIRE is 100% caps. - Code snippets pasted inline —
ENUM_CONSTANTS, SQL keywords, or header filenames can skew a short message's ratio. - Brand names and product codes —
NASA,NATO, or a model number inside a short sentence drags the caps percent up.
How to test this rule safely
Set the rule to Log Only
Log Only records matches without deleting messages or issuing warnings. It is the right starting point for every AutoMod rule.
Start with the defaults
Leave min_length at 10 and max_percent at 70 so you can confirm the evaluator behaves as documented before tuning.
Post an obvious shout
In a private test channel, send THIS IS A LOUD TEST MESSAGE. Check the Event Log dashboard — you should see an entry with matched_pattern ≈ "100% caps".
Confirm a calm message does NOT fire
Post This is a normal message. No Event Log entry should appear — the caps ratio is well under 70%.
Confirm short shouts are skipped
Post NO! (only 2 alpha chars). No entry — the rule short-circuits below min_length.
Flip to Live
Restore your real thresholds and switch the rule from Log Only to Live.
Known current behavior
- Current behavior: messages below
min_lengthare always skipped. This is intentional — short emphatic replies likeOK,LOL, orNO!!!would otherwise register as 100% caps and flood the Event Log. - Current behavior: only alphabetic characters count. Digits, punctuation, spaces, and emoji are excluded from both sides of the ratio. A message like
🔥🔥🔥🔥🔥 FIREevaluates on the four letters ofFIREand trips easily because that substring is 100% caps. - Current behavior: acronyms and brand names drag the ratio upward. Words like
NASA,NATO, orLOLinside an otherwise-normal sentence are a common false-positive source. Raisingmin_lengthormax_percenthelps on servers where these are common. - Current behavior: unicode casing follows Python's
str.isupper()rules. Greek and Cyrillic uppercase count correctly, as do accented Latin letters likeÁÉÍÓÚ. Scripts without case (Arabic, Hebrew, CJK) never contribute, and edge cases like Germanßor Turkish dotlessıcan behave unexpectedly for non-English servers. - Current behavior: the threshold uses a strict greater-than comparison. Setting
max_percent = 70means 71% fires; exactly 70% does not. The cosmeticmatched_patternrounds the percent for display, so a match may show70% capseven though the real ratio was slightly higher. - Current behavior: allowlist words do not apply. Caps Spam is a volumetric trigger, so the rule's
allowlist_wordslist is ignored for caps counting — a user can't neutralise a SHOUTING message by including an allowlisted word.
Action reference
Caps Spam is usually the opening of a light enforcement ladder — a delete with a friendly reason text, or a warn that contributes to the auto-strike threshold if the user keeps shouting. Reserve mute or strike for repeat offenders via Spam Detection or a Strike System rule.
action_config field.