cdpfleet Docs Sign up free

Compare / browsers

Camoufox vs Patchright

Two stealth browsers, two philosophies: a browser based on Firefox source (not affiliated with Mozilla) that spoofs the whole device at the C++ level, or a Chromium that patches the automation leaks and otherwise tells the truth. What each is like to drive, and what a site sees.

Camoufox Patchright

Camoufox is a browser based on Firefox source (152 on the fleet; not affiliated with Mozilla) that generates a complete device identity at launch — operating system, screen, GPU, cores, fonts, locale, timezone, geolocation — and answers every JavaScript and HTTP question from that identity, inside the engine rather than through injected scripts. Patchright is Playwright's own Chromium (148) with the things that give automation away removed: no Runtime.enable leak, no --enable-automation, console API disabled, closed shadow roots reachable. It doesn't pretend to be another machine. Both run headful by default on the fleet (2 threads) and both were launched through the same proxy for this page.

As a developer: driving them

CamoufoxPatchright
Engine, Playwright clientGecko (Firefox 152). Connect with firefox.Blink/V8 (Chromium 148). Connect with chromium.
Launch optionsThe richest set on the fleet: os, locale, geoip, humanize, screen, window, fonts, webgl_config, a full BrowserForge fingerprint, block_images/block_webrtc/block_webgl, pinned version, main_world_eval.The common set only: proxy, proxy_rules, headless, timeouts. Identity is whatever the Linux server is.
Where page.evaluate runsIn an isolated world. Globals you set there are invisible to the page, and vice versa; for fingerprint checks use main_world_eval: true and prefix the expression with mw: (measured: works).In the page's own world — a <script> on the page sees what you set (measured). Patchright reaches it without Runtime.enable.
addInitScriptRuns in the isolated world: the page's scripts don't see its globals (measured).Works as in Playwright, implemented through routes; the README warns this can interfere with other route handlers.
Console eventsWork.Don't fire (measured): Patchright disables the Console API to close the Console.enable leak. Log from the page to the DOM or to your own endpoint instead.
PDF, mobile emulationNo PDF (page.pdf is Chromium-only). No device emulation: isMobile is not supported in Firefox.Both work (measured; PDF also worked in this headful run).
Request interception, screenshots, tracingWork.Work.
Headless modesfalse (virtual display, default), true.false (default), "new", "shell".

As a scraper: what the site sees

CamoufoxPatchright
TLS and HTTP/2Real Firefox: JA4 t13d1617h2_…, Firefox's HTTP/2 SETTINGS and header order (user-agent before accept). Identical on every OS Firefox runs on, so it matches whatever OS the persona claims.Real Chromium: JA4 t13d1516h2_…, Chromium's HTTP/2 SETTINGS and pseudo-header order, sec-ch-ua client hints. Matches the Chrome user agent it sends.
Who it says it isFirefox on a desktop OS picked per session (Windows, macOS or Linux; pin it with os), with a matching screen, GPU string ("… or similar"), core count and fonts — different each launch unless you pass a fingerprint.Chrome 148 on Linux x86_64, brand Chromium (not Google Chrome) in the client hints, 1280×720 screen, the server's 64 cores and 32 GB. Honest, and visibly a Linux server.
Locale and timegeoip (default on) reads the proxy's exit and sets the timezone, locale and geolocation to match — measured: our rotating residential proxy exited in Spain, Brazil and Iraq across our runs, and the browser followed each time (Europe/Madrid/es, America/Sao_Paulo/pt, Asia/Baghdad/ar in the run below) without any code.UTC and en-US whatever the proxy says. Set timezoneId, locale and geolocation in newContext yourself, or the IP-vs-clock mismatch is the first thing a risk engine sees.
Headless tellsNone in headful: no Headless UA, 5 plugins, consistent notification permission, navigator.webdriver false.None in headful: same list, webdriver false, window.chrome present.
WebGLA consumer GPU from the persona ("Apple M1, or similar", "NVIDIA GeForce GTX 980 …").The same SwiftShader software renderer as every other Chromium build on the fleet — honest, and a server tell to anyone scoring GPU strings. (Our first measurement on 4 October found no WebGL context at all in Patchright headful: its launcher adds Chromium's --enable-unsafe-swiftshader only on macOS, where Playwright adds it everywhere; the fleet now adds it for Patchright, and this page was re-measured.)
bot.sannysoft.com1 of 57 checks red: "Chrome (New)" — it is not Chrome, and says so.Only "WebGL Renderer" red — the SwiftShader string, shared with headful Chrome and Chromium. Everything else green.
The limitCannot pass "is this really Chromium" checks: V8-specific behaviour is impossible to fake from Gecko, and the Camoufox authors say so. Some sites block or degrade Firefox outright.Cannot pretend to be a Windows or Mac desktop without you faking it, and anything you fake in JavaScript is a Chromium build that can be inspected. The leaks it closes are the automation ones.

Which to pick

Measured on the fleet (2026-10-06)

One launch of each with the defaults above, through the same proxy, on the production fleet. Camoufox's persona is regenerated every launch, so its OS, screen, GPU, cores and locale differ between runs; Patchright's values are the server's.

Launch and cost

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

CamoufoxPatchright
Launch body{"headless":false,"main_world_eval":true}{"headless":false}
Threads used2 (linux_headful)2 (linux_headful)
Browser version152.0.4-beta.30148.0.7778.96
Launch request → browser ready7.4 s0.8 s
Playwright connect0.0 s0.1 s
Load example.com3.7 s3.4 s
Load tls.peet.ws/api/all1.5 s1.6 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.

CamoufoxPatchright
HTTP versionh2h2
JA4t13d1617h2_86a278354501_3cbfd9057e0dt13d1516h2_8daaf6152771_d8a2da3f94cd
Peetprint hashfd4547eeb41f073156b7bc8125a79a3c1d4ffe9b0e34acac0bd883fa7f79d7b5
Akamai HTTP/2 fingerprint1:65536;2:0;4:131072;5:16384|12517377|0|m,p,a,s1:65536;2:0;4:6291456;6:262144|15663105|0|m,a,s,p
Cipher suites / extensions16 / 1716 / 18
Header order (first 12)method, path, authority, scheme, user-agent, accept, accept-language, accept-encoding, upgrade-insecure-requests, sec-fetch-dest, sec-fetch-mode, sec-fetch-sitemethod, 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.

CamoufoxPatchright
navigator.userAgentMozilla/5.0 (Windows NT 10.0; Win64; x64; rv:152.0) Gecko/20100101 Firefox/152.0Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36
UA-CH brands—Not/A)Brand 99 · Chromium 148
UA-CH full version list—Not/A)Brand 99.0.0.0 · Chromium 148.0.7778.96
navigator.platform / vendorWin32 / ""Linux x86_64 / Google Inc.
Languagesar-IQ, aren-US
Timezone / localeAsia/Baghdad / arUTC / en-US
Screen (w×h×availW×availH×depth)2752x1152x2752x1104x241280x720x1280x720x24
Window outer / inner / DPR1806x1104 / 1280x720 / 11288x805 / 1280x720 / 1
hardwareConcurrency / deviceMemory32 / —64 / 32
WebGL vendorGoogle Inc. (AMD)Google Inc. (Google)
WebGL rendererANGLE (AMD, Radeon HD 3200 Graphics Direct3D11 vs_5_0 ps_5_0), or similarANGLE (Google, Vulkan 1.3.0 (SwiftShader Device (Subzero) (0x0000C0DE)), SwiftShader driver)
WebGL versionWebGL 2.0WebGL 2.0 (OpenGL ES 3.0 Chromium)
WebGPU (navigator.gpu)noyes
Canvas hash3217f23ff5a94624
navigator.webdrivernono
window.chrome / navigator.connectionno / noyes / 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.

CamoufoxPatchright
Iterator.prototype.includes (new in Chrome 154)nono
FontFace.width (new in Chrome 154)nono
CSS text-decoration-inset (Chrome 157)yesno
Iterator.prototype.join (Chrome 153)nono
Iterator.zip (Chrome 153)yesno
CSS scroll-axis-lock (Chrome 153)nono
<camera> element (Chrome 153)nono
document.requestStorageAccessFor (deprecated in 153)noyes
Topics API (document.browsingTopics)noyes
Protected Audience (navigator.joinAdInterestGroup)noyes
Shared Storage (window.sharedStorage)noyes
Attribution Reporting (window.attributionReporting)nono
Private Aggregationnono
WebHID (navigator.hid)noyes
CSS margin-trim (Chrome 155)nono
CSS text-decoration-skip-spaces (Chrome 155)nono
CSS corner shorthand (listed for Chrome 160)nono
CSS symbols() (Chrome 155)yesno
Element.streamAppendHTML (Chrome 157)nono
WebTransport.reliability (on stable from Chrome 157; listed for 158)yesno
window.maximize() — Additional Windowing Controls (Chrome 155)nono
Canvas srgb-linear colour space (on stable from Chrome 157)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)noyes
rel=compression-dictionary (Chrome 156 updates)noyes

bot.sannysoft.com

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

CamoufoxPatchright
Checks / failed57 / 157 / 1
Failed checksChrome (New)WebGL 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?

CamoufoxPatchright
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.

CamoufoxPatchright
page.evaluate runs in the page's own worldnoyes
main_world_eval option (mw: prefix)yes—
addInitScript visible to page scriptsnoyes
Console eventsyesno
Request interception (page.route)yesyes
Screenshotyesyes
PDFno — Error: page.pdf: PDF generation is only supported for Headless Chromiumyes
Mobile device emulationno — Error: browser.newContext: options.isMobile is not supported in Firefoxyes
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-06T02:18:13.318Z",
  "sides": [
    {
      "label": "Camoufox",
      "engine": "camoufox",
      "body": {
        "headless": false,
        "main_world_eval": true
      },
      "launch": {
        "browser": "camoufox",
        "resource_class": "linux_headful",
        "weight": 2,
        "launch_ms": 7360,
        "connect_ms": 43,
        "example_ms": 3708,
        "peet_ms": 1546
      },
      "network": {
        "http_version": "h2",
        "ja4": "t13d1617h2_86a278354501_3cbfd9057e0d",
        "ja3_hash": "6447ab086255d194909d4013b1a89e87",
        "peetprint_hash": "fd4547eeb41f073156b7bc8125a79a3c",
        "ciphers": 16,
        "extensions": 17,
        "akamai_h2": "1:65536;2:0;4:131072;5:16384|12517377|0|m,p,a,s",
        "akamai_h2_hash": "6ea73faa8fc5aac76bded7bd238f6433",
        "header_order": [
          "method",
          "path",
          "authority",
          "scheme",
          "user-agent",
          "accept",
          "accept-language",
          "accept-encoding",
          "upgrade-insecure-requests",
          "sec-fetch-dest",
          "sec-fetch-mode",
          "sec-fetch-site"
        ]
      },
      "page": {
        "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:152.0) Gecko/20100101 Firefox/152.0",
        "platform": "Win32",
        "vendor": "",
        "languages": [
          "ar-IQ",
          "ar"
        ],
        "hardware_concurrency": 32,
        "device_memory": null,
        "max_touch_points": 0,
        "webdriver": false,
        "plugins": 5,
        "pdf_viewer": true,
        "ua_data": null,
        "screen": "2752x1152x2752x1104x24",
        "window": {
          "outer": "1806x1104",
          "inner": "1280x720",
          "dpr": 1
        },
        "timezone": "Asia/Baghdad",
        "locale": "ar",
        "webgl": {
          "vendor": "Google Inc. (AMD)",
          "renderer": "ANGLE (AMD, Radeon HD 3200 Graphics Direct3D11 vs_5_0 ps_5_0), or similar",
          "version": "WebGL 2.0"
        },
        "canvas_hash": "3217f23f",
        "webgpu": false,
        "chrome_object": false,
        "chrome_runtime": false,
        "notification_permission": "default",
        "notification_query": "prompt",
        "has_focus": true,
        "connection_api": false,
        "stack_read_by_debugger": false,
        "features": {
          "iterator_includes": false,
          "iterator_join": false,
          "iterator_zip": true,
          "fontface_width": false,
          "css_text_decoration_inset": true,
          "css_scroll_axis_lock": false,
          "websocket_options_bag": null,
          "camera_element": false,
          "topics_api": false,
          "protected_audience": false,
          "shared_storage": false,
          "attribution_reporting": false,
          "request_storage_access_for": false,
          "webhid": false,
          "private_aggregation": false,
          "css_margin_trim": false,
          "css_text_decoration_skip_spaces": false,
          "css_corner_shorthand": false,
          "css_symbols": true,
          "stream_append_html": false,
          "webtransport_reliability": true,
          "window_maximize": false,
          "canvas_srgb_linear": false,
          "policy_media_playback_while_not_visible": false,
          "css_random": false,
          "css_scroll_snap_pair": false,
          "fenced_frames": false,
          "compression_dictionary": false
        }
      },
      "page_main_world": {
        "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:152.0) Gecko/20100101 Firefox/152.0",
        "platform": "Win32",
        "vendor": "",
        "languages": [
          "ar-IQ",
          "ar"
        ],
        "hardware_concurrency": 32,
        "device_memory": null,
        "max_touch_points": 0,
        "webdriver": false,
        "plugins": 5,
        "pdf_viewer": true,
        "ua_data": null,
        "screen": "2752x1152x2752x1104x24",
        "window": {
          "outer": "1806x1104",
          "inner": "1280x720",
          "dpr": 1
        },
        "timezone": "Asia/Baghdad",
        "locale": "ar",
        "webgl": {
          "vendor": "Google Inc. (AMD)",
          "renderer": "ANGLE (AMD, Radeon HD 3200 Graphics Direct3D11 vs_5_0 ps_5_0), or similar",
          "version": "WebGL 2.0"
        },
        "canvas_hash": "3217f23f",
        "webgpu": false,
        "chrome_object": false,
        "chrome_runtime": false,
        "notification_permission": "default",
        "notification_query": "prompt",
        "has_focus": true,
        "connection_api": false,
        "stack_read_by_debugger": false,
        "features": {
          "iterator_includes": false,
          "iterator_join": false,
          "iterator_zip": true,
          "fontface_width": false,
          "css_text_decoration_inset": true,
          "css_scroll_axis_lock": false,
          "websocket_options_bag": null,
          "camera_element": false,
          "topics_api": false,
          "protected_audience": false,
          "shared_storage": false,
          "attribution_reporting": false,
          "request_storage_access_for": false,
          "webhid": false,
          "private_aggregation": false,
          "css_margin_trim": false,
          "css_text_decoration_skip_spaces": false,
          "css_corner_shorthand": false,
          "css_symbols": true,
          "stream_append_html": false,
          "webtransport_reliability": true,
          "window_maximize": false,
          "canvas_srgb_linear": false,
          "policy_media_playback_while_not_visible": false,
          "css_random": false,
          "css_scroll_snap_pair": false,
          "fenced_frames": false,
          "compression_dictionary": false
        }
      },
      "sannysoft": {
        "checks": 57,
        "failed": 1,
        "failed_names": [
          "Chrome (New)"
        ],
        "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": false,
        "console_events": true,
        "init_script": false,
        "route": true,
        "screenshot": true,
        "pdf": false,
        "pdf_error": "Error: page.pdf: PDF generation is only supported for Headless Chromium",
        "mobile_emulation": false,
        "mobile_emulation_error": "Error: browser.newContext: options.isMobile is not supported in Firefox",
        "tracing": true,
        "main_world_eval_option": true
      },
      "browser_version": "152.0.4-beta.30"
    },
    {
      "label": "Patchright",
      "engine": "patchright",
      "body": {
        "headless": false
      },
      "launch": {
        "browser": "patchright",
        "resource_class": "linux_headful",
        "weight": 2,
        "launch_ms": 763,
        "connect_ms": 135,
        "example_ms": 3426,
        "peet_ms": 1606
      },
      "network": {
        "http_version": "h2",
        "ja4": "t13d1516h2_8daaf6152771_d8a2da3f94cd",
        "ja3_hash": "7e9f126aaaae20818fc215a92e16c19c",
        "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"
    }
  ]
}

Bottom line

The two aren't rivals so much as answers to different questions. Patchright asks "how do I stop Playwright from announcing itself?" and answers it well, leaving the machine's identity to you. Camoufox asks "what should the machine look like?" and answers that, at the price of being Firefox.

In practice: Chromium-shaped problems go to Patchright (with your own context settings), identity-shaped problems go to Camoufox, and when a site must see genuine Chrome, run genuine Chrome.