Fetches and merges 50+ community adlists into two normalized output files for DNS blockers like Pi-hole and AdGuard Home. Just subscribe to the raw URLs — no setup required.
A focused, stdlib-only Python tool that handles every DNS blocklist format in one async pipeline.
Handles plain domains, hosts-file format (0.0.0.0 domain), ABP rules, Pi-hole regex, and wildcard patterns — all in one pass.
Generates a blocklist and an allowlist simultaneously, with correct normalization applied to each format independently.
ABP @@|| exception rules are automatically separated from
the blocklist and written to the allowlist — no manual sorting needed.
Case-insensitive, whitespace-trimmed deduplication and deterministic sorting across all 50+ sources in one step.
Failed or unreachable sources are merged with the previous output — entries are never silently dropped due to a transient network error.
Output files are regenerated monthly via GitHub Actions and on every
merge to main that touches the source lists in data/.
A four-stage async pipeline — heavy work is pushed off the event loop with up to 16 concurrent fetch workers.
Reads JSON config: 50+ remote URLs and optional local files.
Up to 16 concurrent workers; converts every format to canonical ABP or domain form.
Case-insensitive dedup, merges with previous output for resilience against source failures.
LF-only adlist.txt and whitelist.txt written
with regenerated headers.
No installation required. Paste the raw URL directly into your DNS blocker.
Add the blocklist
Add the allowlist
Subscription URLs
Add the blocklist
Add the allowlist
Subscription URLs
Answers to the most common questions about output format, update schedule, and filtering behaviour.
Wildcard and regex sources produce ABP-style rules such as
||*.tracking.net^. Both Pi-hole (via gravity) and
AdGuard Home understand ABP rules natively, so no conversion is
needed at your end. Plain domains and ABP rules coexist in the same
output file and are both fully supported.
This tool targets DNS-level blocking only. Element-hiding rules are browser cosmetic filters and have no effect at the DNS layer — they are intentionally dropped during normalization to keep the output clean and DNS-blocker-compatible.
Only simple anchored Pi-hole patterns like
(^|\.)domain\.com$ are converted to equivalent ABP
rules. Complex or JavaScript-style regex cannot be safely expressed
as a DNS rule and is discarded to keep the output safe and
deterministic. This is intentional and conservative by design.
The output files are regenerated automatically on a monthly schedule
(1st of each month at 03:00 UTC) via GitHub Actions, and also
whenever changes to the source lists in data/ are
merged into the main branch. Check the header comment in the raw
file for the exact last-update timestamp.