cdpfleet Docs GitHub Dashboard

Compare / browsers

Patchright vs Rebrowser

Two stealth-patched Chromium builds that look the same to a site — same TLS and HTTP/2 fingerprints, no webdriver, no Runtime.enable leak — but Patchright is Chromium 148 on today's Playwright, and Rebrowser is Chromium 136 pinned to Playwright 1.52.

Patchright Rebrowser

Patchright and Rebrowser solve the same problem — Playwright's own automation tells — in the same place: the driver layer, not the browser. Patchright patches the Playwright driver and runs Playwright's Chromium; Rebrowser patches Playwright 1.52 and its Chromium. On the fleet both run headful by default (2 threads). The question is what each costs you as a developer, and whether a site can tell them apart from real users — or from each other.

As a developer: driving them

PatchrightRebrowser
Chromium on the fleet148 (Playwright's current build).136 — 19 majors behind today's Chrome 155.
Playwright client1.60 — the same client as every other browser here.1.52 only: newer clients time out on connect, so your project pins an old Playwright just for this browser.
Optionsheadless, timeouts, proxies and rules, live_view, screen_size, keep_alive, recordings, client-side screencast.The same minus keep_alive (its 1.52 server can't keep contexts across connections) and page.screencast (1.52 has no such API). Neither offers cdp — their stealth lives in the Playwright layer CDP would bypass.
Playwright featuresMain-world evaluate, init scripts, routing, screenshots, PDF, device emulation, tracing (measured).The same list (measured).
Console eventsDon't fire (page.on("console") stays silent) — the price of hiding Runtime.enable.Don't fire either (measured).
Connect timeAbout 30 ms after launch in our run.About 1.7 s after launch (the 1.52 handshake).

As a scraper: what the site sees

PatchrightRebrowser
User agentChrome/148.0.0.0Chrome/136.0.0.0 — a version real users left long ago.
Client hintsBrands Chromium 148 (+ GREASE) — no Google Chrome.Brands Chromium 136 (+ GREASE) — no Google Chrome either.
TLS and HTTP/2JA4 t13d1516h2_8daaf6152771_d8a2da3f94cd; Chromium's SETTINGS and header order.Identical JA4, SETTINGS and header order (measured).
Automation tellsnavigator.webdriver false; no Runtime.enable leak (a debugger-triggered stack read stays unread).The same (measured).
Bot checksbot.sannysoft.com: only "WebGL Renderer" flagged (SwiftShader on a GPU-less server).The same single flag.
What still gives them awayThe missing Google Chrome brand and a Chromium version Chrome never shipped as stable.The same brand gap and a much older version.

Which to pick

Measured on the fleet (2026-10-10)

One headful launch of each through the same proxy, probed from inside a page and via tls.peet.ws; Rebrowser driven with the Playwright 1.52 client it requires.

Launch and cost

Single run; timings depend on the proxy and on fleet load.

PatchrightRebrowser
Launch body{"headless":false}{"headless":false}
Threads used2 (linux_headful)2 (linux_headful)
Browser version148.0.7778.96136.0.7103.25
Launch request → browser ready2.2 s1.3 s
Playwright connect0.0 s1.7 s
Load example.com1.2 s0.8 s
Load tls.peet.ws/api/all2.7 s0.9 s

What the network sees

From tls.peet.ws/api/all, requested by the browser itself. JA3 hashes change between runs of the same build (GREASE), so compare JA4 and the HTTP/2 fingerprint.

PatchrightRebrowser
HTTP versionh2h2
JA4t13d1516h2_8daaf6152771_d8a2da3f94cdt13d1516h2_8daaf6152771_d8a2da3f94cd
Peetprint hash1d4ffe9b0e34acac0bd883fa7f79d7b51d4ffe9b0e34acac0bd883fa7f79d7b5
Akamai HTTP/2 fingerprint1:65536;2:0;4:6291456;6:262144|15663105|0|m,a,s,p1:65536;2:0;4:6291456;6:262144|15663105|0|m,a,s,p
Cipher suites / extensions16 / 1816 / 18
Header order (first 12)method, authority, scheme, path, sec-ch-ua, sec-ch-ua-mobile, sec-ch-ua-platform, upgrade-insecure-requests, user-agent, accept, sec-fetch-site, sec-fetch-modemethod, authority, scheme, path, sec-ch-ua, sec-ch-ua-mobile, sec-ch-ua-platform, upgrade-insecure-requests, user-agent, accept, sec-fetch-site, sec-fetch-mode

What page scripts see

Read with page.evaluate on example.com. Cores and memory are the server's and vary between fleet nodes.

PatchrightRebrowser
navigator.userAgentMozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36
UA-CH brandsNot/A)Brand 99 · Chromium 148Not.A/Brand 99 · Chromium 136
UA-CH full version listNot/A)Brand 99.0.0.0 · Chromium 148.0.7778.96Not.A/Brand 99.0.0.0 · Chromium 136.0.7103.25
navigator.platform / vendorLinux x86_64 / Google Inc.Linux x86_64 / Google Inc.
Languagesen-USen-US
Timezone / localeUTC / en-USUTC / en-US
Screen (w×h×availW×availH×depth)1280x720x1280x720x241280x720x1280x720x24
Window outer / inner / DPR1288x805 / 1280x720 / 11288x805 / 1280x720 / 1
hardwareConcurrency / deviceMemory64 / 3216 / 8
WebGL vendorGoogle Inc. (Google)Google Inc. (Google)
WebGL rendererANGLE (Google, Vulkan 1.3.0 (SwiftShader Device (Subzero) (0x0000C0DE)), SwiftShader driver)ANGLE (Google, Vulkan 1.3.0 (SwiftShader Device (Subzero) (0x0000C0DE)), SwiftShader driver)
WebGL versionWebGL 2.0 (OpenGL ES 3.0 Chromium)WebGL 2.0 (OpenGL ES 3.0 Chromium)
WebGPU (navigator.gpu)yesyes
Canvas hashf5a94624f972017a
navigator.webdrivernono
window.chrome / navigator.connectionyes / yesyes / yes
Plugins / PDF viewer5 / yes5 / yes
Notification.permission / permissions.querydefault / promptdefault / prompt

Web platform features

Presence probes; a user agent that claims one version while exposing another's features is a detectable inconsistency.

PatchrightRebrowser
Iterator.prototype.includes (new in Chrome 154)nono
FontFace.width (new in Chrome 154)nono
CSS text-decoration-inset (new in Chrome 154)nono
Iterator.prototype.join (Chrome 153)nono
Iterator.zip (Chrome 153)nono
CSS scroll-axis-lock (Chrome 153)nono
<camera> element (Chrome 153)nono
document.requestStorageAccessFor (deprecated in 153)yesyes
Topics API (document.browsingTopics)yesyes
Protected Audience (navigator.joinAdInterestGroup)yesyes
Shared Storage (window.sharedStorage)yesyes
Attribution Reporting (window.attributionReporting)nono
Private Aggregationnono
WebHID (navigator.hid)yesyes
CSS margin-trim (Chrome 155)nono
CSS text-decoration-skip-spaces (Chrome 155)nono
CSS corner shorthand (Chrome 155)nono
CSS symbols() (Chrome 155)nono
Element.streamAppendHTML (Chrome 155)nono
WebTransport.reliability (Chrome 155)nono
window.maximize() — Additional Windowing Controls (Chrome 155)nono
Canvas srgb-linear colour space (Chrome 155)nono
Permission policy media-playback-while-not-visible (Chrome 155)nono
CSS random() (Chrome 156)nono
CSS scroll-snap-type: pair (Chrome 156)nono
Fenced frames (window.fence) — removal starts in 157yesyes
rel=compression-dictionary (Chrome 156 updates)yesyes

bot.sannysoft.com

The classic headless-detection test page; what it marks red.

PatchrightRebrowser
Checks / failed57 / 157 / 1
Failed checksWebGL RendererWebGL Renderer

A plain-HTTP URL (http://ip-api.com/json)

Chrome 154 warns before loading insecure HTTP by default — does that reach an automated session?

PatchrightRebrowser
Final URLhttp://ip-api.com/json/?fields=statushttp://ip-api.com/json/?fields=status
HTTP status200200
Content loaded / warning page firstyes / noyes / no

Playwright over the remote connection

Which client features work on this side.

PatchrightRebrowser
page.evaluate runs in the page's own worldyesyes
addInitScript visible to page scriptsyesyes
Console eventsnono
Request interception (page.route)yesyes
Screenshotyesyes
PDFyesyes
Mobile device emulationyesyes
Tracingyesyes

Rows where the two sides differ are highlighted. IP addresses are replaced with placeholders (203.0.113.x). The probe is compare/probe.mjs in our repository; the raw result is below.

Raw output
{
  "ran_at": "2026-10-10T01:11:20.722Z",
  "sides": [
    {
      "label": "Patchright",
      "engine": "patchright",
      "body": {
        "headless": false
      },
      "launch": {
        "browser": "patchright",
        "resource_class": "linux_headful",
        "weight": 2,
        "launch_ms": 2211,
        "connect_ms": 34,
        "example_ms": 1239,
        "peet_ms": 2672
      },
      "network": {
        "http_version": "h2",
        "ja4": "t13d1516h2_8daaf6152771_d8a2da3f94cd",
        "ja3_hash": "6c00bb0960533a55229341f0aaa35f5c",
        "peetprint_hash": "1d4ffe9b0e34acac0bd883fa7f79d7b5",
        "ciphers": 16,
        "extensions": 18,
        "akamai_h2": "1:65536;2:0;4:6291456;6:262144|15663105|0|m,a,s,p",
        "akamai_h2_hash": "52d84b11737d980aef856699f885ca86",
        "header_order": [
          "method",
          "authority",
          "scheme",
          "path",
          "sec-ch-ua",
          "sec-ch-ua-mobile",
          "sec-ch-ua-platform",
          "upgrade-insecure-requests",
          "user-agent",
          "accept",
          "sec-fetch-site",
          "sec-fetch-mode"
        ]
      },
      "page": {
        "user_agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36",
        "platform": "Linux x86_64",
        "vendor": "Google Inc.",
        "languages": [
          "en-US"
        ],
        "hardware_concurrency": 64,
        "device_memory": 32,
        "max_touch_points": 0,
        "webdriver": false,
        "plugins": 5,
        "pdf_viewer": true,
        "ua_data": {
          "brands": [
            {
              "brand": "Not/A)Brand",
              "version": "99"
            },
            {
              "brand": "Chromium",
              "version": "148"
            }
          ],
          "mobile": false,
          "platform": "Linux",
          "architecture": "x86",
          "bitness": "64",
          "formFactors": [
            "Desktop"
          ],
          "fullVersionList": [
            {
              "brand": "Not/A)Brand",
              "version": "99.0.0.0"
            },
            {
              "brand": "Chromium",
              "version": "148.0.7778.96"
            }
          ],
          "model": "",
          "platformVersion": "",
          "uaFullVersion": "148.0.7778.96",
          "wow64": false
        },
        "screen": "1280x720x1280x720x24",
        "window": {
          "outer": "1288x805",
          "inner": "1280x720",
          "dpr": 1
        },
        "timezone": "UTC",
        "locale": "en-US",
        "webgl": {
          "vendor": "Google Inc. (Google)",
          "renderer": "ANGLE (Google, Vulkan 1.3.0 (SwiftShader Device (Subzero) (0x0000C0DE)), SwiftShader driver)",
          "version": "WebGL 2.0 (OpenGL ES 3.0 Chromium)"
        },
        "canvas_hash": "f5a94624",
        "webgpu": true,
        "chrome_object": true,
        "chrome_runtime": false,
        "notification_permission": "default",
        "notification_query": "prompt",
        "has_focus": true,
        "connection_api": true,
        "stack_read_by_debugger": false,
        "features": {
          "iterator_includes": false,
          "iterator_join": false,
          "iterator_zip": false,
          "fontface_width": false,
          "css_text_decoration_inset": false,
          "css_scroll_axis_lock": false,
          "websocket_options_bag": null,
          "camera_element": false,
          "topics_api": true,
          "protected_audience": true,
          "shared_storage": true,
          "attribution_reporting": false,
          "request_storage_access_for": true,
          "webhid": true,
          "private_aggregation": false,
          "css_margin_trim": false,
          "css_text_decoration_skip_spaces": false,
          "css_corner_shorthand": false,
          "css_symbols": false,
          "stream_append_html": false,
          "webtransport_reliability": false,
          "window_maximize": false,
          "canvas_srgb_linear": false,
          "policy_media_playback_while_not_visible": false,
          "css_random": false,
          "css_scroll_snap_pair": false,
          "fenced_frames": true,
          "compression_dictionary": true
        }
      },
      "page_main_world": null,
      "sannysoft": {
        "checks": 57,
        "failed": 1,
        "failed_names": [
          "WebGL Renderer"
        ],
        "passed": 30
      },
      "plain_http": {
        "final_url": "http://ip-api.com/json/?fields=status",
        "status": 200,
        "title": "",
        "loaded": true,
        "warning_page": false,
        "page_text": "{\"status\":\"success\"}"
      },
      "playwright": {
        "evaluate_in_main_world": true,
        "console_events": false,
        "init_script": true,
        "route": true,
        "screenshot": true,
        "pdf": true,
        "mobile_emulation": true,
        "tracing": true
      },
      "browser_version": "148.0.7778.96"
    },
    {
      "label": "Rebrowser",
      "engine": "rebrowser",
      "body": {
        "headless": false
      },
      "launch": {
        "browser": "rebrowser",
        "resource_class": "linux_headful",
        "weight": 2,
        "launch_ms": 1329,
        "connect_ms": 1704,
        "example_ms": 775,
        "peet_ms": 949
      },
      "network": {
        "http_version": "h2",
        "ja4": "t13d1516h2_8daaf6152771_d8a2da3f94cd",
        "ja3_hash": "0b2bcd28c9104a2fa5008a3d1ecb3db1",
        "peetprint_hash": "1d4ffe9b0e34acac0bd883fa7f79d7b5",
        "ciphers": 16,
        "extensions": 18,
        "akamai_h2": "1:65536;2:0;4:6291456;6:262144|15663105|0|m,a,s,p",
        "akamai_h2_hash": "52d84b11737d980aef856699f885ca86",
        "header_order": [
          "method",
          "authority",
          "scheme",
          "path",
          "sec-ch-ua",
          "sec-ch-ua-mobile",
          "sec-ch-ua-platform",
          "upgrade-insecure-requests",
          "user-agent",
          "accept",
          "sec-fetch-site",
          "sec-fetch-mode"
        ]
      },
      "page": {
        "user_agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36",
        "platform": "Linux x86_64",
        "vendor": "Google Inc.",
        "languages": [
          "en-US"
        ],
        "hardware_concurrency": 16,
        "device_memory": 8,
        "max_touch_points": 0,
        "webdriver": false,
        "plugins": 5,
        "pdf_viewer": true,
        "ua_data": {
          "brands": [
            {
              "brand": "Not.A/Brand",
              "version": "99"
            },
            {
              "brand": "Chromium",
              "version": "136"
            }
          ],
          "mobile": false,
          "platform": "Linux",
          "architecture": "x86",
          "bitness": "64",
          "formFactors": [
            "Desktop"
          ],
          "fullVersionList": [
            {
              "brand": "Not.A/Brand",
              "version": "99.0.0.0"
            },
            {
              "brand": "Chromium",
              "version": "136.0.7103.25"
            }
          ],
          "model": "",
          "platformVersion": "6.8.0",
          "uaFullVersion": "136.0.7103.25",
          "wow64": false
        },
        "screen": "1280x720x1280x720x24",
        "window": {
          "outer": "1288x805",
          "inner": "1280x720",
          "dpr": 1
        },
        "timezone": "UTC",
        "locale": "en-US",
        "webgl": {
          "vendor": "Google Inc. (Google)",
          "renderer": "ANGLE (Google, Vulkan 1.3.0 (SwiftShader Device (Subzero) (0x0000C0DE)), SwiftShader driver)",
          "version": "WebGL 2.0 (OpenGL ES 3.0 Chromium)"
        },
        "canvas_hash": "f972017a",
        "webgpu": true,
        "chrome_object": true,
        "chrome_runtime": false,
        "notification_permission": "default",
        "notification_query": "prompt",
        "has_focus": true,
        "connection_api": true,
        "stack_read_by_debugger": false,
        "features": {
          "iterator_includes": false,
          "iterator_join": false,
          "iterator_zip": false,
          "fontface_width": false,
          "css_text_decoration_inset": false,
          "css_scroll_axis_lock": false,
          "websocket_options_bag": null,
          "camera_element": false,
          "topics_api": true,
          "protected_audience": true,
          "shared_storage": true,
          "attribution_reporting": false,
          "request_storage_access_for": true,
          "webhid": true,
          "private_aggregation": false,
          "css_margin_trim": false,
          "css_text_decoration_skip_spaces": false,
          "css_corner_shorthand": false,
          "css_symbols": false,
          "stream_append_html": false,
          "webtransport_reliability": false,
          "window_maximize": false,
          "canvas_srgb_linear": false,
          "policy_media_playback_while_not_visible": false,
          "css_random": false,
          "css_scroll_snap_pair": false,
          "fenced_frames": true,
          "compression_dictionary": true
        }
      },
      "page_main_world": null,
      "sannysoft": {
        "checks": 57,
        "failed": 1,
        "failed_names": [
          "WebGL Renderer"
        ],
        "passed": 29
      },
      "plain_http": {
        "final_url": "http://ip-api.com/json/?fields=status",
        "status": 200,
        "title": "",
        "loaded": true,
        "warning_page": false,
        "page_text": "{\"status\":\"success\"}"
      },
      "playwright": {
        "evaluate_in_main_world": true,
        "console_events": false,
        "init_script": true,
        "route": true,
        "screenshot": true,
        "pdf": true,
        "mobile_emulation": true,
        "tracing": true
      },
      "browser_version": "136.0.7103.25"
    }
  ]
}

Bottom line

To a website, Patchright and Rebrowser are the same browser at different ages: identical TLS, HTTP/2 and automation-tell results, both without console events, both announcing Chromium rather than Chrome.

The difference is on your side — a current Chromium and today's Playwright against an old Chromium and a pinned 1.52 client. Unless a target proves otherwise, choose Patchright.