
Built a custom Pi-hole master blocklist, host it on Synology Web Station, and scripted source-update comparisons
Today I worked with ChatGPT/Codex to consolidate my Pi-hole blocklists and compare them with what was actually getting through on my network.
I run two Pi-hole containers on separate Synology NAS devices. I host the combined blocklist as a TXT file on Synology Web Station, where both Pi-holes can retrieve it through its web address. That gives me one master file to review and maintain.
I combined downloaded copies of:
- Steven Black’s hosts list
- Zach’s advertising list
- OISD Big
- A YouTube-focused list
The feeds used different formats, so I normalized them, removed duplicate entries, and preserved the distinction between exact domains and rules covering subdomains.
I also created a Python script to repeat the process when the original sources change. It downloads the feeds, saves source snapshots and checksums, applies my custom entries and service exclusions, and reports additions and removals compared with the previous build. It produces a candidate list and an audit report for review before I upload the replacement TXT to Web Station.
Then, using ChatGPT, I analyzed my Pi-hole query database: roughly 1.99 million queries, spanning August 29 through October 3, 2026. We extracted 8,695 unique domains that had at least one allowed query.
From those, I classified 870 exact hostnames as advertising, ad measurement, or behavioral tracking. 699 were already covered; 171 added coverage. I also retained my earlier custom entries and reviewed domains shown in screenshots from an online ad-blocking test.
My biggest requirement: don’t break Plex, Roon, or WeChat. I excluded their service-domain families and preserved feature-flag services such as Statsig. The comparison caught six inherited rules that conflicted with those protections.
The final merged file contains 458,293 rules. I also have the deduplicated allowed-domain list and a CSV showing query counts and classification reasons.
There are limits: historical allowed queries don’t prove a domain is still getting through today. Classification was based on service families and endpoint roles, rather than independently investigating every hostname. The YouTube feed also deserves caution because blocking video-delivery hosts can affect playback.
The workflow now is: download sources → build and compare → review changes → upload to Web Station → update Gravity on both Pi-holes.
Anyone else maintaining a self-hosted master list this way? How do you review source changes and catch false positives before deploying them?