Why websites blocked the KISS browser, and what changed

Task history analysed from ~/.kiss/sorcar.db (8.4 million events, 24,146 tasks). Work done 20 September 2026 on the GCP host koushik-sorcar.

The browser tool that KISS agents use to read web pages was being turned away by a growing number of sites. This report explains which sites did it and why, what was changed so the browser is treated like a person's Chrome, the measured effect, and what is deliberately not done.

1. What the task history shows

Every result the browser tools (go_to_url, click, get_page_content) returned was scanned for the signatures of bot-protection pages. 95 distinct hosts served one. Grouped by the vendor behind the page:

Vendor and pageHosts (blocked page loads)
Google /sorry/ "unusual traffic from your computer network"google.com (68)
Cloudflare managed challenge "Just a moment… Performing security verification"stackoverflow.com (35), dl.acm.org (14), npmjs.com (5), docs.vllm.ai (4), superuser, math.stackexchange, askubuntu, readthedocs sites, congress.gov, science.org, sloan.org, biorxiv, sagepub, aps.org, anthropic.com, cppreference, cryptography.io, and more
Cloudflare hard block "Sorry, you have been blocked"medium.com (4), acm.org, oddschecker, usfunds, coursehero, physicsforums, obd-codes, modelcontextprotocol.io
Cloudflare Turnstile (OpenAI family)openai.com (6), platform/help.openai.com, chatgpt.com, bbb.org
Akamai "Access Denied … errors.edgesuite.net"carmax.com (4), costco.com
Anubis proof-of-work "Making sure you're not a bot"dblp.org (5), wiki.archlinux.org, gitlab.kitware.com, safereddit
Imperva Incapsula "Request unsuccessful"cato.org, bizfileonline.sos.ca.gov
PerimeterX "Robot or human? Press and hold"walmart.com
Search-engine CAPTCHAssearch.brave.com, startpage.com, ecosia.org, mojeek.com
Otherssciencedirect "Are you a robot?", researchgate "Security check required", pmc.ncbi reCAPTCHA, scribd, arxiv HTML 403

Two things stand out. First, Cloudflare accounts for most of the hosts, and most of those are the silent managed challenge: a page that checks the browser with JavaScript and reloads the real content on its own when the browser looks like a person's. Second, Google is different in kind: its page says so itself, "if a network you use … seems to be sending automated traffic", and Google Cloud address space is such a network.

2. Why the browser stood out

The old configuration launched the open-source Chromium build through Playwright in headless mode, with a hard-coded Los Angeles timezone, a Retina scale factor of 2 on a Linux server, a JavaScript override of navigator.userAgent, and clicks that teleported the pointer onto the target. Each of these is visible to a page, and detection vendors score them in layers:

Network: cloud egress IP, ASN Google /sorry, part of every score Driver: CDP Runtime.enable leak Cloudflare heuristics engine → score 1 Browser: headless, no WebGL, Chromium brand, emulated TZ/DPR Behaviour: teleporting pointer, metronome typing, instant scroll Not fixable in the browser. Google searches that hit /sorry are re-run on Bing; other IP-based blocks are reported plainly instead of retried. Patchright: a patched Playwright driver that never sends Runtime.enable or Console.enable and drops --enable-automation. Headed Chromium on a private Xvfb display; --ignore-gpu-blocklist gives WebGL via Mesa llvmpipe; real timezone/scale; Chrome channel when installed. Curved pointer paths, 45-140 ms held presses, per-word typing cadence, uneven wheel notches, idle drift while a challenge runs.
Figure 1. The four layers a bot-protection vendor scores, and what the change does at each layer. The network layer is the one no browser setting can alter.

The single most important finding came late. On an X server without a GPU, Chromium puts its graphics stack on a blocklist and ships no WebGL at all. Practically every human browser has WebGL, and challenge scripts test for it first. With the browser otherwise fixed, six publisher sites (ACM, Science, ScienceDirect, Sage, cppreference, ResearchGate) still showed Cloudflare's "Verify you are human" checkbox, and pressing it was accepted by the widget but rejected by the verdict every time. One flag, --ignore-gpu-blocklist, lets Chromium render WebGL through Mesa's software renderer, which reports itself as ANGLE (Mesa, llvmpipe …), exactly what a Linux desktop without a GPU reports. After that, all six cleared.

3. Measured effect

Fourteen URLs from the blocked list were used as a development set during the work. A second set of fourteen hosts from the same list, never probed during development, served as a held-out check. All runs used fresh browser profiles from the same GCP machine.

0 5 10 14 Old tool: Playwright, headless Chromium 4 / 14 Patchright, still headless 6 / 14 Playwright, headed on Xvfb 7 / 14 Patchright, headed on Xvfb 11 / 14 + human input, challenge wait, Turnstile 10 / 14 (Turnstile rejected) + WebGL (--ignore-gpu-blocklist): final 13 / 14 Held-out set of 14 other blocked hosts, final tool 14 / 14 load
Figure 2. Pages served as normal content out of 14 previously blocked URLs, per configuration, measured with tmp/probe_blocks.py and tmp/probe_tool.py. The one remaining development-set miss is Google's /sorry/ page; the tool now answers that query on Bing. On the held-out set every host loads; ResearchGate clears Cloudflare and then serves its own HTTP 403 to datacenter addresses.

The intermediate row "10 / 14 (Turnstile rejected)" is worth a sentence: it was lower than the row above only because the six publisher sites were now reached far enough to show the checkbox, and the checkbox verdict failed on the missing WebGL. That is what pointed to the graphics blocklist.

4. What changed in the code

New module src/kiss/agents/sorcar/web_stealth.py

Changes in src/kiss/agents/sorcar/web_use_tool.py

Note: www.science.org answered with a bot-protection page (Cloudflare challenge) that did not
clear within 12s. Call show_browser() so the user can complete the check, or use another source
for the same information.

Note: Google answered with its 'unusual traffic' page. It rates this network's IP address as
automated traffic, which no browser setting changes, so the same query was opened on Bing instead.

Tests

src/kiss/tests/agents/sorcar/test_web_stealth.py holds 24 end-to-end tests that drive a real Chromium against a local HTTP server: engine and display selection (including reading DISPLAY from the browser's /proc/<pid>/environ), fingerprint properties, the curved click path and held button, typing cadence, wheel notches, all fallback paths, Cloudflare-style challenges that clear and that do not, a routed Turnstile widget, vendor recognition with benign-text negatives, the Google-to-Bing mapping, Xvfb restart hygiene (descriptor count and atexit callbacks constant; descriptor exhaustion handled), and a live load of journals.sagepub.com. web_stealth.py has 100 % branch coverage; the 254 existing tests that touch the browser tool still pass.

5. What is deliberately not done

The tool presses exactly one thing on the user's behalf: Cloudflare's "Verify you are human" checkbox, which is a single affirmation, not a puzzle. It does not solve reCAPTCHA or hCaptcha images, does not perform PerimeterX press-and-hold, does not use third-party solving services, and does not try to get past Akamai, Imperva or Cloudflare hard blocks. Those pages are reported with a Note: so the agent can hand the browser to the user through show_browser(). Google's /sorry/ page is an address-reputation decision about the Google Cloud network this machine sits on; the only honest fix is a different network, so the tool re-runs the query on Bing.

6. Things to know when running it

Sources consulted