Updates / Camoufox
Camoufox 156: Firefox 156 base, and humanized mouse moves no longer hang
The default Camoufox is now 156.0.1 (Firefox 156). A humanized mouse move can no longer hang the page, the TLS fingerprint changed, and 150/152 stay pinnable.
Camoufox stable · 152.0.4 → 156.0.1 · 2026-10-22
Every new Camoufox session now runs Camoufox 156.0.1-beta.36, built on Firefox 156.0.1, instead of 152.0.4-beta.30. Camoufox is based on Firefox source and not affiliated with Mozilla. The fleet moved on 2026-10-21 in drained batches, so running sessions were not switched mid-way. 152 and 150 remain available with "version".
New
- Firefox 156.0.1 underneath (Camoufox release notes, "Update to Firefox 156.0.1"). The user agent now says
rv:156.0/Firefox/156.0. - New web platform APIs that pages can feature-test:
Iterator.prototype.includes,Iterator.prototype.joinandFontFace.width.
Removed or changed
- Humanized mouse moves no longer hang. On 152, a move with
humanizeon could wait forever when a point of its path landed exactly on the viewport's left or top edge, and every later mouse action on that page waited too (camoufox#751). Measured on our canary before the rollout: 0 hangs in 240 humanized moves and 80 clicks across 40 sessions on 156, against a hang in each of 20 sessions on 152 with the same script. The release notes also change how humanized moves are paced ("Pace humanized moves on their own schedule"). - Pinned older versions keep the old behaviour.
"version": "152"or"150"still runs those builds, including the humanize hang: use the default version, give humanized moves a timeout, or set"humanize": falsethere. - Canvas is still re-randomised per launch, as on 152 (case 49 and case 66): don't expect the same canvas hash from two sessions.
What sites see / detection
- The TLS fingerprint changed: the ClientHello offers 15 cipher suites instead of 16, so the JA4 hash and the full TLS fingerprint hash are new. A site that keys on an exact JA4 sees a different Firefox build; the HTTP/2 fingerprint is unchanged.
- Bot checks unchanged: bot.sannysoft.com flagged one check before and after.
- Persona values in the table below (OS, WebGL, languages, screen) differ because Camoufox draws a new persona for every launch, not because of the version. Use
os,locale,screenorwebgl_configto pin them.
For scraping
- Nothing to change in your code: the launch options, Playwright 1.60 client and
wsUrlare the same. - If you pinned a JA4 or a full user agent string somewhere (an allowlist, a test), update it to 156.
- In a quiet container (our measurement before the rollout), browser memory barely moved, 808 MB on 156 vs 788 MB on 152, and the median launch took 981 ms vs 843 ms. On the busy fleet, launch time depends far more on load than on the version.
Measured on the fleet
The same probe ran against 152.0.4 and 156.0.1 on the fleet, each when it went live: identity, TLS and HTTP/2 fingerprint, web platform features, Playwright features and bot checks. Host-dependent values (cores, memory, timings) are left out. Camoufox draws a new persona per launch, so the identity and fingerprint rows mostly show two different personas; the version shows in the user agent's rv: and in the TLS rows. Feature labels name the Chrome version that introduced each API.
What the site sees: identity
| Before | After | |
|---|---|---|
| User agent | Mozilla/5.0 (X11; Linux x86_64; rv:152.0) Gecko/20100101 Firefox/152.0 | Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:156.0) Gecko/20100101 Firefox/156.0 |
| Platform | Linux x86_64 | Win32 |
Network fingerprint
| Before | After | |
|---|---|---|
| JA4 | t13d1617h2_86a278354501_3cbfd9057e0d | t13d1517h2_8daaf6152771_3cbfd9057e0d |
| Peetprint hash | fd4547eeb41f073156b7bc8125a79a3c | a4bbbc7e3adf3db97d276fd0adb1efc4 |
| Ciphers | 16 | 15 |
Web platform features added
Iterator.prototype.includes(new in Chrome 154)Iterator.prototype.join(Chrome 153)FontFace.width(new in Chrome 154)
Fingerprint values
| Before | After | |
|---|---|---|
| WEBGL | {"vendor":"Intel","renderer":"Intel(R) HD Graphics 400, or similar","version":"WebGL 2.0"} | {"vendor":"Google Inc. (NVIDIA)","renderer":"ANGLE (NVIDIA, NVIDIA GeForce GTX 980 Direct3D11 vs_5_0 ps_5_0), or similar","version":"WebGL 2.0"} |
| Canvas hash | f4be1a2d | 72464cc9 |
| Languages | ["en-US","en"] | ["pt-BR","pt"] |
| Screen | 1920x1200x1920x1200x24 | 2176x1224x2176x1176x24 |
Raw diff
{
"engine": "camoufox",
"label": "stable",
"from": "152.0.4",
"to": "156.0.1",
"browser_version": {
"before": "152.0.4-beta.30",
"after": "156.0.1-beta.36"
},
"changes": {
"identity": [
{
"field": "user_agent",
"before": "Mozilla/5.0 (X11; Linux x86_64; rv:152.0) Gecko/20100101 Firefox/152.0",
"after": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:156.0) Gecko/20100101 Firefox/156.0"
},
{
"field": "platform",
"before": "Linux x86_64",
"after": "Win32"
}
],
"network": [
{
"field": "ja4",
"before": "t13d1617h2_86a278354501_3cbfd9057e0d",
"after": "t13d1517h2_8daaf6152771_3cbfd9057e0d"
},
{
"field": "peetprint_hash",
"before": "fd4547eeb41f073156b7bc8125a79a3c",
"after": "a4bbbc7e3adf3db97d276fd0adb1efc4"
},
{
"field": "ciphers",
"before": 16,
"after": 15
}
],
"features": {
"added": [
{
"key": "iterator_includes",
"label": "`Iterator.prototype.includes` (new in Chrome 154)"
},
{
"key": "iterator_join",
"label": "`Iterator.prototype.join` (Chrome 153)"
},
{
"key": "fontface_width",
"label": "`FontFace.width` (new in Chrome 154)"
}
],
"removed": []
},
"playwright": {
"broke": [],
"fixed": []
},
"fingerprint": [
{
"field": "webgl",
"before": {
"vendor": "Intel",
"renderer": "Intel(R) HD Graphics 400, or similar",
"version": "WebGL 2.0"
},
"after": {
"vendor": "Google Inc. (NVIDIA)",
"renderer": "ANGLE (NVIDIA, NVIDIA GeForce GTX 980 Direct3D11 vs_5_0 ps_5_0), or similar",
"version": "WebGL 2.0"
}
},
{
"field": "canvas_hash",
"before": "f4be1a2d",
"after": "72464cc9"
},
{
"field": "languages",
"before": [
"en-US",
"en"
],
"after": [
"pt-BR",
"pt"
]
},
{
"field": "screen",
"before": "1920x1200x1920x1200x24",
"after": "2176x1224x2176x1176x24"
}
],
"bot_checks": {
"newly_failed": [],
"newly_passed": [],
"failed_before": 1,
"failed_after": 1
},
"plain_http": [],
"launch": {
"before_ms": 2978,
"after_ms": 14302
}
},
"host_dependent_ignored": [
"hardware_concurrency",
"device_memory",
"launch/connect/page timings"
]
}