[Compare](https://cdpfleet.com/docs/compare) / browsers

# Camoufox vs Firefox, headless

Headless Firefox and headless Camoufox (both based on Firefox source; not affiliated with Mozilla) side by side: the headless tells a page can read, what Camoufox hides, and what its "virtual" mode costs.

[Camoufox](https://cdpfleet.com/docs/browsers/camoufox) [Firefox](https://cdpfleet.com/docs/browsers/firefox)

[Firefox vs Camoufox](https://cdpfleet.com/docs/compare/firefox-vs-camoufox) compares the two browsers headful. This page is about the cheaper mode most scrapers run: **headless**, where there is no display and a page has the most to notice. [Firefox](https://cdpfleet.com/docs/browsers/firefox) on the fleet is Playwright's build (150.0.2 on 2026-10-25), based on Firefox source and not affiliated with Mozilla. [Camoufox](https://cdpfleet.com/docs/browsers/camoufox) is the anti-detect browser built on the same engine, also based on Firefox source and not affiliated with Mozilla (156.0.1-beta.34 on 2026-10-25, driven by the official Camoufox library). Camoufox has two headless modes: `"headless": true` (no display at all) and `"headless": "virtual"` (headful on a virtual display the page can't tell from a real one). All three were launched once through the same rotating proxy on 2026-10-25.

## The headless tells, measured

|  | Firefox, headless | Camoufox, headless (\`true\` and \`"virtual"\`) |
| --- | --- | --- |
| `navigator.webdriver` | **`true`**: the browser says it is automated, and bot.sannysoft.com marks "WebDriver" red. | `false` in both modes, in the page's world and in Playwright's isolated world. |
| Window vs viewport | Outer window = viewport = 1280×720: no browser chrome around the page, which no real desktop window has. | Outer window taller than the viewport (1280×806 and 1280×805 around a 1280×720 page), as a window with toolbars would be. |
| Screen | 1280×720, the same as the window: the screen is the page. | A desktop screen from the persona (1920×1080 and 3440×1440 in these launches), with a taskbar-sized gap between the screen and the available height. |
| GPU (WebGL) | `llvmpipe` (Mesa software rendering): a server without a GPU. | A persona GPU: "Radeon HD 3200 Graphics" and "ANGLE (AMD, Radeon R9 200 Series …)" in these launches. |
| Cores, plugins, PDF viewer | The server's 64 cores, 0 plugins, no PDF viewer. | 12 and 8 cores, 5 plugins, a PDF viewer: consumer-machine values. |
| Languages, timezone | `navigator.languages` gave no real list, timezone `UTC`. | Matched to the proxy exit (Spain in these launches): timezone `Europe/Madrid`, languages `es-ES` and `en-ES`. |
| bot.sannysoft.com | 4 of 57 checks red: WebDriver, "Chrome (New)" and two plugin checks. | 1 red in both modes: "Chrome (New)", because it is Firefox and says so. |

## What stays the same

-   **HTTP/2:** identical on all three: the same SETTINGS, window update and pseudo-header order (measured).
-   **The engine:** both are Gecko, so Chromium-only features, `page.pdf` and mobile emulation are missing on both (measured).
-   **Plain-HTTP pages** load on all three through the proxy (measured).

## What differs beyond the tells

-   **TLS:** Camoufox 156 offers 15 cipher suites, Firefox 150 offers 16, so their JA4 (`t13d1517h2_…` vs `t13d1617h2_…`) and full TLS fingerprints differ on 2026-10-25. That is the version gap, not headless mode; see [Camoufox 156](https://cdpfleet.com/docs/updates/camoufox-156).
-   **`page.evaluate` and init scripts:** in Camoufox they run in an isolated world that page scripts can't see; read page values with `main_world_eval` and the `mw:` prefix (measured: Firefox evaluates in the page's world, Camoufox doesn't).
-   **Personas change per launch:** the two Camoufox launches drew a Linux and a Windows persona; that difference comes from the per-launch draw, not from the headless mode. Pin `os` if you need one. Canvas and audio hashes are also re-drawn per launch on Camoufox and fixed on Firefox ([case 66](https://cdpfleet.com/docs/cases/fingerprint-stability-across-launches)).

## "virtual" vs true headless on Camoufox

|  | \`"headless": true\` | \`"headless": "virtual"\` |
| --- | --- | --- |
| Threads | 1 (headless) | **2** (counted as headful) |
| Launch, this run | 1.7 s | 4.9 s |
| Tells measured here | The same as "virtual": webdriver false, window chrome, persona screen and GPU, 1 sannysoft flag. | The same as true headless. |
| When | The default for scraping: cheapest, and on these probes it showed nothing the virtual display didn't. | When a site behaves differently without a real display (rendering paths, focus, some video), or you want a recording or live view of the session. |

## Which to pick

-   **Headless Firefox** for engine checks and rendering tests where nobody scores the visitor. It announces itself (`webdriver`, a 1280×720 "screen" that equals the window, software GPU, UTC), which is honest and cheap.
-   **Headless Camoufox** for scraping where the site scores visitors: on these probes it hid every headless tell headless Firefox showed, at one thread.
-   **Camoufox "virtual"** only when you need a display: it costs two threads and launched slower, and these probes found no extra tell it removes.
-   For what the real protections do with each browser, see the bot-protection cases ([Cloudflare](https://cdpfleet.com/docs/cases/cloudflare-what-gets-through), [DataDome](https://cdpfleet.com/docs/cases/datadome-what-gets-through), [Akamai and HUMAN](https://cdpfleet.com/docs/cases/akamai-and-human-what-gets-through)) and [what a page can read about your browser](https://cdpfleet.com/docs/fingerprinting).

## Measured on the fleet (2026-10-25)

One launch of each on 2026-10-25 through the same rotating proxy; Camoufox read through `main_world_eval`. Camoufox's persona (OS, screen, GPU, cores, locale, timezone) is drawn per launch, so its values differ between its two columns by chance, not by mode; Firefox's values are the server's.

### Launch and cost

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

|  | Firefox, headless | Camoufox, headless | Camoufox, headless "virtual" |
| --- | --- | --- | --- |
| Launch body | {"headless":true} | {"headless":true,"main\_world\_eval":true} | {"headless":"virtual","main\_world\_eval":true} |
| Threads used | 1 (linux\_headless) | 1 (linux\_headless) | 2 (linux\_headful) |
| Browser version | 150.0.2 | 156.0.1-beta.34 | 156.0.1-beta.34 |
| Launch request → browser ready | 0.9 s | 1.7 s | 4.9 s |
| Playwright connect | 0.2 s | 0.1 s | 0.0 s |
| Load example.com | 1.6 s | 2.4 s | 1.0 s |
| Load tls.peet.ws/api/all | 1.3 s | 0.9 s | 1.5 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.

|  | Firefox, headless | Camoufox, headless | Camoufox, headless "virtual" |
| --- | --- | --- | --- |
| HTTP version | h2 | h2 | h2 |
| JA4 | t13d1617h2\_86a278354501\_3cbfd9057e0d | t13d1517h2\_8daaf6152771\_3cbfd9057e0d | t13d1517h2\_8daaf6152771\_3cbfd9057e0d |
| Peetprint hash | fd4547eeb41f073156b7bc8125a79a3c | a4bbbc7e3adf3db97d276fd0adb1efc4 | a4bbbc7e3adf3db97d276fd0adb1efc4 |
| Akamai HTTP/2 fingerprint | 1:65536;2:0;4:131072;5:16384|12517377|0|m,p,a,s | 1:65536;2:0;4:131072;5:16384|12517377|0|m,p,a,s | 1:65536;2:0;4:131072;5:16384|12517377|0|m,p,a,s |
| Cipher suites / extensions | 16 / 17 | 15 / 17 | 15 / 17 |
| 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, path, authority, scheme, user-agent, accept, accept-language, accept-encoding, upgrade-insecure-requests, sec-fetch-dest, sec-fetch-mode, sec-fetch-site | method, path, authority, scheme, user-agent, accept, accept-language, accept-encoding, upgrade-insecure-requests, sec-fetch-dest, sec-fetch-mode, sec-fetch-site |

### What page scripts see

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

|  | Firefox, headless | Camoufox, headless | Camoufox, headless "virtual" |
| --- | --- | --- | --- |
| navigator.userAgent | Mozilla/5.0 (X11; Linux x86\_64; rv:150.0) Gecko/20100101 Firefox/150.0 | Mozilla/5.0 (X11; Linux x86\_64; rv:156.0) Gecko/20100101 Firefox/156.0 | Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:156.0) Gecko/20100101 Firefox/156.0 |
| navigator.platform / vendor | Linux x86\_64 / "" | Linux x86\_64 / "" | Win32 / "" |
| Languages | — | es-ES, es | en-ES, en |
| Timezone / locale | UTC / en-GB | Europe/Madrid / es-ES | Europe/Madrid / en-ES |
| Screen (w×h×availW×availH×depth) | 1280x720x1280x720x24 | 1920x1080x1920x1053x24 | 3440x1440x3440x1400x24 |
| Window outer / inner / DPR | 1280x720 / 1280x720 / 1 | 1280x806 / 1280x720 / 1 | 1280x805 / 1280x720 / 1 |
| hardwareConcurrency / deviceMemory | 64 / — | 12 / — | 8 / — |
| WebGL vendor | Mesa | AMD | Google Inc. (AMD) |
| WebGL renderer | llvmpipe, or similar | Radeon HD 3200 Graphics, or similar | ANGLE (AMD, Radeon R9 200 Series Direct3D11 vs\_5\_0 ps\_5\_0), or similar |
| WebGL version | WebGL 2.0 | WebGL 2.0 | WebGL 2.0 |
| WebGPU (navigator.gpu) | no | no | no |
| Canvas hash | 71eb6917 | 71bfd7ed | eb7fc317 |
| navigator.webdriver | yes | no | no |
| window.chrome / navigator.connection | no / no | no / no | no / no |
| Plugins / PDF viewer | 0 / no | 5 / yes | 5 / yes |
| Notification.permission / permissions.query | default / prompt | 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.

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

### bot.sannysoft.com

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

|  | Firefox, headless | Camoufox, headless | Camoufox, headless "virtual" |
| --- | --- | --- | --- |
| Checks / failed | 57 / 4 | 57 / 1 | 57 / 1 |
| Failed checks | WebDriver (New), Chrome (New), Plugins Length (Old), Plugins is of type PluginArray | Chrome (New) | Chrome (New) |

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

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

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

### Playwright over the remote connection

Which client features work on this side.

|  | Firefox, headless | Camoufox, headless | Camoufox, headless "virtual" |
| --- | --- | --- | --- |
| page.evaluate runs in the page's own world | yes | no | no |
| `main_world_eval` option (`mw:` prefix) | — | yes | yes |
| addInitScript visible to page scripts | yes | no | no |
| Console events | yes | yes | yes |
| Request interception (page.route) | yes | yes | yes |
| Screenshot | yes | yes | yes |
| PDF | no — Error: page.pdf: PDF generation is only supported for Headless Chromium | no — Error: page.pdf: PDF generation is only supported for Headless Chromium | no — Error: page.pdf: PDF generation is only supported for Headless Chromium |
| Mobile device emulation | no — Error: browser.newContext: options.isMobile is not supported in Firefox | no — Error: browser.newContext: options.isMobile is not supported in Firefox | no — Error: browser.newContext: options.isMobile is not supported in Firefox |
| Tracing | yes | 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-25T02:03:17.998Z",
  "sides": [
    {
      "label": "Firefox, headless",
      "engine": "firefox",
      "body": {
        "headless": true
      },
      "launch": {
        "browser": "firefox",
        "resource_class": "linux_headless",
        "weight": 1,
        "launch_ms": 938,
        "connect_ms": 152,
        "example_ms": 1553,
        "peet_ms": 1260
      },
      "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 (X11; Linux x86_64; rv:150.0) Gecko/20100101 Firefox/150.0",
        "platform": "Linux x86_64",
        "vendor": "",
        "languages": [
          "undefined"
        ],
        "hardware_concurrency": 64,
        "device_memory": null,
        "max_touch_points": 0,
        "webdriver": true,
        "plugins": 0,
        "pdf_viewer": false,
        "ua_data": null,
        "screen": "1280x720x1280x720x24",
        "window": {
          "outer": "1280x720",
          "inner": "1280x720",
          "dpr": 1
        },
        "timezone": "UTC",
        "locale": "en-GB",
        "webgl": {
          "vendor": "Mesa",
          "renderer": "llvmpipe, or similar",
          "version": "WebGL 2.0"
        },
        "canvas_hash": "71eb6917",
        "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": null,
      "sannysoft": {
        "checks": 57,
        "failed": 4,
        "failed_names": [
          "WebDriver (New)",
          "Chrome (New)",
          "Plugins Length (Old)",
          "Plugins is of type PluginArray"
        ],
        "passed": 27
      },
      "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": true,
        "init_script": true,
        "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
      },
      "browser_version": "150.0.2"
    },
    {
      "label": "Camoufox, headless",
      "engine": "camoufox",
      "body": {
        "headless": true,
        "main_world_eval": true
      },
      "launch": {
        "browser": "camoufox",
        "resource_class": "linux_headless",
        "weight": 1,
        "launch_ms": 1747,
        "connect_ms": 123,
        "example_ms": 2406,
        "peet_ms": 858
      },
      "network": {
        "http_version": "h2",
        "ja4": "t13d1517h2_8daaf6152771_3cbfd9057e0d",
        "ja3_hash": "9d42e90b0225e779f03141ddcd699df2",
        "peetprint_hash": "a4bbbc7e3adf3db97d276fd0adb1efc4",
        "ciphers": 15,
        "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 (X11; Linux x86_64; rv:156.0) Gecko/20100101 Firefox/156.0",
        "platform": "Linux x86_64",
        "vendor": "",
        "languages": [
          "es-ES",
          "es"
        ],
        "hardware_concurrency": 12,
        "device_memory": null,
        "max_touch_points": 0,
        "webdriver": false,
        "plugins": 5,
        "pdf_viewer": true,
        "ua_data": null,
        "screen": "1920x1080x1920x1053x24",
        "window": {
          "outer": "1280x806",
          "inner": "1280x720",
          "dpr": 1
        },
        "timezone": "Europe/Madrid",
        "locale": "es-ES",
        "webgl": {
          "vendor": "AMD",
          "renderer": "Radeon HD 3200 Graphics, or similar",
          "version": "WebGL 2.0"
        },
        "canvas_hash": "71bfd7ed",
        "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": true,
          "iterator_join": true,
          "iterator_zip": true,
          "fontface_width": true,
          "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 (X11; Linux x86_64; rv:156.0) Gecko/20100101 Firefox/156.0",
        "platform": "Linux x86_64",
        "vendor": "",
        "languages": [
          "es-ES",
          "es"
        ],
        "hardware_concurrency": 12,
        "device_memory": null,
        "max_touch_points": 0,
        "webdriver": false,
        "plugins": 5,
        "pdf_viewer": true,
        "ua_data": null,
        "screen": "1920x1080x1920x1053x24",
        "window": {
          "outer": "1280x806",
          "inner": "1280x720",
          "dpr": 1
        },
        "timezone": "Europe/Madrid",
        "locale": "es-ES",
        "webgl": {
          "vendor": "AMD",
          "renderer": "Radeon HD 3200 Graphics, or similar",
          "version": "WebGL 2.0"
        },
        "canvas_hash": "71bfd7ed",
        "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": true,
          "iterator_join": true,
          "iterator_zip": true,
          "fontface_width": true,
          "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": "156.0.1-beta.34"
    },
    {
      "label": "Camoufox, headless \"virtual\"",
      "engine": "camoufox",
      "body": {
        "headless": "virtual",
        "main_world_eval": true
      },
      "launch": {
        "browser": "camoufox",
        "resource_class": "linux_headful",
        "weight": 2,
        "launch_ms": 4861,
        "connect_ms": 18,
        "example_ms": 1037,
        "peet_ms": 1528
      },
      "network": {
        "http_version": "h2",
        "ja4": "t13d1517h2_8daaf6152771_3cbfd9057e0d",
        "ja3_hash": "9d42e90b0225e779f03141ddcd699df2",
        "peetprint_hash": "a4bbbc7e3adf3db97d276fd0adb1efc4",
        "ciphers": 15,
        "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:156.0) Gecko/20100101 Firefox/156.0",
        "platform": "Win32",
        "vendor": "",
        "languages": [
          "en-ES",
          "en"
        ],
        "hardware_concurrency": 8,
        "device_memory": null,
        "max_touch_points": 5,
        "webdriver": false,
        "plugins": 5,
        "pdf_viewer": true,
        "ua_data": null,
        "screen": "3440x1440x3440x1400x24",
        "window": {
          "outer": "1280x805",
          "inner": "1280x720",
          "dpr": 1
        },
        "timezone": "Europe/Madrid",
        "locale": "en-ES",
        "webgl": {
          "vendor": "Google Inc. (AMD)",
          "renderer": "ANGLE (AMD, Radeon R9 200 Series Direct3D11 vs_5_0 ps_5_0), or similar",
          "version": "WebGL 2.0"
        },
        "canvas_hash": "eb7fc317",
        "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": true,
          "iterator_join": true,
          "iterator_zip": true,
          "fontface_width": true,
          "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:156.0) Gecko/20100101 Firefox/156.0",
        "platform": "Win32",
        "vendor": "",
        "languages": [
          "en-ES",
          "en"
        ],
        "hardware_concurrency": 8,
        "device_memory": null,
        "max_touch_points": 5,
        "webdriver": false,
        "plugins": 5,
        "pdf_viewer": true,
        "ua_data": null,
        "screen": "3440x1440x3440x1400x24",
        "window": {
          "outer": "1280x805",
          "inner": "1280x720",
          "dpr": 1
        },
        "timezone": "Europe/Madrid",
        "locale": "en-ES",
        "webgl": {
          "vendor": "Google Inc. (AMD)",
          "renderer": "ANGLE (AMD, Radeon R9 200 Series Direct3D11 vs_5_0 ps_5_0), or similar",
          "version": "WebGL 2.0"
        },
        "canvas_hash": "eb7fc317",
        "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": true,
          "iterator_join": true,
          "iterator_zip": true,
          "fontface_width": true,
          "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": "156.0.1-beta.34"
    }
  ]
}
```

## Bottom line

Headless is where stock Firefox gives itself away most clearly: a window with no chrome, a screen the size of the page, a software GPU and an automation flag. Camoufox answers every one of those from the persona, in both of its headless modes.

The one thing Camoufox can't change is that it is Firefox: checks for Chrome, and sites that only serve Chromium, see Firefox either way.

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