- Camoufox OS default + introspection:
interceptor_camoufox_launchnow defaults fingerprint generation to the host OS instead of Camoufox's upstream random OS list, while still allowing explicitosoverrides. Launch/list/info responses now include a safe fingerprint summary (resolved OS, UA, platform, OSCPU, screen/window, WebGL, font/voice counts) without exposing raw Camoufox config or process environment.
- Camoufox MCP parity:
camoufox_*targets now work with console and cookie listing throughinterceptor_browser_list_console,interceptor_browser_list_cookies, andinterceptor_browser_get_cookie. This brings the browser-tier tooling in line with the existing shared navigate/snapshot/screenshot/evaluate/injection/humanizer path.
Host requirement change: pip install "cloverlabs-camoufox[geoip]" + python3 -m camoufox fetch official/150.0.2-alpha.26 (cloverlabs's repos.yml still gates the Official line at browser.min=beta.19, so bare fetch would otherwise land v135).
Motivation: daijro/camoufox PyPI line was inactive for ~7 months and pinned at Firefox 135. DataDome and other Akamai/PerimeterX-class WAFs classify FF135 as outdated and serve unsolvable captcha challenges (rt:c) instead of the auto-solvable interstitial (rt:i). Cloverlabs is the active fork with CONSTRAINTS.MIN_VERSION='alpha.1', drop-in camoufox import namespace.
The camoufox dep swap to cloverlabs-camoufox 0.6.0 + Firefox 150 (chore branch cloverlabs-camoufox-v150) removes the Juggler-scope JS isolation that daijro/FF135 provided. Both interceptor_browser_evaluate (any world) and interceptor_browser_inject_init_script now run in the page's main world.
Consequences for callers:
inject_init_scriptpatches NOW reach the page (Object.defineProperty(navigator, 'webdriver', ...)actually affects what site scripts see) — the camoufox#48 limitation no longer applies on this build. The trade: those patches are observable by anti-bot code viaFunction.prototype.toStringandwindowenumeration.interceptor_browser_evaluatemutations (writes towindow, prototype patches) become observable to page scripts. Read-only evals stay safe.world: "main"andworld: "isolated"accept the same script args for API compatibility but run in the same realm on cloverlabs/FF150.main_world_eval: truestill gates explicitworld: "main"calls; once enabled, themw:prefix does not create a separate realm on this build.
Tool descriptions, README "Worlds and isolation" section, and test/integration/browser-js-inject.test.ts were updated to reflect the new behavior. The probe at scripts/camoufox-world-probe.ts re-verifies the model on any installed build.
- 3 JS execution / injection tools, uniform across cloakbrowser + camoufox:
interceptor_browser_evaluate— run a JS file in the page (page.evaluate), return the JSON-serialised result. File body is wrapped as(__args) => { ... }so it canreturndirectly.world: "isolated"(default, stealthy) orworld: "main"(camoufox-only viamw:prefix; requiresmain_world_eval: trueat launch — detected up-front with a clear error message).interceptor_browser_inject_init_script— inject a JS file aspage.addInitScript, runs before every page script on next navigation. Safest stealth primitive on cloakbrowser; on camoufox runs in privileged Juggler scope and does NOT patch main world (camoufox#48) — the tool returns this caveat in its response.interceptor_browser_add_script_tag—page.addScriptTagwrapper. Marked DOM-visible / not stealth in the tool description and return payload.
- All three accept an absolute
script_path(no inline-source param). Per-backend stealth tradeoffs documented in the README "Browser DevTools-equivalents" section. camoufoxlaunch resultdetailsnow carriesmain_world_eval: booleanso downstream tools can branch on capability.
- Camoufox interceptor — anti-detect Firefox via Playwright WS. New
CamoufoxInterceptor(idcamoufox) spawnscamoufox.server.launch_server()as a Python subprocess, parses the emitted Websocket endpoint, and exposes it. ThewsUrlallows custom Playwright code viaawait firefox.connect(wsUrl). Proxy + NSS CA trust are pre-wired at launch time sogeoip: trueresolves locale/timezone from the proxy exit IP. - Follow-up releases bind
camoufox_*target IDs to the sharedinterceptor_browser_*andhumanizer_*MCP tool path; directfirefox.connect(wsUrl)remains available for custom Playwright code. - 4 new tools:
interceptor_camoufox_launch,interceptor_camoufox_info,interceptor_camoufox_list,interceptor_camoufox_close. Launch params expose camoufox's full fingerprint surface:os,webgl_config,fonts,humanize,headless,addons,main_world_eval,enable_cache,disable_coop,block_webrtc,block_webgl,block_images,locale,geoip,port,ws_path,python_executable,trust_proxy_cert, plus a rawconfigescape hatch. - New resource
proxy://camoufox/targets. Mirror ofproxy://browser/targetsfor camoufox instances.
- Original host requirements used the daijro/camoufox package line. Current Camoufox users should follow the cloverlabs/Firefox 150 install note in 3.3.0 above. NSS
certutil(libnss3-tools/nss-tools/brew install nss) is still required for proxy CA trust. - No new npm dependencies.
playwright-core(already a runtime dep for cloakbrowser) provides thefirefox.connect(wsUrl)client. - All proxy-side capabilities — traffic capture, TLS fingerprint capture, rules, header injection, mocks, sessions, replay, upstream chaining, JA3 spoofing — apply to camoufox automatically because the proxy sits in front of it.
- Transparent proxy + one-command mobile capture setup. New
transparentandmobiletool groups for Wi-Fi-AP-based mobile capture (DHCP/DNS/iptables redirect to the MITM proxy). Documented in the README "Mobile Capture (Transparent Proxy)" section.
- Humanizer layer rewritten as thin wrapper over cloakbrowser-patched Playwright. The custom Bezier/Fitts/WPM/bigram/typo code was duplicating (and fighting with) cloakbrowser's own
humanize: truelayer, and bypassed it by calling low-levelpage.keyboard.press— which dropped uppercase and symbol case. Engine now routes topage.click/page.mouse.*/page.keyboard.type, all patched by cloakbrowser with CDP-trusted Shift handling. - Tool params changed:
humanizer_click:move_duration_msremoved;timeout_msadded (default 15000).humanizer_type:wpmanderror_rateremoved;delay_msadded (optional passthrough tokeyboard.type).humanizer_scroll:duration_msremoved (single wheel event).humanizer_move:duration_msremoved.
src/humanizer/path.tsandsrc/humanizer/timing.tsdeleted.
- Uppercase and symbol typing now works. The old
page.keyboard.press("Shift+a")path produced lowercase output for some targets; cloakbrowser's patchedpage.keyboard.typeuses CDPInput.dispatchKeyEventwithisTrusted=trueand correct Shift framing.
interceptor_browser_list_cookiesfulloption: Passfull: trueto return full cookie values inline (capped at 20000 chars) under avaluefield, instead of the default truncatedvalue_preview. Overridesvalue_max_chars. Avoids round-tripping throughinterceptor_browser_get_cookieper entry when full bodies are needed.
- Browser stack swap:
chrome-launcher+ CDP →cloakbrowser+ Playwright. Stealth-patched Chromium with source-level C++ fingerprint patches replaces the hand-rolled stealth script +chrome-devtools-mcpsidecar.humanize: trueon by default. - Tools renamed. All
interceptor_chrome_*tools are nowinterceptor_browser_*. The 14interceptor_chrome_devtools_*tools are collapsed onto 9 Playwright-driven equivalents:interceptor_chrome_launch→interceptor_browser_launchinterceptor_chrome_close→interceptor_browser_closeinterceptor_chrome_navigate→interceptor_browser_navigateinterceptor_chrome_devtools_{snapshot,screenshot,list_console,list_cookies,get_cookie,list_storage_keys,get_storage_value,list_network_fields,get_network_field}→interceptor_browser_*
- Tools removed.
interceptor_chrome_cdp_info,interceptor_chrome_devtools_{pull_sidecar,attach,detach,navigate,list_network}are gone. There is no CDP surface and no session-binding step — tools taketarget_iddirectly. Network listing is now sourced from MITM proxy capture (always on). - Resources renamed.
proxy://chrome/primary→proxy://browser/primary,proxy://chrome/targets→proxy://browser/targets.proxy://chrome/devtools/sessionsand theproxy://chrome/{target_id}/cdptemplate are removed. - Tool count: 77 → 71.
- Locator-based
humanizer_click. No more guessing pixel coordinates. Acceptsselector(CSS/XPath),role+name,text, orlabel. Auto-waits for visible + enabled + stable + in-view before clicking. Falls back to rawx, yif no locator is given. - ARIA snapshots.
interceptor_browser_snapshotreturns a YAML-formatted role tree (via Playwrightlocator.ariaSnapshot), purpose-built for LLM page understanding. - Buffered console logging.
interceptor_browser_list_consolereads from a per-target in-memory buffer populated by Playwright'spage.on("console", ...)— no session binding needed.
- Added:
cloakbrowser@^0.3.24,playwright-core@^1.59. - Removed:
chrome-launcher,chrome-devtools-mcp(dynamic). - Node requirement raised to
>=20(cloakbrowser).
- Replace
interceptor_chrome_launchcalls withinterceptor_browser_launch(dropbrowservariant arg; cloakbrowser is the only browser). - Replace the attach → call → detach pattern from the old sidecar flow with direct
target_idparameters. - CDP-specific fields in
details(port,cdpHttpUrl, etc.) are gone; targets exposeurl,headless,humanize, etc. - Custom stealth script injection is redundant — cloakbrowser handles it at the C++ level.
- OkHttp fingerprint presets:
okhttp3,okhttp4, andokhttp5presets now produce authentic OkHttp TLS fingerprints, HTTP/2 frames, and User-Agent headers. Requiresimpit@0.13.0which ships the upstream OkHttp fingerprint support (apify/impit#416).
- Upgraded
impitfrom0.11.0to0.13.0.
proxy_search_session_bodies: New tool for full-text search inside HTTP request/response bodies stored in persistent sessions. Decompresses and searches actual body content (gzip, deflate, brotli), returning grep-like context snippets around each match. Supports pre-filtering by hostname, URL, method, status code, and content-type. Works with bothfullandpreviewcapture profiles (falls back to 4KB body previews when full bodies aren't available). Includes binary content detection, configurable context window, and scan/result limits for bounded resource usage.responseContentTypein session index: Session index entries now include the response content-type, enabling efficient pre-filtering without loading full records from disk. Backward compatible with existing sessions.
proxy_query_sessiondescription: Updated to clarify it searches metadata only and directs users toproxy_search_session_bodiesfor body content search.
- Session body decompression:
proxy_get_session_exchange(include_body: true)andproxy_export_harnow automatically decompress gzip/deflate/brotli response bodies using the storedcontent-encodingheader. Previously returned raw compressed bytes. Raw bytes preserved on disk for replay fidelity. - proxy_start + proxy_session_start conflict:
proxy_session_start()no longer throws when a session was already auto-started byproxy_start(persistence_enabled: true). Returns the existing active session with a descriptive note instead.
- TLS ClientHello passthrough: Documented that Chrome launched via
interceptor_chrome_launchforwards its original TLS ClientHello to upstream servers (authentic browser fingerprint, not the proxy's). Added verification steps and comparison table. - README restructure: Added table of contents, moved Setup/Install to the top, added session decompression and start-conflict notes to Sessions section.
- Initial public release on npm.