Your ad blocker is making sites challenge you
Not because blocking is suspicious, but because a blocked page and a scraped page look alike from inside the challenge script: resources that did not arrive, elements that vanished, and a document that no longer matches what the server sent.
You do not have to turn the blocker off. Adding the one site that keeps stopping you to its allow list is almost always enough, and everything else stays blocked. If you want the reason before you do it, the rest of this page is the mechanism.
A content blocker does three things, all of them before the site's own script gets to run. It cancels network requests matching its filter lists. It injects a stylesheet that hides elements matching its cosmetic rules. And, for some rules, it removes nodes from the document outright.
A challenge script that loads afterwards sees the result. Its own analytics endpoint returned nothing. An element it expected to measure has zero height. A script it queued never executed. Every one of those observations is also what a scraper's stripped-down page produces, and the challenge cannot tell the two apart from inside the page.
How this page detected it
By side effect, and only by side effect. This site never asks whether a particular extension is installed and never requests a chrome-extension:// resource — that would be probing you rather than observing what happened to the page.
Two observations are taken. First, an off-screen element 300 by 250 pixels carrying advertising class names is added to this document and measured; if a rule this page did not write has hidden it, something is applying cosmetic filtering. Second, a one-pixel image is requested from this site's own origin at an advertising-shaped path; if it does not arrive, something is cancelling requests by URL. Both are printed on your row with the result of each.
Which blocker settings cause challenges, and which don’t
Blocking is not one behaviour, and the parts of it differ enormously in how much of the page they disturb. Ordered from least to most disruptive to a challenge:
- Network blocking against the default lists. Requests to known advertising and tracking hosts are cancelled. This is what most people mean by an ad blocker, it is what the widely-used lists do, and on its own it is the most survivable setting here — a challenge rarely depends on a host those lists carry.
- Cosmetic filtering. A stylesheet is injected to hide elements the network layer could not stop. It changes the shape of the document rather than what arrived, and it is what makes an element a challenge wanted to measure report zero height.
- Scriptlet injection and “advanced” rules. Some lists patch page functions to neutralise anti-blocker detection. This is the setting most likely to collide, because patched functions are exactly what an automation-residue check looks for — it turns the blocker into the contradiction that check is designed to find.
- Blocking first-party scripts wholesale. A rule broad enough to catch the site's own code will also catch the challenge, and the challenge does not fail gracefully — it usually just never finishes.
The practical consequence: if you must keep something on, keep network blocking against the default lists and drop the aggressive extras. That ordering is the actual advice on this page, and it is more useful than “turn it off”.
How do I allow-list one site without losing protection?
Every mainstream blocker has a per-site control and it is usually one click from the page you are stuck on. Open the blocker's icon in the toolbar while you are on that site and look for a power symbol, a “pause on this site” switch, or a “trust this site” toggle. That setting is scoped to the site's domain and changes nothing anywhere else.
Two things people get wrong here and both waste a lot of time. First, allow-listing takes effect on the next load, so reload the page afterwards — a challenge already running keeps whatever it started with. Second, a challenge is frequently served from a different domain than the site you are looking at, so if allow-listing the site alone does not do it, that is why: the vendor's own domain is still being filtered.
Why does the site still challenge me after I paused the blocker?
Three ordinary reasons, in the order they turn out to be the one.
- Something else is still rewriting the page. Blockers are not the only extension that mutates a document before a site's script runs — see the section below.
- The blocker was never the top row. If your address is being scored, or your clock disagrees with your exit country, pausing the blocker changes nothing at all and the identical challenge returns. The ranked reading exists precisely so you stop changing settings that were never in the running.
- The challenge's pass could not be stored. A blocker that also blocks the vendor's storage leaves you passing and re-passing forever, which is the captcha loop and its own page.
What about Pi-hole and DNS-level blocking?
It has the same effect on a challenge as a browser blocker's network layer, arriving earlier and with less precision. A name that does not resolve produces a request that fails immediately, and if the failed name belongs to the challenge vendor, the challenge has no path to complete and no way to report why.
It is also the hardest of these to allow-list under pressure, because the control is on another device and is not scoped to the browser you are stuck in. If a household blocker is on your network and one site keeps failing, the fastest test is to put the machine on mobile data for one page load — if the challenge completes immediately, the resolver was the reason.
The narrower setting
You almost never have to choose between blocking and getting through. Every mainstream blocker has a per-site toggle, and adding the one site that keeps stopping you to its allow list costs you nothing anywhere else.
If that does not help, the next thing to try is your filter lists rather than the blocker itself. Default lists are widely tolerated. Aggressive lists — the ones that strip first-party scripts, rewrite the DOM, or block by generic pattern — change far more of the page, and they are what usually turns a survivable reading into a challenged one.
The other extensions
Blockers are only the most common example. Password-manager overlays, coupon injectors, translation overlays and dark-mode restylers all mutate the document root before the page's own script runs, and a CSS filter applied to the whole document is visible to any script that asks for a computed style. Your reading counts what appeared in this document that this page did not put there, and prints the number.
Coupon injectors are worth singling out, because they behave the most like the thing a checkout is defending against: they watch for a payment form, fill fields you did not fill, and submit on your behalf. A checkout that challenges you at exactly the moment you reach payment, every time, is worth testing with that category of extension disabled first.
Content blocker
A blocker is rewriting the page before the site's check can read it.
- Add the site that keeps challenging you to your blocker's allow list. Most blockers have a one-click toggle for the current site.
- Keep the blocker on everywhere else — you do not have to choose between blocking and getting through.
- If you use a custom or aggressive filter list, turn that list off first and leave the default lists on.
A row's place on your reading is one multiplication, and both halves of it are published. Neither half is a measurement.
- Surprisal −log₂ of an assumed probability of 0.3400 for “a content blocker is installed”
- 1.56 bits
- Challenge weight A content blocker rewriting the page — how much a bot check is judged to act on it
- 0.55
- Rank The product. It orders the rows and nothing else.
- 0.86
Why that assumption
Blocker installation is widely reported at roughly a third of desktop browsers in Western markets. Rounded hard, because the reported figures disagree with each other by more than the precision anyone quotes them to.
We think this one is probably wrong
This is the assumption most likely to be wrong for this site's actual visitors. Somebody arriving here has already been challenged repeatedly, which correlates with having a blocker — the population reading this page is not the population the prior describes.
Why that weight
Blockers remove elements, cancel requests and inject stylesheet rules at document start. The challenge script sees a page whose own resources did not arrive and whose DOM does not match what the server sent — which is also exactly what a scraper's page looks like.
We think this one is probably wrong
Probably too high for the mainstream blockers, which most vendors have long since learned to tolerate. It is more defensible for aggressive custom filter lists.
Every assumption, with its number → · Every weight, and what is deliberately not measured →
- The captcha comes back You solve it, the page reloads, and the same captcha is there again. Sometimes twice, sometimes forever.
- “Checking your browser” never finishes The interstitial sits there with its spinner. Eventually it reloads and starts again, or it gives up and shows an error.
- “Press and hold” keeps coming back You hold the button until it fills, the page reloads, and the button is there again. Sometimes it never fills at all.
Questions about the “Content blocker” row
- Does turning off my ad blocker stop captchas?
- It removes one contributor, and on a site whose challenge your lists were interfering with, that is often the whole thing. But it is a blunt version of a fix you can do precisely: allow-list the single site, reload, and keep the blocking everywhere else. If the challenge is really coming from your address or your VPN, turning the blocker off will change nothing and you will have given up the blocking for no return.
- Why does a website think I’m a bot when I have uBlock or AdGuard installed?
- Not because the blocker is recognised by name — it is not. What a challenge sees is a page that no longer matches what the server sent: requests that never completed, an element with no height where one was expected, a script that never ran. A scraper's page produces the same three observations, and from inside the page there is nothing to tell them apart.
- Which ad blocker settings are safest for sites with bot checks?
- Network blocking against the widely-used default lists disturbs a challenge least. Cosmetic filtering is next. The settings most likely to cause trouble are the advanced ones that patch page functions, and any custom rule broad enough to catch first-party scripts — a rule that catches the site's own code will catch the challenge too.
- I paused the blocker and the captcha is still there. What now?
- Reload first, because a challenge already in flight keeps the conditions it started under. If it persists, the challenge is probably served from the vendor's own domain rather than the site's, so allow-list that too. If it still persists, the blocker was not your top row and you are changing the wrong thing — read your browser and let the ranking say which row to work on.
- Does this site detect which extensions I have installed?
- No, and it refuses to on purpose. It adds one bait element to its own page and requests one image from its own origin, then reports whether each survived. That tells you a category — something is filtering cosmetically, something is cancelling requests — and nothing about which product is doing it. Asking your browser to enumerate your extensions in order to warn you about being profiled would be a strange way to run this site.
READ AT PRIOR TABLE ED. 1.0.0 · 2026-10-13 · ASSUMED, NOT MEASURED
The rank is taken against 15 written assumptions about how common each value is and 16 written weights about how much each one matters. 9 of them we think are probably wrong. Real counts from the browsers these sites have read appear beside a row, never inside its rank. Read the assumptions →
The rows you cannot fix from a settings page
A VPN you need for work, an address your ISP shares with a thousand other subscribers, a laptop with no graphics chip, a hardened profile that breaks the sites it was meant to protect — none of these have a checkbox. What is left is to present a reading that is internally consistent and ordinary on purpose, instead of one that is accidentally strange.
Donut Browser does that at the engine level: its Wayfern Chromium fork applies the fingerprint through CDP injection rather than patching JavaScript in the page, and it refuses to launch a profile whose proxy exit country, time zone and language contradict the profile's own fingerprint — which is the top row of most readings on this site. It is AGPL-3.0, it has no telemetry of any kind, and it runs on macOS, Windows and Linux.
Stated plainly: this site has no test results showing what any particular anti-bot service does with any particular browser, and neither does Donut Browser's own repository. What can be checked is the source, which is public.
Free · AGPL-3.0 · github.com/zhom/donutbrowser