The architectural difference
playwright-stealth overrides navigator.webdriver, WebGLRenderingContext.prototype.getParameter, HTMLCanvasElement.toDataURL, and dozens of other native APIs by injecting JavaScript via Page.addInitScript. The patches work — until Kasada calls Function.prototype.toString.call(navigator.__lookupGetter__("webdriver")) and sees the JS source instead of [native code]. The patch becomes the signal.
PatchRight modifies the Playwright Python source to send the relevant CDP commands differently, or to use CDP commands that achieve the same effect without leaving JS artifacts. The native APIs are untouched; Function.toString() returns [native code] because no patch happened in JavaScript.
When PatchRight is the answer
Kasada-protected sites. This is the canonical use case. Kasada's detection of playwright-stealth is the reason PatchRight exists.
Cloudflare with active Turnstile/JS challenges. Where playwright-stealth used to work, increasingly Cloudflare detects it. PatchRight passes more often.
Any target where you have empirically confirmed playwright-stealth fails. PatchRight is a drop-in upgrade with minimal API changes.
For Akamai sensor.js scoring or canvas-fingerprint-heavy targets, CloakBrowser (Chromium) or Camoufox (Firefox) are usually a better fit because they patch the canvas/WebGL/audio layer too. PatchRight is specifically about the patch-detection surface, not the fingerprint surface.
What PatchRight does not address
PatchRight covers the toString-detectable surface in Playwright Python. It does not address:
- Canvas / WebGL / AudioContext fingerprinting — those are GPU and hardware signals. Use CloakBrowser or Camoufox.
- TLS fingerprinting — that is below the browser layer. The TLS your Chromium ships is what it ships.
- Behavioural detection — physics-based mouse movement, timing patterns. Pair with Botasaurus or a humanizer layer.
- IP reputation — that is the proxy's job. Use residential or ISP static.
Think of PatchRight as one layer in a stack, not a complete bypass.
