Chat Filter (Veritédoux)¶
Veritédoux is Verité's chat filter. It reads every message a player sends and decides whether that message should reach the rest of the server. When a message breaks a rule, Verité stops it before anyone else sees it and tells the sender their message was not delivered.
The filter runs automatically once Verité is installed. On standard Minecraft chat there is nothing to set up. If your server uses a plugin that intercepts or restyles chat itself, see Custom Chat Integration so messages still pass through the filter.
This page explains what the filter catches and how its main parts work. For the exact config keys and their defaults, see the Configuration Reference.
What the filter catches¶
Every message is sorted into one of these outcomes:
| Outcome | Meaning |
|---|---|
| Clean | The message is allowed and delivered normally. |
| Blocked | Ordinary rule-breaking content. The message is dropped and the sender sees the block notice. |
| Profanity | Swearing, judged per language and dialect. Disabled by default so servers that permit casual swearing are unaffected. |
| Abuse | Content aimed at harming or targeting another person. |
| Self-harm | Content that may relate to suicide or self-harm. Handled with care, not as a punishable offense. See Self-harm content. |
When a message is stopped, only the sender is notified. The message is simply not delivered to anyone else. Verité never mutes, kicks, or bans a player on its own for a filtered message. Deciding what to do with a flagged player is left to your staff and your moderation rules.
The block notice and the repeat notice are configurable. See chat.filter.block.message and chat.filter.repeat.message in the Configuration Reference.
Supported languages¶
Verité checks content in six languages:
- English
- Spanish
- French
- Portuguese
- German
- Italian
Each language can be turned on or off independently, and within each language you choose which categories run: self-harm detection, abuse detection, slur detection, and profanity. Profanity is off by default for every language.
Spanish, French, and Portuguese also support regional dialects, so profanity is judged against the right regional wordlist rather than a single generic list. Spanish covers varieties such as Spain, Mexican, Argentinian, Chilean, Colombian, and more; French covers France and Canadian; Portuguese covers European and Brazilian. These regional toggles live under each language in the config.
Verité works out which language each part of a message is written in, so a slur is judged by the language of the words around it. This matters on mixed-language servers where a single message can switch languages partway through.
Language coverage today
Detection is strongest in English. The other languages are supported and can be enabled, but English receives the most complete coverage.
Messages in other languages¶
Two special settings decide what happens to text outside the supported set:
unknown.lang: a message written in a language Verité recognizes as unsupported.undeterminable: a message whose language cannot be worked out (for example, very short messages or pure symbols).
Both are allowed by default. If you would rather block anything the filter cannot content-check, you can enable block.unsupported.languages in the advanced section. With it on, messages in a language Verité does not yet support are blocked.
Getting past evasion¶
Players who want to slip banned content past a filter often disguise it. Veritédoux normalizes a message before matching so common tricks do not work. Each of these passes can be toggled in the config, and all are on by default.
| Trick | What it looks like | How Verité handles it |
|---|---|---|
| Homoglyphs | Cyrillic, full-width, or math-bold letters that look like normal ones | Folded back to plain letters before matching |
| Entities | HTML-style character codes standing in for letters | Decoded to the letters they represent |
| Obfuscation | e!v!i!l or spaced-out letters |
Repaired back into the real word |
| Segmentation | Words glued together with no spaces | Split back into real words |
| Fingerprinting | Transposed letters, such as swapping two letters in a slur | Matched by letter fingerprint |
The letter-fingerprint pass only applies to words of at least six letters, and it steps aside for words a language legitimately allows, so ordinary words that happen to rearrange into something else are not caught.
Decorative unicode fonts are handled separately. Turning on keep.chat.readable blocks messages written mostly in fancy fonts that render but make chat hard to read. Emoji are not affected by this setting.
Symbols and emoji¶
Some content is not words at all: banned symbols, or emoji arranged to spell something out. Verité runs a second pass over the symbols and emoji in a message, checking single symbols, repeated symbols, and ordered or mirrored emoji combinations. This catches symbol content that a word-based check would skip over. Plain text is left to the language checks.
Repeat and spam detection¶
Repeated messages¶
Repeat detection stops a player from flooding chat with the same or nearly the same message. It is off by default and enabled with block.repeat.messages.
When enabled, Verité remembers a player's recent messages and compares each new message against them:
- Exact repeats are caught even when disguised. Comparison ignores case, accents, and repeated letters, so
HELLO,hello, andhellloall count as the same message. - Near repeats are caught when a new message is similar enough to a recent one, even if not identical. How close counts as a match is set by
block.repeat.similarity.threshold(a value from 0 to 1, where 1 means identical).
You control how many recent messages are remembered (block.repeat.history.size) and how far back in time a message still counts as a repeat (block.repeat.window.ms). A blocked repeat shows the repeat notice rather than the ordinary block notice. See the Configuration Reference for every repeat key.
History and busy servers
Setting both the history size and the time window to unlimited means a player's remembered history keeps growing. On a busy server, keep at least one of the two bounded.
Spam and advertisements¶
Spam detection uses Verité's tokenizer to spot messages that read like scams or advertisements and block them before players see them. It is off by default and enabled with block.possible.spam.
This check is opt-in because no spam detector is perfect. It can miss a brand-new scam, and it can occasionally flag a legitimate message that happens to sound heavily promotional. When enabled it uses a dedicated scam model where available, and falls back to a lighter check otherwise.
Self-harm content¶
Self-harm detection exists to protect people, not to punish them. When a message is caught as self-harm content, Verité does two things:
- The message is not delivered to the rest of the server.
- The sender receives a fixed support notice in English.
The support notice tells the sender their message was not sent, notes that they can rephrase and try again if it was a mistake, offers non-judgemental encouragement to reach out to someone they trust or a local crisis service, advises contacting emergency services if there is immediate risk, and links an international directory of crisis resources at findahelpline.com.
This is a safety feature, not a moderation offense
Self-harm and abuse are reported separately from ordinary rule-breaking precisely so they can be handled differently. We strongly recommend against automatically punishing a player for a self-harm message. Treat it as a wellbeing signal, not a chat violation.
The self-harm notice cannot be changed
Unlike the ordinary block notice, the self-harm support message is fixed and not configurable. This keeps the crisis guidance accurate and complete. The notice is always delivered in English so that the wording stays reliable for everyone.
Self-harm detection is enabled per language through self.harm.detection, which is on by default for every supported language.
Configuring the filter¶
Every setting described here lives in the chat.filter section of config.yml. Many keys can be read and changed from in game with /veriteflag. For the full list of keys, defaults, and which ones /veriteflag can edit, see the Configuration Reference.
For developers¶
If you are building an integration, a custom chat system, or a Skript that needs to run text through the filter, see:
- Custom Chat Integration for wiring the filter into a plugin that handles chat itself.
- Developer API for the public filter API.
- Skript Integration for the Skript syntax.