Lists updated monthly

Adlist‑Parser

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.

GitHub
Pi-hole AdGuard Home ABP Rules Hosts Format MIT License
0 Community Sources
0 Blocklist Entries
0 Plain Domains
0 Allowlist Entries

What Adlist-Parser does

A focused, stdlib-only Python tool that handles every DNS blocklist format in one async pipeline.

Multi-Format Parsing

Handles plain domains, hosts-file format (0.0.0.0 domain), ABP rules, Pi-hole regex, and wildcard patterns — all in one pass.

Dual Output

Generates a blocklist and an allowlist simultaneously, with correct normalization applied to each format independently.

Exception Handling

ABP @@|| exception rules are automatically separated from the blocklist and written to the allowlist — no manual sorting needed.

Deduplication & Sort

Case-insensitive, whitespace-trimmed deduplication and deterministic sorting across all 50+ sources in one step.

Fault Tolerance

Failed or unreachable sources are merged with the previous output — entries are never silently dropped due to a transient network error.

Auto-Updated

Output files are regenerated monthly via GitHub Actions and on every merge to main that touches the source lists in data/.

How it works

A four-stage async pipeline — heavy work is pushed off the event loop with up to 16 concurrent fetch workers.

Load Sources

Reads JSON config: 50+ remote URLs and optional local files.

Fetch & Normalize

Up to 16 concurrent workers; converts every format to canonical ABP or domain form.

Deduplicate & Sort

Case-insensitive dedup, merges with previous output for resilience against source failures.

Write Output

LF-only adlist.txt and whitelist.txt written with regenerated headers.

Getting started

No installation required. Paste the raw URL directly into your DNS blocker.

Add the blocklist

  1. Open the Pi-hole admin panel → Lists
  2. Paste the adlist URL below and click Add blocklist
  3. Go to Tools → Update Gravity to pull the new entries

Add the allowlist

  1. On the same Lists page, paste the whitelist URL below
  2. Click Add allowlist
  3. Go to Tools → Update Gravity to apply the allowlist

Subscription URLs

Adlist (blocklist)
https://media.githubusercontent.com/media/Toomas633/Adlist-Parser/refs/heads/main/output/adlist.txt
Whitelist (allowlist)
https://media.githubusercontent.com/media/Toomas633/Adlist-Parser/refs/heads/main/output/whitelist.txt

Add the blocklist

  1. Open AdGuard Home → Filters → DNS blocklists → Add blocklist → Add a custom list
  2. Enter a name, paste the adlist URL, and confirm

Add the allowlist

  1. Go to Filters → DNS allowlists → Add allowlist → Add a custom list
  2. Enter a name, paste the whitelist URL, and confirm

Subscription URLs

Adlist (blocklist)
https://media.githubusercontent.com/media/Toomas633/Adlist-Parser/refs/heads/main/output/adlist.txt
Whitelist (allowlist)
https://media.githubusercontent.com/media/Toomas633/Adlist-Parser/refs/heads/main/output/whitelist.txt

Frequently asked questions

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.

Copied!