Hagezi retired domains/*.txt, so the default build was silently getting a 404
and producing a StevenBlack-only list (~53k instead of ~140k). Switched to
wildcard/light-onlydomains.txt (and ultimate-onlydomains.txt in the docs).
Wildcard lists omit subdomains the firmware's parent-suffix matching already
covers: the default is now ~100k entries / 0.5 MB, and it still blocks 212/212
of a sample taken from the previous 141k list.
A source that can't be read now aborts the build (--allow-missing to
continue) instead of quietly shrinking the list.
Parse AdGuard/Adblock basic rules (#8): ||domain^ blocks, @@||domain^ removes
a domain; regex/wildcard/$modifier/cosmetic rules are skipped and counted
instead of being hashed as junk literals. README documents input formats.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Hc862kZw1rjutovbSxxFaY
StevenBlack base + Hagezi Light (~140k domains) instead of the aggressive
StevenBlack-everything + Hagezi Ultimate (~537k) which blocked WhatsApp/social.
Document the aggressive build as an opt-in.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Stores the blocklist as sorted 64-bit FNV-1a hashes in flash (LittleFS) and
binary-searches them — 130k+ domains in ~1MB flash, ~40KB RAM. UDP DNS server
answers 0.0.0.0 for blocked domains and forwards the rest upstream.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>