Skip to content

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.

CategorySeverityDispositionEffects
swearing2Censorwarn, log
nsfw4Blockwarn, alert, log
hate5Blockwarn, alert, log
harassment3Blockwarn, log
safety-risk5Blockwarn, alert, log
grooming4Monitoralert, log
self-harm4Monitoralert, log
links2Blockwarn, log
spam2Blockwarn, log
personal-info3Monitoralert, log
contextual2Monitoralert, log
unsafe-language2Censorwarn, log

Tune these in categories.yml.

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 tagged safety-risk and 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.ymlself-harm-response). Telling another player to self-harm (“kys”) is separate: it is harassment and 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.

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.

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.

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.

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.ymlconfidence):

Combined probabilityStrongest 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-thresholdAllow (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.