Why Camoufox exists
Modern anti-bots run Function.prototype.toString.call(fn) on every patched native function. If the result is anything other than [native code], the patch itself becomes the bot signal. This breaks playwright-stealth entirely: every override (navigator.webdriver, WebGLRenderingContext.prototype.getParameter, etc.) leaves a JS source signature visible to toString.
Camoufox patches the same things — canvas hash, WebGL renderer, AudioContext output, navigator quirks — but at the C++ level during build. The functions still return [native code] because they are native code. There is no JS injection, so there is nothing to detect via runtime inspection.
The geoip flag
Anti-bots run a coherence check across five identity vectors: IP country, WebRTC ICE candidate, DNS resolver location, timezone, and Accept-Language. A US proxy with a Pakistani DNS resolver fails before any browser fingerprint matters.
Camoufox's geoip=True automatically aligns all five vectors with the proxy's exit country. It resolves the proxy IP, looks up the country, and configures the browser accordingly — no manual setup. This single feature handles the most-overlooked detection layer in the entire stack.
Trade-offs vs alternatives
vs playwright-stealth: Camoufox addresses detection at a layer JS patches cannot reach. playwright-stealth is largely broken against modern anti-bots in 2026.
vs CloakBrowser (Chromium): Camoufox is Firefox; CloakBrowser is Chromium. Chromium has ~65% market share vs Firefox's ~3% — for sites that score browser market share, CloakBrowser is the better fit. CloakBrowser also passes Akamai's 60-extension probe by loading real extensions, which Camoufox does not address as natively.
vs real Chrome: a real Chrome on real hardware is the gold standard but does not scale to thousands of parallel sessions. Camoufox is the best headless option that still looks real.
What Camoufox patches at the C++ level
The patch surface goes well beyond navigator.webdriver. Because everything is compiled into the binary, each of these returns native values with no JS source signature to inspect:
- Navigator — device, OS, hardware concurrency, platform, vendor, and the full UA string
- Screen & viewport — resolution, available dimensions, color depth, device pixel ratio
- Canvas & WebGL — canvas hash, WebGL renderer/vendor, supported extensions, context attributes, and shader precision values
- Audio — AudioContext output and speech playback-rate parameters
- Fonts — the installed-font list, spoofed to match the target OS profile
- Geolocation & Intl — latitude/longitude, timezone, locale, and
Intlformatting - WebRTC — local and public ICE candidate IPs, spoofed at the protocol level rather than blocked
Fingerprint injection and rotation
Camoufox does not ship one hard-coded fingerprint. It integrates BrowserForge, which samples real-world device-characteristic distributions so every generated profile is internally consistent and statistically plausible — the screen size matches the device class, the WebGL renderer matches the platform, the fonts match the OS. You can let it auto-generate a profile, pin a specific one for session continuity, or pass your own via the fingerprint argument. The PyPI package handles injection automatically, so rotating identity across thousands of sessions is a config change, not a rebuild.
Built for AI agents
Camoufox markets itself as an open-source browser built for AI agents, and the build reflects that. It is a debloated Firefox with telemetry and background services stripped out, headless-first, and tuned for a cleaner DOM — no CSS-animation or telemetry noise — which makes pages cheaper for an LLM to read and reason over. Combined with the sub-200 MB footprint, that makes it practical to run many parallel agent sessions on modest hardware. The project stays synced with the latest Firefox releases; source has been public since the v146.0.1-beta.25 release in January 2026.
