* feat: update timezone, geolocation, and locale spoofing patches - timezone-spoofing.patch: per-context timezone via per-realm DateTimeInfo - geolocation-spoofing.patch: CAMOU_CONFIG backwards compatibility for geolocation - locale-spoofing.patch: add camoucfg LOCAL_INCLUDES - anti-font-fingerprinting.patch: add RoverfoxStorageManager exports to moz.build * feat: per-context audio fingerprinting and screen spoofing patches - audio-fingerprint-manager.patch: per-context audio fingerprinting (all 6 API methods) - screen-spoofing.patch: per-context screen dimensions with global MaskConfig fallback - Disable webrtc-ip-spoofing.patch (will re-enable after fixing) - Remove screen-hijacker.patch (superseded by screen-spoofing.patch) * fix: add global MaskConfig hooks for navigator.platform, hardwareConcurrency, and timezone (#443) Fixes issue where global CAMOU_CONFIG settings for navigator.platform, navigator.hardwareConcurrency, and timezone were not applied in the main window Navigator (only WorkerNavigator was patched via fingerprint-injection.patch). * fix: run nsJSUtils::SetTimeZoneOverride() after SpiderMonkey has Initialized to prevent SIGSEGV * Add fingerprint improvements for PR #3 - navigator-spoofing.patch: Global config fixes for platform/hardwareConcurrency/timezone - timezone-spoofing.patch: Persistence across page navigation via SetNewDocument hook - audio-fingerprint-manager.patch: Full 6-method coverage with self-destruct pattern - screen-spoofing.patch: Per-context dimensions with self-destruct pattern - webrtc-ip-spoofing.patch: Re-enabled with getStats() sanitization + comprehensive IPv6 regex * fix: simplify userContextId to BrowsingContext + add per-context docs * feat(navigator): Add per-context spoofing (platform, oscpu, hardwareConcurrency) with global fallback + docs update. * fix(navigator): use 2-arg GetUint(key, value) for RoverfoxStorageManager * fix(navigator): header line count build error * fix(navigator): move NavigatorManager.cpp into SOURCES for leakage error * fix(navigator): more line count build errors * fix(navigator): include nsTHashMap and nsHashKeys.h before RoverfoxStorageManager * feat(webgl): per-context spoofing patch * fix(webgl): changed GetCanvasElement() to mCanvasElement() for firefox version * fix(webgl): remove coupled self-destruct * feat(canvas): per-context spoofing * feat(font-list): per-context spoofing * fix(font-list): use GetOwnerWindow() instead of GetOwner() * feat(speech): per-context spoofing * fix(speech): add /dom/base inside local_includes * fix(speech): changed context to avoid conflicts * feat(navigator): add WorkerNavigator hooks for per-context platform and hardwareConcurrency in workers * feat(timezone): add per-context timezone override to workers * fix(canvas): add OffscreenCanvas userContextId support and skip zero pixels in canvas noise * fix(screen): hook nsMediaFeatures GetDeviceSize for per-context matchMedia device-width/height * fix(webgl): add OffscreenCanvas userContextId fallback in WebGL GetUserContextId * fix(canvas): make canvas noise use proper format for BGRA toDataURL path * fix(canvas): line count fixes * docs: updated hardware per-context documentation * Final Per-Context Hardware Fingerprint Spoofing (#9) * feat(navigator): Add per-context spoofing (platform, oscpu, hardwareConcurrency) with global fallback + docs update. * fix(navigator): use 2-arg GetUint(key, value) for RoverfoxStorageManager * fix(navigator): header line count build error * fix(navigator): move NavigatorManager.cpp into SOURCES for leakage error * fix(navigator): more line count build errors * fix(navigator): include nsTHashMap and nsHashKeys.h before RoverfoxStorageManager * feat(webgl): per-context spoofing patch * fix(webgl): changed GetCanvasElement() to mCanvasElement() for firefox version * fix(webgl): remove coupled self-destruct * feat(canvas): per-context spoofing * feat(font-list): per-context spoofing * fix(font-list): use GetOwnerWindow() instead of GetOwner() * feat(speech): per-context spoofing * fix(speech): add /dom/base inside local_includes * fix(speech): changed context to avoid conflicts * feat(navigator): add WorkerNavigator hooks for per-context platform and hardwareConcurrency in workers * feat(timezone): add per-context timezone override to workers * fix(canvas): add OffscreenCanvas userContextId support and skip zero pixels in canvas noise * fix(screen): hook nsMediaFeatures GetDeviceSize for per-context matchMedia device-width/height * fix(webgl): add OffscreenCanvas userContextId fallback in WebGL GetUserContextId * fix(canvas): make canvas noise use proper format for BGRA toDataURL path * fix(canvas): line count fixes * docs: updated hardware per-context documentation * feat(screen): screen avail per context * fix(font): align userContextId resolution to BrowsingContext * fix(audio): align userContextId resolution to BrowsingContext * Avoid macos caching (#11) * the property to undefined before deleting * undo webrtc undefined * feat: userContextId added to WordCacheKey * fix: hunk line counts for macos cache changes * fix: add WorkerPrivate fallback in OffscreenCanvas * fix(audio): transformation added to mSharedChannels path to ensure consistency * fix(webgl): added WorkerPrivate to ucid * fix(timezone): add ucid=0 fallback for worker timezone resolution * fix(audio): move seed lookup outside window guard for all 6 hooks * fix(canvas): add ucid=0 fallback and WorkerPrivate resolution for workers * fix(navigator): add setNavigatorUserAgent and ucid=0 fallback and WorkerNavigator for UA spoofing fix * fix(webgl): add ucid=0 fallback and WorkerPrivate resolution * fix(webgl): decouple vendor/renderer self-destruct * fix(navigator): add main-thread navigator.userAgent getter hook * fix(navigator): add MaskConfig hook for navigator.appVersion in main window * feat: Add Chakra Petch font for macOS to solidify detection on CreepJS * fix(fontconfig): rename to match Go launcher, add TTC aliases and update .gitignore * fix(navigator): oscpu missing MaskConfig global fallback * feat: add real fingerprint presets (65 firefox profiles) - mainly to test with, more will come when tested. * feat: use real fingerprint presets as default with BrowserForge as fallback * feat: add audio:seed and canvas:seed to property schema and validation * feat: add MaskConfig fallback to seed managers for cross-process worker consistency - don't need to disable fission * fix(font): moved mUserContextId declaration before mRounding in WordCacheKey so init order matches * fix(audio): line count correction * fix(canvas): line count fix * feat: add per-context fingerprinting API (NewContext/AsyncNewContext) + merge upstream - fix seed range - add oscpu derivation from platform, and timezone mapping in from_preset() - new real fingerprints preset support * feat: new presets + en-US only, stripped fonts/language, clamp DPR * feat: random 30-78% font subset generation for NewBrowser and NewContext * fix: add fission.autostart=true to camoufox.cfg - will be changing this soon with new update so processCount is not 1, so it will be undetectable * fix: update macos fonts.conf rendering settings * feat: cross-process fingerprint storage via Firefox Preferences API Replace RoverfoxStorageManager's per-process static HashMap with Firefox's built-in Preferences system. Values stored as CString prefs under "roverfox.s." namespace, auto-synced to all content processes by Firefox. Content processes can't set prefs directly (ENSURE_PARENT_PROCESS), so a single IPDL message (RoverfoxStoragePut) routes writes through the parent. Same public API — all 10 dependent patches require zero changes. Removes dom.ipc.processCount=1 from camoufox.cfg. Firefox now uses Playwright's default multi-process model (fresh process per page) with fission enabled, while fingerprint values remain accessible everywhere. * fix(cross-process): hunk headers and build fixes * fix(storage): add local write-through cache to RoverfoxStorageManager * fix(storage): add sync IPC read fallback for cross-process fingerprint propagation * fix(storage): add NS_IsMainThread guard to sync IPC fallback - prevent crashes * fix(storage): sync IPC + pref whitelist for cross-process fingerprint sync * feat: full documentation update, speech voices generated per context and BrowserForge primary fingerprint generation method for global and per context. * fix: Direct3D NVIDIA GTX 980 renderers incorrectly appearing on mac because of duplicates * Update .gitignore --------- Co-authored-by: PopcornDev1 <e.coiley@icloud.com> Co-authored-by: Build <build@local> Co-authored-by: Elliot Coiley <153072396+PopcornDev1@users.noreply.github.com>
Camoufox Python Interface
Lightweight wrapper around the Playwright API to help launch Camoufox.
Note
All the the latest documentation is avaliable here.
What is this?
This Python library wraps around Playwright's API to help automatically generate & inject unique device characteristics (OS, CPU info, navigator, fonts, headers, screen dimensions, viewport size, WebGL, addons, etc.) into Camoufox.
It uses BrowserForge under the hood to generate fingerprints that mimic the statistical distribution of device characteristics in real-world traffic.
In addition, it will also calculate your target geolocation, timezone, and locale to avoid proxy protection (see demo).
Installation
First, install the camoufox package:
pip install -U camoufox[geoip]
The geoip parameter is optional, but heavily recommended if you are using proxies. It will download an extra dataset to determine the user's longitude, latitude, timezone, country, & locale.
Next, download the Camoufox browser:
Windows
camoufox fetch
MacOS & Linux
python3 -m camoufox fetch
To uninstall, run camoufox remove.
Installing multiple Camoufox versions & from other repos
UI Manager
Manage installed browsers, active version, IP geolocation databases, and package info. Basically a Qt front end for the Python CLI tool.
More updates on it will be coming soon.
To use the gui, install Camoufox with the [gui] extra:
pip install 'camoufox[gui]'
To launch:
camoufox gui
CLI Mananger
Demonstration
https://github.com/user-attachments/assets/992b1830-6b21-4024-9165-728854df1473
See help message
$ python -m camoufox --help
Usage: python -m camoufox [OPTIONS] COMMAND [ARGS]...
╭─ Options ─────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰───────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ────────────────────────────────────────────────────────────────────────────╮
│ active Print the current active version │
│ fetch Install the active version, or a specific version │
│ gui Launch the Camoufox Manager GUI (requires PySide6) │
│ list List Camoufox versions │
│ path Print the install directory path │
│ remove Remove downloaded data. By default, this removes everything. │
│ Pass --select to pick a browser version to remove. │
│ server Launch a Playwright server │
│ set Set the active Camoufox version to use & fetch. │
│ By default, this opens an interactive selector for versions and settings. │
│ You can also pass a specifier to activate directly: │
│ Pin version: │
│ camoufox set official/stable/134.0.2-beta.20 │
│ Automatically find latest in a channel source: │
│ camoufox set official/stable │
│ sync Sync available versions from remote repositories │
│ test Open the Playwright inspector │
│ version Display version, package, browser, and storage info │
╰───────────────────────────────────────────────────────────────────────────────────────╯
sync
Pull a list of release assets from GitHub.
> camoufox sync
Syncing repositories...
Official... 24 versions
CoryKing... 2 versions
Synced 26 versions from 2 repos.
set
Choose a version channel or pin a specific version. Can also be called with a specifier to activate directly.
Interactive selector:
> camoufox set
You can also pass a specifier to pin a specific version or choose a channel to follow directly. This will pull the latest stable version from the official repo on camoufox fetch.
> camoufox set official/stable # Default setting
Follow latest prerelease version from the official repo, if applicable:
> camoufox set official/prerelease
Pin a specific version:
> camoufox set official/stable/134.0.2-beta.20
active
Prints the current active version string:
> camoufox active # Default channel is active
official/stable
> camoufox set coryking/stable/142.0.1-fork.26
Pinned: coryking/stable/142.0.1-fork.26
Run 'camoufox fetch' to install.
> camoufox active # A specific version is pinned
coryking/stable/142.0.1-fork.26 (not installed)
fetch
Install the latest version from the active channel. By default, this is official/stable. This will also automatically sync repository assets.
> camoufox fetch # Install the latest in the channel
To download the latest from a different channel, or pin a version:
> camoufox set coryking/stable
> camoufox fetch # Will download the latest release from CoryKing's repo for now on
Or pass in the identifier to download directly without activating it:
> camoufox fetch official/stable/135.0-beta.25 # Install a specific version
list
List installed or all available Camoufox versions as a tree.
> camoufox list # show installed versions
> camoufox list all # show all available versions from synced repos
> camoufox list --path # show full install paths
remove
By default, removes the entire camoufox data directory.
> camoufox remove
> camoufox remove -y # skip confirmation prompt
Remove a specific version:
> camoufox remove official/stable/134.0.2-beta.20
Interactively select a version to remove:
> camoufox remove --select
version
Display the Python package version, active browser version, channel, and update status.
> camoufox version
Python Packages
Camoufox v0.5.0
Browserforge v1.2.4
Apify Fingerprints v0.10.0
Playwright v1.57.1.dev0+g732639b35.d20251217
Browser
Active official/stable/135.0.1-beta.24
Current browser v135.0.1-beta.24
Installed Yes
Latest in official/stable? Yes
Last Sync 2026-03-07 00:23
GeoIP
Database MaxMind GeoLite2
Updated 2026-03-07 00:24
Storage
Install path /home/name/.cache/camoufox
Browser(s) directory size 1.2 GB
GeoIP database size 40.7 MB
Config file /home/name/.cache/camoufox/config.json
Repo cache /home/name/.cache/camoufox/repo_cache.json
path
Print the install directory path.
> camoufox path
/home/name/.cache/camoufox
test
Open Camoufox with the Playwright inspector for debugging.
> camoufox test
> camoufox test https://example.com
server
Launch a remote Playwright server.
> camoufox server
Usage
All of the latest stable documentation is avaliable at camoufox.com/python.