Word lists
DaisyFilter ships verified rule packs and copies reference files into
plugins/DaisyFilter/lists/ on first run. The pinned CSV inside the plugin JAR is
the runtime baseline; deleting or damaging a reference copy cannot disable it.
Rule sources
Section titled “Rule sources”Rules are kept separate by source and never merged ambiguously:
- GamerSafer — an imported, attributed third-party list (see below).
- Master list — a merged, multilingual word list (English plus Spanish, Portuguese, French, German, Italian, and Russian) built from openly-licensed sources and deduplicated against GamerSafer at build time. See Master list below.
- Daisy defaults — DaisyFilter’s reviewed core-safety pack, active before asynchronous third-party loading starts.
- Runtime overrides — disabled rules and exceptions written by the GUI.
Each rule has a stable ID, one or more categories, a severity (1–5), a match mode, the normalized forms it applies to, the surfaces it applies to, and optional action overrides.
GamerSafer attribution
Section titled “GamerSafer attribution”DaisyFilter bundles a pinned snapshot of the MIT-licensed GamerSafer word list at
commit d426da8da414892e0efee0381f0480220182df09, including its LICENSE,
README, and source manifest with file checksums. GamerSafer remains attributed
under its own licence; DaisyFilter itself is proprietary.
Rule IDs are salted hashes of the normalized entries. No source term is ever
printed in status output, logs, masked previews, or rule IDs. The versioned
default-unclassified overlay gives every upstream-uncategorized row an explicit
strict censor policy; reviewed severe and ambiguous exceptions override that fallback.
Master list
Section titled “Master list”The master list broadens coverage beyond the English-centric GamerSafer set with multilingual profanity (Spanish, Portuguese, French, German, Italian, Russian). It is generated at build time by the list curator, which merges openly-licensed sources, normalizes and deduplicates them (including against GamerSafer so nothing is redundant), and writes a pinned, checksum-verified CSV bundled in the JAR. Flat sources carry no per-word category, so each entry is tagged swearing (censor) — a safe default; the curated core and structural rules still block the severe slurs.
Sources and their licences are recorded in the bundled NOTICE file (LDNOOBW under
CC BY 4.0, GamerSafer and bad-words under MIT). To regenerate after updating the
gitignored tools/list-curator/sources/:
list-curator masterlist # rebuild filter-lists/master/master-list.csv (+ SHA-256)list-curator confusables # rebuild the Unicode confusables mapAfter regenerating, update the pinned MASTER_LIST_SHA256 in DefaultRules to the
printed checksum.
Reviewing GamerSafer into the overlay
Section titled “Reviewing GamerSafer into the overlay”Most GamerSafer rows arrive uncategorized. The strict fallback prevents those rows
from silently broadcasting while the development-only list curator records
individual exceptions through the
daisy-category-overlay.yml, which is keyed by hashed ids and therefore safe to
commit (it never contains source terms):
# coverage report (no terms shown)list-curator stats
# write the rows still needing a decision (ids only; add --reveal to include terms# into a worksheet under the gitignored exports/)list-curator worksheet exports/worksheet.csv --reveal
# after filling in category/severity/disposition, merge decisions into the overlaylist-curator apply exports/worksheet.csvThe plugin loads the overlay on startup and reload and applies each decision to the matching rule. The coverage command treats the explicit fallback as a decision and must report 100%.
Customising
Section titled “Customising”Do not edit the copied GamerSafer CSV to change runtime policy; it is an attributed
reference copy. Use the hashed daisy-category-overlay.yml to review imported rows,
and allowlist.yml for benign exceptions. Invalid decisions are reported using only
their opaque rule ID.
Server owners can add RE2/J-safe regular expressions and literals in
custom-rules.yml. Invalid entries are rejected during reload without replacing the
previous valid rule snapshot.
Built-in safety patterns
Section titled “Built-in safety patterns”Beyond word lists, DaisyFilter ships structural detection rules that run against the
raw message (so dots, slashes, and @ are preserved):
- URLs and
www.links, and bare domains on common TLDs — blocked by default. - IPv4 addresses — blocked. Any dotted-quad literal is treated as an address (the filter
cannot tell a server IP from a four-part version number), so allowlist your own
server/LAN addresses under
allowlist.yml→domainsif you reference them in chat. - Discord invites (
discord.gg/...,discord.com/invite/...) — blocked. - Email-like and international phone-like patterns — monitored and alerted only (advisory “potential personal information,” never auto-punished).
Add permitted hosts to allowlist.yml → domains. These patterns are precise by
construction and treated as high-confidence; tune category dispositions in
categories.yml.
Match modes and forms
Section titled “Match modes and forms”Short entries use exact token matching to avoid accidental substring hits. Strict matching (leetspeak, confusables, invisible-character removal) is enabled only for curated rules. See categories.md for severities and dispositions.