Allow callers to inject pre-resolved timezone/locale into the
fingerprint before init_script generation. When provided, these
take priority over preset data.
In launch_options(), use setdefault for geoip timezone/locale keys
so that values pre-set via generate_context_fingerprint() aren't
overwritten by geoip resolution.
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* example files
* contributing guides
* simple service test
* run tests in sync
* update pr template
* pip updates
* Update README.md
* typo fixes
* undo pip package update lol
* upgraded service test
* undo injections
* test with proxies
* auto set timezone and proxy url
* delete checks bundle
* split up service tests
* split up build tests
* rename service tests to service tester
* Update CONTRIBUTING.md
* fix entry vs exit ip
* allow alpha versions
* fix patch issues on macos
* bidirectional patch
* Add note on experimental pip package
* 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>
- Removes the old data directory if Camoufox was installed before 0.5.0
- Fix messy sponsors segment & add repo status info at the top of the README
- Add camoufox/camoufox org as fallback
- Remove (experimental) next to the GeoIP by daijro source
- Format
- Rewrite `camoufox version` to show storage/path info and more python packages
- In camoufox active/set, show active channels. Fall back to original/stable if none is set
- Remove config files in `camoufox remove --all`
- Spoof the camoufox python library version in UI debug mode
- Fix scrollbar always showing on windows
- Other UI cleanup
This allow to pass to Camoufox library the executable-path
from the cli test command allowing to use a camoufox from a different
folder during development.
Example:
python -m camoufox test --executable-path="/tmp/camoufox/camoufox-bin"
If an exception is raised in the synchronous api during the setup, super().__enter__ has been called but super().__exit__ will not get called, leading to asyncio runloop exceptions further down the line if one tries to create a new context. This commit catches the exception in order to clean up the super().__exit__ calls before reraising.
passing a proxy to camoufox with the "bypass"-argument while using geoip=True runs into an exception.
extending the class attributes fixes the problem on my local machine