Categories and policy
Each rule belongs to one or more categories. A category defines a default severity (1–5), a disposition, and a set of effects.
Defaults
Section titled “Defaults”| Category | Severity | Disposition | Effects |
|---|---|---|---|
swearing | 2 | Censor | warn, log |
nsfw | 4 | Block | warn, alert, log |
hate | 5 | Block | warn, alert, log |
harassment | 3 | Block | warn, log |
safety-risk | 5 | Block | warn, alert, log |
grooming | 4 | Monitor | alert, log |
self-harm | 4 | Monitor | alert, log |
links | 2 | Block | warn, log |
spam | 2 | Block | warn, log |
personal-info | 3 | Monitor | alert, log |
contextual | 2 | Monitor | alert, log |
unsafe-language | 2 | Censor | warn, log |
Tune these in categories.yml.
Child-safety detection
Section titled “Child-safety detection”DaisyFilter ships built-in, always-on rules aimed at protecting younger players, independent of the bundled word lists:
personal-info— age, address/school, phone, email, and social-handle solicitation or sharing (e.g. “how old are you”, “what’s your snap”, “add me on discord”, “my snap is …”). Default monitor + staff alert: it never disrupts normal chat, it just flags every hit for review.grooming— predatory conversational patterns. Ambiguous signals (“are you home alone”, “can we meet in person”, “send me a pic”, “let’s talk on snapchat”, “I’ll give you free robux”, “you’re mature for your age”) are monitor + alert, while unambiguous predatory language — real-world meetups (“send me your address”), cover-ups (“delete these messages”), secrecy (“don’t tell your parents”), and sextortion (“send pics or I’ll leak”) — is also taggedsafety-riskand blocked.self-harm— a player expressing suicidal or self-harm intent (“I want to die”, “kms”, “I feel suicidal”). Never blocked — silencing a child reaching out is harmful. The message is flagged to staff and the player is sent a private, supportive message with a crisis line (messages.yml→self-harm-response). Telling another player to self-harm (“kys”) is separate: it isharassmentand blocked.
For a strict child server you can raise personal-info (and grooming) to
CENSOR or BLOCK in categories.yml so the information is hidden from chat, not
just reported. Add server-specific phrases in custom-rules.yml.
Multilingual coverage
Section titled “Multilingual coverage”Beyond the English word lists, DaisyFilter ships built-in profanity, slurs, and
grooming patterns for Spanish, Portuguese, French, and German (the most common
non-English languages on MC servers). Ordinary profanity censors, severe slurs map
to hate and block, and age/photo solicitation maps to personal-info and alerts
staff. Add more languages or terms in custom-rules.yml.
Disposition vs. effects
Section titled “Disposition vs. effects”DaisyFilter separates the disposition (what happens to the content) from the effects (side actions), so configuration can never request contradictory outcomes.
- Dispositions:
ALLOW,MONITOR,CENSOR,BLOCK. - Effects:
WARN,ALERT_STAFF,LOG,TEMP_MUTE,KICK,RUN_COMMAND.
Precedence and scoring
Section titled “Precedence and scoring”When several rules or heuristics match one message:
BLOCK > CENSOR > MONITOR > ALLOW- The result severity is the highest matched severity.
- The result score sums distinct category/heuristic weights up to a cap, so repeated matches in one message cannot inflate escalation without bound.
Global monitor-only mode forces every non-allow result to MONITOR, suppressing
punishment actions while keeping logging and alerts.
Confidence gating (precision)
Section titled “Confidence gating (precision)”To keep false positives low in production, DaisyFilter does not act on a raw match — it computes a confidence (probability the message is a genuine violation) and gates the disposition by it.
Each match scores higher when:
- the matched term is longer (short fragments are riskier),
- it is a whole-word match rather than a substring,
- it appears in a less-transformed normalized form.
Independent matches combine with a noisy-OR, so several weak signals can still add
up while repetition of one signal cannot. The combined probability then caps the
disposition (config.yml → confidence):
| Combined probability | Strongest action |
|---|---|
≥ block-threshold (0.80) | the rule’s disposition, up to Block |
≥ censor-threshold (0.55) | capped at Censor |
≥ monitor-threshold (0.30) | capped at Monitor (logged/alerted, never punished) |
below monitor-threshold | Allow (ignored) |
Matches below noise-floor (0.30) are dropped entirely as coincidental noise.
Lower the thresholds to catch more (and risk more false flags); raise them to act
only on near-certain violations. /daisyfilter test <message> shows the resulting
confidence so you can tune against real examples. This pairs with whole-word
matching and the allowlist, which remove the classic substring false positives.