Compare / versions
Camoufox 152 vs Camoufox 150
Both claim Firefox 152 and send the same TLS fingerprint — but on 152 Playwright's evaluate and init scripts run in an isolated world the page can't see, while on 150 they run in the page's own world.
The fleet runs Camoufox 152 by default (152.0.4-beta.30 today) and keeps 150 (150.0.2-beta.25) as a pinned version — {"version": "150"} — for reproducible personas. Both were launched headless with a Windows persona and main_world_eval through the same rotating proxy for this page. Camoufox generates a new persona on every launch — screen, GPU, canvas — and matches locale and timezone to the exit IP, so those differ between any two launches and aren't listed as version changes below. For Camoufox against Mozilla's own build, see Firefox vs Camoufox.
What changed for your scripts
- Playwright's code is hidden from the page on 152. On 152, a global set with
page.evaluate()orcontext.addInitScript()was invisible to the page's own scripts; on 150 the page saw both. 152 keeps Playwright in an isolated world, so a site can't find your probe's globals — but an init script meant to change what the page sees (a stub, a polyfill, a patched API) no longer reaches it. - Reaching the page's world on 152: launch with
"main_world_eval": trueand prefix the script with"mw:"—page.evaluate("mw:window.app.state"). The values read in both worlds matched on both versions here (timezone, languages, screen, WebGL). - Everything else in our Playwright probe behaved the same: console events, request routing, screenshots and tracing work on both;
page.pdf()and mobile emulation are Chromium-only on both.
What a site sees
| Camoufox 152 | Camoufox 150 | |
|---|---|---|
| User agent | Firefox/152.0 (rv:152.0), Windows. | Also Firefox/152.0 — the pinned 150 build presents itself as 152 by default. |
| TLS and HTTP/2 | JA4 t13d1617h2_86a278354501_3cbfd9057e0d. | Identical JA4 and HTTP/2 fingerprint. |
| Web platform features | The 28 features in our probe are the same on both — none gives the older engine away. | The same. |
| Persona | Generated per launch: here a 2560×1440 screen and an Intel HD Graphics renderer. | Here a 1920×1080 screen and Intel HD Graphics 400 — a different persona, not a different version. |
| Bot checks | bot.sannysoft.com flagged only the "Chrome (New)" test, which expects Chrome. | The same. |
Which one to use
- 152 (the default) if your scripts only read and click: Playwright stays invisible to the page.
- Pin 150 while an init script that changes the page's own world is part of your flow, and move it to
mw:evaluate calls before 150 rotates out. - Either way, keep one persona per identity: the persona changes on every launch, so use a persistent profile when a site must see the same device again.
Measured on the fleet (2026-10-15)
One headless launch of each with a Windows persona and main_world_eval, through the same rotating proxy, probed from inside a page (isolated and main world) and via tls.peet.ws. Locale, timezone and exit IP follow the proxy exit of each launch.
Launch and cost
Single run; timings depend on the proxy and on fleet load.
| Camoufox 152 | Camoufox 150 | |
|---|---|---|
| Launch body | {"headless":true,"os":"windows","main_world_eval":true} | {"headless":true,"os":"windows","main_world_eval":true,"version":"150"} |
| Threads used | 1 (linux_headless) | 1 (linux_headless) |
| Browser version | 152.0.4-beta.30 | 150.0.2-beta.25 |
| Launch request → browser ready | 1.4 s | 2.9 s |
| Playwright connect | 0.0 s | 0.1 s |
| Load example.com | 7.2 s | 1.9 s |
| Load tls.peet.ws/api/all | 1.0 s | 1.1 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 152 | Camoufox 150 | |
|---|---|---|
| HTTP version | h2 | h2 |
| JA4 | t13d1617h2_86a278354501_3cbfd9057e0d | t13d1617h2_86a278354501_3cbfd9057e0d |
| Peetprint hash | fd4547eeb41f073156b7bc8125a79a3c | fd4547eeb41f073156b7bc8125a79a3c |
| 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 |
| Cipher suites / extensions | 16 / 17 | 16 / 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 |
What page scripts see
Read with page.evaluate on example.com. Cores and memory are the server's and vary between fleet nodes.
| Camoufox 152 | Camoufox 150 | |
|---|---|---|
| navigator.userAgent | Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:152.0) Gecko/20100101 Firefox/152.0 | Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:152.0) Gecko/20100101 Firefox/152.0 |
| navigator.platform / vendor | Win32 / "" | Win32 / "" |
| Languages | pt-BR, pt | en-US, en |
| Timezone / locale | America/Sao_Paulo / pt | America/New_York / en-US |
| Screen (w×h×availW×availH×depth) | 2560x1440x2560x1440x24 | 1920x1080x1920x1032x24 |
| Window outer / inner / DPR | 2121x1191 / 1280x720 / 1 | 1936x1048 / 1280x720 / 1 |
| hardwareConcurrency / deviceMemory | 16 / — | 16 / — |
| WebGL vendor | Google Inc. (Intel) | Google Inc. (Intel) |
| WebGL renderer | ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar | ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar |
| WebGL version | WebGL 2.0 | WebGL 2.0 |
| WebGPU (navigator.gpu) | no | no |
| Canvas hash | 2decd802 | f8270103 |
| navigator.webdriver | no | no |
| window.chrome / navigator.connection | no / no | no / no |
| 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 152 | Camoufox 150 | |
|---|---|---|
Iterator.prototype.includes (new in Chrome 154) | no | no |
FontFace.width (new in Chrome 154) | no | no |
CSS text-decoration-inset (new in Chrome 154) | yes | yes |
Iterator.prototype.join (Chrome 153) | no | no |
Iterator.zip (Chrome 153) | yes | yes |
CSS scroll-axis-lock (Chrome 153) | no | no |
<camera> element (Chrome 153) | no | no |
document.requestStorageAccessFor (deprecated in 153) | no | no |
Topics API (document.browsingTopics) | no | no |
Protected Audience (navigator.joinAdInterestGroup) | no | no |
Shared Storage (window.sharedStorage) | no | no |
Attribution Reporting (window.attributionReporting) | no | no |
| Private Aggregation | no | no |
WebHID (navigator.hid) | no | no |
CSS margin-trim (Chrome 155) | no | no |
CSS text-decoration-skip-spaces (Chrome 155) | no | no |
CSS corner shorthand (Chrome 155) | no | no |
CSS symbols() (Chrome 155) | yes | yes |
Element.streamAppendHTML (Chrome 155) | no | no |
WebTransport.reliability (Chrome 155) | yes | yes |
window.maximize() — Additional Windowing Controls (Chrome 155) | no | no |
Canvas srgb-linear colour space (Chrome 155) | 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) — removal starts in 157 | no | no |
rel=compression-dictionary (Chrome 156 updates) | no | no |
bot.sannysoft.com
The classic headless-detection test page; what it marks red.
| Camoufox 152 | Camoufox 150 | |
|---|---|---|
| Checks / failed | 57 / 1 | 57 / 1 |
| Failed checks | 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?
| Camoufox 152 | Camoufox 150 | |
|---|---|---|
| Final URL | http://ip-api.com/json/?fields=status | Error: page.goto: Navigation to "http://ip-api.com/json/?fields=status" is interrupted by another navigation to "http://ip-api.com/json/?fields=status" |
| HTTP status | 200 | — |
| Content loaded / warning page first | yes / no | — / — |
Playwright over the remote connection
Which client features work on this side.
| Camoufox 152 | Camoufox 150 | |
|---|---|---|
| page.evaluate runs in the page's own world | no | yes |
main_world_eval option (mw: prefix) | yes | yes |
| addInitScript visible to page scripts | no | yes |
| Console events | yes | yes |
| Request interception (page.route) | yes | yes |
| Screenshot | yes | yes |
| 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 |
| 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-15T01:19:44.832Z",
"sides": [
{
"label": "Camoufox 152",
"engine": "camoufox",
"body": {
"headless": true,
"os": "windows",
"main_world_eval": true
},
"launch": {
"browser": "camoufox",
"resource_class": "linux_headless",
"weight": 1,
"launch_ms": 1439,
"connect_ms": 38,
"example_ms": 7239,
"peet_ms": 980
},
"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": [
"pt-BR",
"pt"
],
"hardware_concurrency": 16,
"device_memory": null,
"max_touch_points": 0,
"webdriver": false,
"plugins": 5,
"pdf_viewer": true,
"ua_data": null,
"screen": "2560x1440x2560x1440x24",
"window": {
"outer": "2121x1191",
"inner": "1280x720",
"dpr": 1
},
"timezone": "America/Sao_Paulo",
"locale": "pt",
"webgl": {
"vendor": "Google Inc. (Intel)",
"renderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar",
"version": "WebGL 2.0"
},
"canvas_hash": "2decd802",
"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": [
"pt-BR",
"pt"
],
"hardware_concurrency": 16,
"device_memory": null,
"max_touch_points": 0,
"webdriver": false,
"plugins": 5,
"pdf_viewer": true,
"ua_data": null,
"screen": "2560x1440x2560x1440x24",
"window": {
"outer": "2121x1191",
"inner": "1280x720",
"dpr": 1
},
"timezone": "America/Sao_Paulo",
"locale": "pt",
"webgl": {
"vendor": "Google Inc. (Intel)",
"renderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar",
"version": "WebGL 2.0"
},
"canvas_hash": "2decd802",
"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": "Camoufox 150",
"engine": "camoufox",
"body": {
"headless": true,
"os": "windows",
"main_world_eval": true,
"version": "150"
},
"launch": {
"browser": "camoufox",
"resource_class": "linux_headless",
"weight": 1,
"launch_ms": 2941,
"connect_ms": 103,
"example_ms": 1932,
"peet_ms": 1134
},
"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": [
"en-US",
"en"
],
"hardware_concurrency": 16,
"device_memory": null,
"max_touch_points": 0,
"webdriver": false,
"plugins": 5,
"pdf_viewer": true,
"ua_data": null,
"screen": "1920x1080x1920x1032x24",
"window": {
"outer": "1936x1048",
"inner": "1280x720",
"dpr": 1
},
"timezone": "America/New_York",
"locale": "en-US",
"webgl": {
"vendor": "Google Inc. (Intel)",
"renderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar",
"version": "WebGL 2.0"
},
"canvas_hash": "f8270103",
"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": [
"en-US",
"en"
],
"hardware_concurrency": 16,
"device_memory": null,
"max_touch_points": 0,
"webdriver": false,
"plugins": 5,
"pdf_viewer": true,
"ua_data": null,
"screen": "1920x1080x1920x1032x24",
"window": {
"outer": "1936x1048",
"inner": "1280x720",
"dpr": 1
},
"timezone": "America/New_York",
"locale": "en-US",
"webgl": {
"vendor": "Google Inc. (Intel)",
"renderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar",
"version": "WebGL 2.0"
},
"canvas_hash": "f8270103",
"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": {
"error": "Error: page.goto: Navigation to \"http://ip-api.com/json/?fields=status\" is interrupted by another navigation to \"http://ip-api.com/json/?fields=status\""
},
"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,
"main_world_eval_option": true
},
"browser_version": "150.0.2-beta.25"
}
]
}Bottom line
For scraping, Camoufox 152 and 150 look the same on the wire and claim the same Firefox version; the change that matters is inside Playwright — on 152 your code runs out of the page's sight.