[Compare](https://cdpfleet.com/docs/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](https://cdpfleet.com/docs/browsers/camoufox) [Patchright](https://cdpfleet.com/docs/browsers/patchright)

[Camoufox](https://cdpfleet.com/docs/browsers/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](https://cdpfleet.com/docs/browsers/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

|  | Camoufox | Patchright |
| --- | --- | --- |
| Engine, Playwright client | Gecko (Firefox 152). Connect with `firefox`. | Blink/V8 (Chromium 148). Connect with `chromium`. |
| Launch options | The 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` runs | In 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`. |
| `addInitScript` | Runs 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 events | Work. | 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 emulation | No 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, tracing | Work. | Work. |
| Headless modes | `false` (virtual display, default), `true`. | `false` (default), `"new"`, `"shell"`. |

## As a scraper: what the site sees

|  | Camoufox | Patchright |
| --- | --- | --- |
| TLS and HTTP/2 | Real 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 is | Firefox 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 time | `geoip` (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 tells | None in headful: no `Headless` UA, 5 plugins, consistent notification permission, `navigator.webdriver` false. | None in headful: same list, `webdriver` false, `window.chrome` present. |
| WebGL | A 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.com | 1 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 limit | Cannot 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

-   **Camoufox** when the site must see a consistent consumer device and you don't want to build that identity yourself: geo personas ([three countries, one script](https://cdpfleet.com/docs/cases/three-countries)), account work, anything where IP, timezone, language and screen must agree. Accept Firefox rendering and the isolated-world rule.
-   **Patchright** when the site needs Chromium — Chromium-only APIs, client hints, V8 quirks — or your tooling does (PDFs, device emulation, console-free is fine). Plan on setting timezone, locale and viewport per context.
-   **Neither replaces real Chrome**: for sites that check the `Google Chrome` brand or exact Chrome behaviour, launch [Chrome](https://cdpfleet.com/docs/browsers/chrome) itself — [headless tells](https://cdpfleet.com/docs/cases/headless-tells) shows what headful real Chrome still gives away (the GPU), and [stealth builds](https://cdpfleet.com/docs/cases/stealth-builds) compares all four patched builds.

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

|  | Camoufox | Patchright |
| --- | --- | --- |
| Launch body | {"headless":false,"main\_world\_eval":true} | {"headless":false} |
| Threads used | 2 (linux\_headful) | 2 (linux\_headful) |
| Browser version | 152.0.4-beta.30 | 148.0.7778.96 |
| Launch request → browser ready | 7.4 s | 0.8 s |
| Playwright connect | 0.0 s | 0.1 s |
| Load example.com | 3.7 s | 3.4 s |
| Load tls.peet.ws/api/all | 1.5 s | 1.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.

|  | Camoufox | Patchright |
| --- | --- | --- |
| HTTP version | h2 | h2 |
| JA4 | t13d1617h2\_86a278354501\_3cbfd9057e0d | t13d1516h2\_8daaf6152771\_d8a2da3f94cd |
| Peetprint hash | fd4547eeb41f073156b7bc8125a79a3c | 1d4ffe9b0e34acac0bd883fa7f79d7b5 |
| Akamai HTTP/2 fingerprint | 1:65536;2:0;4:131072;5:16384|12517377|0|m,p,a,s | 1:65536;2:0;4:6291456;6:262144|15663105|0|m,a,s,p |
| Cipher suites / extensions | 16 / 17 | 16 / 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-site | 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 |

### What page scripts see

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

|  | Camoufox | Patchright |
| --- | --- | --- |
| navigator.userAgent | Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:152.0) Gecko/20100101 Firefox/152.0 | Mozilla/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 / vendor | Win32 / "" | Linux x86\_64 / Google Inc. |
| Languages | ar-IQ, ar | en-US |
| Timezone / locale | Asia/Baghdad / ar | UTC / en-US |
| Screen (w×h×availW×availH×depth) | 2752x1152x2752x1104x24 | 1280x720x1280x720x24 |
| Window outer / inner / DPR | 1806x1104 / 1280x720 / 1 | 1288x805 / 1280x720 / 1 |
| hardwareConcurrency / deviceMemory | 32 / — | 64 / 32 |
| WebGL vendor | Google Inc. (AMD) | Google Inc. (Google) |
| WebGL renderer | ANGLE (AMD, Radeon HD 3200 Graphics Direct3D11 vs\_5\_0 ps\_5\_0), or similar | ANGLE (Google, Vulkan 1.3.0 (SwiftShader Device (Subzero) (0x0000C0DE)), SwiftShader driver) |
| WebGL version | WebGL 2.0 | WebGL 2.0 (OpenGL ES 3.0 Chromium) |
| WebGPU (navigator.gpu) | no | yes |
| Canvas hash | 3217f23f | f5a94624 |
| navigator.webdriver | no | no |
| window.chrome / navigator.connection | no / no | yes / yes |
| Plugins / PDF viewer | 5 / yes | 5 / yes |
| Notification.permission / permissions.query | default / prompt | default / prompt |

### Web platform features

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

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

### bot.sannysoft.com

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

|  | Camoufox | Patchright |
| --- | --- | --- |
| Checks / failed | 57 / 1 | 57 / 1 |
| Failed checks | Chrome (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?

|  | Camoufox | Patchright |
| --- | --- | --- |
| Final URL | http://ip-api.com/json/?fields=status | http://ip-api.com/json/?fields=status |
| HTTP status | 200 | 200 |
| Content loaded / warning page first | yes / no | yes / no |

### Playwright over the remote connection

Which client features work on this side.

|  | Camoufox | Patchright |
| --- | --- | --- |
| page.evaluate runs in the page's own world | no | yes |
| `main_world_eval` option (`mw:` prefix) | yes | — |
| addInitScript visible to page scripts | no | yes |
| Console events | yes | no |
| Request interception (page.route) | yes | yes |
| Screenshot | yes | yes |
| PDF | no — Error: page.pdf: PDF generation is only supported for Headless Chromium | yes |
| Mobile device emulation | no — Error: browser.newContext: options.isMobile is not supported in Firefox | yes |
| Tracing | yes | yes |

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.

---
Source: https://cdpfleet.com/docs/compare/camoufox-vs-patchright · Markdown: https://cdpfleet.com/docs/compare/camoufox-vs-patchright.md · All docs for AI tools: https://cdpfleet.com/llms.txt
