The privacy test built into the Wisp browser. One screen, speed-test style: how much of the ad/tracker surface does your blocker actually catch?
The page runs three families of checks against your browser, blocker extension, DNS filter, or VPN. No real ads load and no trackers activate; everything is bait.
| Check | How | What it measures |
|---|---|---|
| Host blocking (127 hosts) | HEAD probe to known ad/analytics/tracker/OEM hostnames |
Domain-level blocking (DNS filters, hosts files, filter lists) |
| Cosmetic filter (2) | Bait elements with ad-classnames, measured for hiding | Generic element-hiding capability |
| Ad script loading (2) | Same-origin bait scripts named like ad SDKs | Path-pattern script blocking |
Results render as a liquid gauge plus a live tile per category. Click a tile for the per-host breakdown; results history, logs, and settings live in the footer.
A probe ends in one of three states, not two:
- Blocked: the request errored (filter list, DNS hole), or it was answered locally in under 5 ms with zero bytes transferred, which is the signature of a redirect-style rule (uBO
redirect=) neutering the request. - Not blocked: a real network response came back.
- Unreachable: the host never answered before the timeout. These are excluded from the percentage; a dead domain or a slow network is not your blocker's achievement. They show gray in the breakdown.
Known limits, on purpose:
HEAD /fakepage.htmlexercises domain-level rules. Path-pattern filters (*/pagead/*and friends) won't match it; the two script checks cover that gap narrowly.- Cosmetic and script checks only fire if your blocker applies generic rules on unknown domains. Failing them doesn't mean those features are broken elsewhere (the FAQ on the page explains the rules to add).
- A score is a snapshot of one network, one moment. Re-test before drawing conclusions.
Dead bait domains silently inflate everyone's score, so a weekly GitHub Action probes every host twice from a clean runner and opens a pruning PR when domains die (src/script/check_hosts.mjs). Timeouts are flagged but never auto-pruned.
The host list also ships as blocklist files: d3host.txt (hosts format) and d3host.adblock (adblock format), regenerated from adblock_data.json via npm run build-list.
This page is designed to be served at wisp://privacy-test inside the Wisp browser (URL rewrite with a virtual URL, the chrome://newtab mechanism). Every asset path is relative and there are zero third-party requests at rest: fonts are self-hosted, no analytics, no sponsor scripts. The page behaves identically from GitHub Pages, a local server, or a browser-internal scheme, and never trips the very blockers it measures.
npm ci
npm run dev # local dev server
npm run build # production build -> dist/
npm run purge # strip unused CSS from dist/
npm run build-list # regenerate d3host.* from adblock_data.json
node src/script/check_hosts.mjs # liveness report
node src/script/check_hosts.mjs --prune # also prune confirmed-dead hostsPushing to master deploys to GitHub Pages via deploy.yml.
This repository is an independent continuation of Turtlecute33/adblocktest, itself a fork of d3ward/toolz. It was detached from the fork network in June 2026 and is maintained by Wisp as part of the Wisp browser project; it is not affiliated with or endorsed by the original authors.
The original work and its design belong to the OG creators: d3ward, Turtlecute, and Daniela Brozzoni. Wisp's changes on top: one-screen redesign, three-state scoring, redirect-defusal detection, list liveness CI, rebrand.
The adopted history is squashed into a single import commit; the complete original history, with every contributor's commits intact, lives on the upstream-history tag and in the upstream repository.
Licensed under CC BY-NC-SA 4.0, as inherited from upstream: attribution preserved, non-commercial, share-alike.
This project stands on the shoulders of the people who built toolz and adblocktest. Thank you.
![]() d3ward created toolz, the original test |
![]() Turtlecute authored & maintained adblocktest |
![]() Daniela Brozzoni core contributor |
hagezi |
fanboynz |
TheMonDon |
Chon Bongo |
…and Federico Pedemonte, raizo, GregT, Dustin, CoderMonkey1956 — every original commit preserved on the upstream-history tag.


