# Table of Contents
- [Introduction | Camoufox](#introduction-camoufox)
- [Stealth Performance | Camoufox](#stealth-performance-camoufox)
- [Installation | Camoufox](#installation-camoufox)
- [Features List | Camoufox](#features-list-camoufox)
- [Python Interface | Camoufox](#python-interface-camoufox)
- [Usage | Camoufox](#usage-camoufox)
- [Donate | Camoufox](#donate-camoufox)
- [GeoIP & Proxy Support | Camoufox](#geoip-proxy-support-camoufox)
- [Main World Execution | Camoufox](#main-world-execution-camoufox)
- [Remote Server | Camoufox](#remote-server-camoufox)
- [Virtual Display | Camoufox](#virtual-display-camoufox)
- [Passing Config | Camoufox](#passing-config-camoufox)
- [BrowserForge Integration | Camoufox](#browserforge-integration-camoufox)
- [Navigator | Camoufox](#navigator-camoufox)
- [Cursor Movement | Camoufox](#cursor-movement-camoufox)
- [Screen | Camoufox](#screen-camoufox)
- [Window | Camoufox](#window-camoufox)
- [Document | Camoufox](#document-camoufox)
- [Fonts | Camoufox](#fonts-camoufox)
- [HTTP Headers | Camoufox](#http-headers-camoufox)
- [Geolocation & Intl | Camoufox](#geolocation-intl-camoufox)
- [Media & Audio | Camoufox](#media-audio-camoufox)
- [WebRTC IP | Camoufox](#webrtc-ip-camoufox)
- [Miscellaneous | Camoufox](#miscellaneous-camoufox)
- [Addons | Camoufox](#addons-camoufox)
- [Voices | Camoufox](#voices-camoufox)
- [Build System | Camoufox](#build-system-camoufox)
- [Building in CLI | Camoufox](#building-in-cli-camoufox)
- [Fingerprint Injection | Camoufox](#fingerprint-injection-camoufox)
- [WebGL | Camoufox](#webgl-camoufox)
- [Development Tools | Camoufox](#development-tools-camoufox)
- [Building in Docker | Camoufox](#building-in-docker-camoufox)
- [Leak Debugging | Camoufox](#leak-debugging-camoufox)
- [Development | Camoufox](#development-camoufox)
- [Liability Disclaimer | Camoufox](#liability-disclaimer-camoufox)
- [Canvas | Camoufox](#canvas-camoufox)
- [Random Button Clicker](#random-button-clicker)
- [Canvas Fingerprinting Demo](#canvas-fingerprinting-demo)
- [Canvas Tests](#canvas-tests)
- [WebGL Research | Camoufox](#webgl-research-camoufox)
- [WebGL Fingerprinting - Camoufox](#webgl-fingerprinting-camoufox)
---
# Introduction | Camoufox
[#](https://camoufox.com/#introduction)
Introduction
====================================================

### An open source anti-detect browser with robust fingerprint injection. 🦊
[](https://trendshift.io/repositories/12224)
* * *
##### Warning
Camoufox is in active development! Releases are avaliable, but may not be suitable for production use.
[#](https://camoufox.com/#features)
Features
--------------------------------------------
* **Invisible to all anti-bot systems** 🎭
* Camoufox performs better than most commercial anti-bot browsers.
* **Fingerprint injection & rotation (without JS injection!)**
* All navigator properties (device, OS, hardware, browser, etc.) ✅
* Screen size, resolution, window, & viewport properties ✅
* Geolocation, timezone, locale, & Intl spoofing ✅
* WebRTC IP spoofing at the protocol level ✅
* Voices, speech playback rate, etc. ✅
* And much, much more!
* **Anti Graphical fingerprinting**
* Canvas anti-fingerprinting ✅
* WebGL parameters, supported extensions, context attributes, & shader precision formats ✅
* Font spoofing & anti-fingerprinting ✅
* **Quality of life features**
* Human-like mouse movement 🖱️
* Blocks & circumvents ads 🛡️
* No CSS animations 💨
* Debloated & optimized for memory efficiency ⚡
* [PyPi package](https://pypi.org/project/camoufox/)
for updates & auto fingerprint injection 📦
* Stays up to date with the latest Firefox version 🕓
Get started
python/
[](https://camoufox.com/python/)
* * *
[#](https://camoufox.com/#design-and-implementation)
Design and Implementation
------------------------------------------------------------------------------
The goal of Camoufox is to provide a robust, undetectable anti-fingerprinting solution that blends in with regular user traffic.
1\. Fingerprinting Protection
[](https://camoufox.com/#1-fingerprinting-protection)
Privacy-focused browsers and add-ons often become counterproductive by making users more identifiable through detectable modifications or JavaScript inspection. This, ironically, makes the user stand out by creating unique fingerprints, making them more susceptible to be tracked or flagged by anti-bot systems.
Camoufox solves this by operating at a lower level, using fingerprint rotation and crowdblending techniques by modifying device information in the C++ implementation instead of injecting JavaScript, which leaves a trail. Built on Firefox and research from the Tor project, LibreWolf, and Arkenfox, Camoufox aims to avoid common user identification methods to provide a robust, undetectable anti-fingerprinting.
2\. Crowdblending
[](https://camoufox.com/#2-crowdblending)
A design goal of Camoufox is to blend in with real world traffic. It must behave like a normal user and avoid all statistical fingerprinting, meaning there should _not_ be thousands of requests using the same device information on a large scale.
To achieve this, Camoufox uses [BrowserForge](https://github.com/daijro/browserforge)
to rotate device information such as the screen, OS, and hardware to mimic the statistical distribution of device characteristics in real-world traffic. Additionally, Camoufox uses a natural mouse movement algorithm to behave like a normal user.
3\. Stealth
[](https://camoufox.com/#3-stealth)
Finally, Camoufox should avoid all bot detection, of any kind, by any means. It should not inject any JavaScript into the page or manipulate the DOM in any way.
In Camoufox, all of Playwright's internal Page Agent Javascript is sandboxed and isolated from the main world. This makes it **impossible** for a page to detect the presence of Playwright/Juggler. In addition, data is intercepted at the C++ implementation level, making the changes undetectable through JavaScript inspection.
Why Firefox and not Chromium?
[](https://camoufox.com/#why-firefox-and-not-chromium)
Camoufox is built on top of Firefox instead of Chromium for these main reasons:
1. Chrome is bundled with certain features that Chromium does not have. Anti-bot providers can detect if you are using Chromium rather than Chrome. Since Chrome is closed source, patching Chrome is significantly more difficult.
2. CDP is more widely used and known, so it's a more common target for bot detection
3. Juggler operates on a lower level than CDP, making it less prone to JS leaks.
4. Firefox is more ideal for fingerprint rotation. More research has been made on Firefox for fingerprinting resistance than on Chromium.
Is Camoufox open source?
[](https://camoufox.com/#is-camoufox-open-source)
**Almost all** of Camoufox's code is publicly avaliable on GitHub. However, certain features like the [Canvas fingerprint rotation](https://camoufox.com/fingerprint/canvas/)
patch are closed source to prevent anti-bot providers from reverse engineering Camoufox.
If you'd like to build Camoufox without the closed source features, please refer to the [build guide](https://camoufox.com/development/buildcli/)
.
What's planned?
[](https://camoufox.com/#whats-planned)
* Continue research on potential leaks
* AI powered selector location
* Remote hosting Camoufox as a Playwright server
Contents
* [Features](https://camoufox.com/#features)
* [Design and Implementation](https://camoufox.com/#design-and-implementation)
Important Notice
----------------
Hello! In March 2025, I had a medical emergency and have been hospitalized since. I haven't been able to continue my work for some time.
I was previously updating Camoufox daily, and plan to return to that schedule as soon as I'm able. My goal is to have Camoufox back to its usual performance and be fully caught up by the end of 2025.
Thank you for your patience and understanding.
Ok!
---
# Stealth Performance | Camoufox
[#](https://camoufox.com/stealth/#stealth-performance)
Stealth Performance
==========================================================================
In Camoufox, all of Playwright's internal Page Agent Javascript is sandboxed and isolated. This makes it **impossible** for a page to detect the presence of Playwright through Javascript inspection.
### [#](https://camoufox.com/stealth/#tests)
Tests
Camoufox performs well against every major WAF I've tested. (Original test sites from [Botright](https://github.com/Vinyzu/botright/?tab=readme-ov-file#browser-stealth)
)
| Test | Status | Notes |
| --- | --- | --- |
| [**CreepJS**](https://abrahamjuliot.github.io/creepjs/) | ✔️ | 71.5%. Successfully spoofs all OS predictions. |
| [**Rebrowser Bot Detector**](https://bot-detector.rebrowser.net/) | ✔️ | All tests pass. |
| [**BrowserScan**](https://browserscan.net/) | ✔️ | 100%. Spoofs all geolocation & locale proxy detection. |
| **reCaptcha Score** | ✔️ | |
| ‣ [nopecha.com](https://nopecha.com/demo/recaptcha) | ✔️ | |
| ‣ [recaptcha-demo.appspot.com](https://recaptcha-demo.appspot.com/recaptcha-v3-request-scores.php) | ✔️ | 0.9 |
| ‣ [berstend.github.io](https://berstend.github.io/static/recaptcha/v3-programmatic.html) | ✔️ | 0.9 |
| **DataDome** | ✔️ | |
| ‣ [DataDome bot bounty](https://yeswehack.com/programs/datadome-bot-bounty#program-description) | ✔️ | All test sites pass. |
| ‣ [hermes.com](https://www.hermes.com/us/en/) | ✔️ | |
| **Imperva** | ✔️ | |
| ‣ [ticketmaster.es](https://www.ticketmaster.es/) | ✔️ | |
| **Cloudflare** | ✔️ | |
| ‣ [Turnstile](https://nopecha.com/demo/turnstile) | ✔️ | |
| ‣ [Interstitial](https://nopecha.com/demo/cloudflare) | ✔️ | |
| **WebRTC IP Spoofing** | ✔️ | |
| ‣ [Browserleaks WebRTC](https://browserleaks.net/webrtc) | ✔️ | Spoofs public IP correctly. |
| ‣ [CreepJS WebRTC](https://abrahamjuliot.github.io/creepjs/) | ✔️ | Spoofs Host & STUN IP correctly. |
| ‣ [BrowserScan WebRTC](https://www.browserscan.net/webrtc) | ✔️ | Spoofs Host & STUN IP correctly. |
| **Font Fingerprinting** | ✔️ | |
| ‣ [Browserleaks Fonts](https://browserleaks.net/fonts) | ✔️ | Rotates all metrics. |
| ‣ [CreepJS TextMetrics](https://abrahamjuliot.github.io/creepjs/tests/fonts.html) | ✔️ | Rotates all metrics. |
| [**Incolumitas**](https://bot.incolumitas.com/) | ✔️ | 0.8-1.0 |
| [**SannySoft**](https://bot.sannysoft.com/) | ✔️ | |
| [**Fingerprint.com**](https://fingerprint.com/products/bot-detection/) | ✔️ | |
| [**IpHey**](https://iphey.com/) | ✔️ | |
| [**Bet365**](https://www.bet365.com/#/AC/B1/C1/D1002/E79147586/G40/) | ✔️ | |
##### Warning
Camoufox does **not** support injecting Chromium fingerprints. Some WAFs (such as [Interstitial](https://nopecha.com/demo/cloudflare)
) test for Spidermonkey engine behavior, which is impossible to spoof.
Contents
* [Tests](https://camoufox.com/stealth/#tests)
---
# Installation | Camoufox
[#](https://camoufox.com/python/installation/#installation)
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.
### [#](https://camoufox.com/python/installation/#download-the-browser)
Download the browser
[Windows](https://camoufox.com/python/installation/#windows)
[MacOS](https://camoufox.com/python/installation/#macos)
[Linux](https://camoufox.com/python/installation/#linux)
`camoufox fetch`
To uninstall, run `camoufox remove`.
Usage
../usage/
[](https://camoufox.com/python/usage/)
* * *
### [#](https://camoufox.com/python/installation/#camoufox-cli)
Camoufox CLI
Options
[](https://camoufox.com/python/installation/#options)
`Usage: python -m camoufox [OPTIONS] COMMAND [ARGS]... Options: --help Show this message and exit. Commands: fetch Fetch the latest version of Camoufox path Display the path to the Camoufox executable remove Remove all downloaded files server Launch a Playwright server test Open the Playwright inspector version Display the current version`
Contents
* [Download the browser](https://camoufox.com/python/installation/#download-the-browser)
* [Camoufox CLI](https://camoufox.com/python/installation/#camoufox-cli)
---
# Features List | Camoufox
[#](https://camoufox.com/features/#features-list)
Features List
===============================================================
Below is a list of patches and features implemented in Camoufox.
* * *
### [#](https://camoufox.com/features/#fingerprint-spoofing)
Fingerprint spoofing
* Navigator properties spoofing (device, browser, locale, etc.)
* Support for emulating screen size, resolution, etc.
* Spoof WebGL parameters, supported extensions, context attributes, and shader precision formats.
* Spoof the CPU Canvas fingerprint by manipulating the anti-aliasing logic (closed source)
* Spoof inner and outer window viewport sizes
* Spoof AudioContext sample rate, output latency, and max channel count
* Spoof device voices & playback rates
* Spoof the amount of microphones, webcams, and speakers avaliable.
* Network headers (Accept-Languages and User-Agent) are spoofed to match the navigator properties
* WebRTC IP spoofing at the protocol level
* Geolocation, timezone, and locale spoofing
* Battery API spoofing
* etc.
### [#](https://camoufox.com/features/#stealth-patches)
Stealth patches
* Avoids main world execution leaks. All page agent javascript is sandboxed
* Avoids frame execution context leaks
* Fixes `navigator.webdriver` detection
* Fixes Firefox headless detection via pointer type ([#26](https://github.com/daijro/camoufox/issues/26)
)
* Removed potentially leaking anti-zoom/meta viewport handling patches
* Uses non-default screen & window sizes
* Re-enable fission content isolations
* Re-enable PDF.js
* Other leaking config properties changed
* Human-like cursor movement
### [#](https://camoufox.com/features/#anti-font-fingerprinting)
Anti font fingerprinting
* Automatically uses the correct system fonts for your User Agent
* Bundled with Windows, Mac, and Linux system fonts
* Prevents font metrics fingerprinting by randomly offsetting letter spacing
### [#](https://camoufox.com/features/#playwright-support)
Playwright support
* Custom implementation of Playwright for the latest Firefox
* Various config patches to evade bot detection
### [#](https://camoufox.com/features/#debloatoptimizations)
Debloat/Optimizations
* Stripped out/disabled _many, many_ Mozilla services. Runs faster than the original Mozilla Firefox, and uses less memory (200mb)
* Patches from LibreWolf & Ghostery to help remove telemetry & bloat
* Debloat config from PeskyFox, LibreWolf, and others
* Speed & network optimizations from FastFox
* Removed all CSS animations
* Minimalistic theming
* etc.
### [#](https://camoufox.com/features/#addons)
Addons
* Load Firefox addons without a debug server by passing a list of paths to the `addons` property
* Added uBlock Origin with custom privacy filters
* Addons are not allowed to open tabs
* Addons are automatically enabled in Private Browsing mode
* Addons are automatically pinned to the toolbar
* Fixes DNS leaks with uBO prefetching
### [#](https://camoufox.com/features/#python-interface)
Python Interface
* Automatically generates & injects unique device characteristics into Camoufox based on their real-world distribution
* WebGL fingerprint injection & rotation
* Uses the correct system fonts and subpixel antialiasing & hinting based on your target OS
* Avoid proxy detection by calculating your target geolocation, timezone, & locale from your proxy's target region
* Calculate and spoof the browser's language based on the distribution of language speakers in the proxy's target region
* Remote server hosting to use Camoufox with other languages that support Playwright
* Built-in virtual display buffer to run Camoufox headfully on a headless server
* Toggle image loading, WebRTC, and WebGL
* etc.
* * *
### [#](https://camoufox.com/features/#thanks-heart)
Thanks ❤️
The design and implementation of Camoufox was inspired by the following projects, in no particular order:
| Project | Contribution |
| --- | --- |
| [LibreWolf](https://gitlab.com/librewolf-community/browser/source) | Debloat patches & build system inspiration |
| [BetterFox](https://github.com/yokoffing/BetterFox) | Debloat & optimizations |
| [Ghostery](https://github.com/ghostery/user-agent-desktop) | Debloat reference |
| [TOR Browser](https://2019.www.torproject.org/projects/torbrowser/design/) | Anti fingerprinting reference |
| [Jamir-boop/minimalisticfox](https://github.com/Jamir-boop/minimalisticfox) | Inspired Camoufox's minimalistic theming |
| [nicoth-in/Dark-Space-Theme](https://github.com/nicoth-in/Dark-Space-Theme) | Camoufox's dark theme |
| [Playwright](https://github.com/microsoft/playwright/tree/main/browser_patches/firefox)
, [Puppeteer/Juggler](https://github.com/puppeteer/juggler) | Original Juggler implementation |
| [CreepJS](https://github.com/abrahamjuliot/creepjs)
, [Browserleaks](https://browserleaks.com/)
, [BrowserScan](https://www.browserscan.net/) | Valuable leak testing sites |
| [riflosnake/HumanCursor](https://github.com/riflosnake/HumanCursor) | Original human-like cursor movement algorithm |
Contents
* [Fingerprint spoofing](https://camoufox.com/features/#fingerprint-spoofing)
* [Stealth patches](https://camoufox.com/features/#stealth-patches)
* [Anti font fingerprinting](https://camoufox.com/features/#anti-font-fingerprinting)
* [Playwright support](https://camoufox.com/features/#playwright-support)
* [Debloat/Optimizations](https://camoufox.com/features/#debloatoptimizations)
* [Addons](https://camoufox.com/features/#addons)
* [Python Interface](https://camoufox.com/features/#python-interface)
* [Thanks ❤️](https://camoufox.com/features/#thanks-heart)
---
# Python Interface | Camoufox
[#](https://camoufox.com/python/#python-interface)
Python Interface
===================================================================
#### [#](https://camoufox.com/python/#lightweight-wrapper-around-the-playwright-api-to-help-launch-camoufox-rocket)
Lightweight wrapper around the Playwright API to help launch Camoufox. 🚀
* * *
Camoufox's Python library wraps around Playwright's API to help automatically generate & inject unique device characteristics into Camoufox such as the OS, device info, navigator, fonts, headers, screen/viewport size, addons, etc.
It uses [BrowserForge](https://github.com/daijro/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 detection.
Installation
installation/
[](https://camoufox.com/python/installation/)
Usage
usage/
[](https://camoufox.com/python/usage/)
---
# Usage | Camoufox
[#](https://camoufox.com/python/usage/#usage)
Usage
===================================================
Camoufox is fully compatible with your existing Playwright code. You only have to change your browser initialization:
[Sync API](https://camoufox.com/python/usage/#sync-api)
[Async API](https://camoufox.com/python/usage/#async-api)
`from camoufox.sync_api import Camoufox with Camoufox() as browser: page = browser.new_page() page.goto("https://example.com")`
* * *
[#](https://camoufox.com/python/usage/#parameters-list)
Parameters List
=======================================================================
**All Playwright Firefox launch options are accepted, along with the following:**
* * *
[#](https://camoufox.com/python/usage/#device-rotation)
Device Rotation
-----------------------------------------------------------------------
Camoufox will generate device information for you based on the following parameters.
os
[](https://camoufox.com/python/usage/#os)
**Type:** `Optional[ListOrString]`
Operating system to use for the fingerprint generation. Can be `"windows"`, `"macos"`, `"linux"`, or a list to randomly choose from. By default, Camoufox will randomly choose from a list of all three.
`# Use a specific OS with Camoufox(os="windows") as browser: ... # Randomly choose from a list of OS with Camoufox(os=["windows", "macos", "linux"]) as browser: ...`
fonts
[](https://camoufox.com/python/usage/#fonts)
**Type:** `Optional[List[str]]`
Fonts to load into Camoufox, in addition to the default fonts for the target `os`. Takes a list of font family names that are installed on the system.
Fonts & font fingerprinting
../../fingerprint/fonts/
[](https://camoufox.com/fingerprint/fonts/)
`custom_fonts = ["Arial", "Helvetica", "Times New Roman"] with Camoufox(fonts=custom_fonts) as browser: ...`
screen
[](https://camoufox.com/python/usage/#screen)
**Type:** `Optional[Screen]`
Constrains the screen dimensions of the generated fingerprint. Takes a `browserforge.fingerprints.Screen` instance.
While this sets the screen dimensions, it has very light impact on the size of the window. Sometimes the window will be larger, sometimes smaller.
`from browserforge.fingerprints import Screen constrains = Screen(max_width=1920, max_height=1080) with Camoufox(screen=constrains) as browser: ...`
webgl\_config
[](https://camoufox.com/python/usage/#webgl_config)
**Type:** `Optional[Tuple[str, str]]`
Use a specific WebGL vendor/renderer pair. Passed as a tuple of (vendor, renderer). The vendor & renderer combination must be supported for the target `os` or this will cause leaks.
Check [here](https://camoufox.com/webgl-research/)
for a list of Camoufox's supported vendor & renderer combinations.
`with Camoufox( webgl_config=("Apple", "Apple M1, or similar"), os="macos", ) as browser: ...`
config
[](https://camoufox.com/python/usage/#config)
**Type:** `Optional[Dict[str, Any]]`
If needed, individual Camoufox config properties can be overridden by passing them as a dictionary to the `config` parameter. This can be used to enable features that have not yet been implemented into the Python library.
##### warning
This is an advanced feature and should be used with caution. The Camoufox Python library is designed to populate these properties for you.
Passing config
../config/
[](https://camoufox.com/python/config/)
* * *
[#](https://camoufox.com/python/usage/#configuration)
Configuration
-------------------------------------------------------------------
Extra feature configuration and quality of life options.
humanize
[](https://camoufox.com/python/usage/#humanize)
**Type:** `Optional[Union[bool, float]]`
Humanize the cursor movement. Takes either `True`, or the MAX duration in seconds of the cursor movement. The cursor typically takes up to 1.5 seconds to move across the window.
Cursor movement info & demo
../../fingerprint/cursor-movement/
[](https://camoufox.com/fingerprint/cursor-movement/)
`# Enable humanization with default settings with Camoufox(humanize=True) as browser: ... # Set a custom max duration for cursor movement with Camoufox(humanize=2.0) as browser: ...`
headless
[](https://camoufox.com/python/usage/#headless)
**Type:** `Optional[Union[bool, Literal['virtual']]]`
Whether to run the browser in headless mode. Defaults to False. If you are running linux, passing 'virtual' will use Xvfb.
Virtual Display
../virtual-display/
[](https://camoufox.com/python/virtual-display/)
`# Run in headless mode with Camoufox(headless=True) as browser: ... # Run in headless mode on linux with Camoufox(headless="virtual") as browser: ...`
addons
[](https://camoufox.com/python/usage/#addons)
**Type:** `Optional[List[str]]`
List of Firefox addons to use. Must be paths to extracted addons.
To load an `.xpi` file, rename it to a `.zip` file, extract it, and pass the extracted folder.
`addons = ["/path/to/addon1", "/path/to/addon2"] with Camoufox(addons=addons) as browser: ...`
exclude\_addons
[](https://camoufox.com/python/usage/#exclude_addons)
**Type:** `Optional[List[DefaultAddons]]`
Exclude the default addons. Passed as a list of `camoufox.DefaultAddons` enums.
Default addons
../../fingerprint/addons/#default-addons
[](https://camoufox.com/fingerprint/addons/#default-addons)
window
[](https://camoufox.com/python/usage/#window)
**Type:** `Optional[Tuple[int, int]]`
Set the window size in (width, height) pixels. This will also set the `window.screenX` and `window.screenY` properties to position the window at the center of the generated screen.
Camoufox will automatically generate a window size for you. Using a fixed window size can lead to fingerprinting. Do not set the window size to a fixed value unless for debugging purposes.
`with Camoufox(window=(1282, 955)) as browser: ...`
main\_world\_eval
[](https://camoufox.com/python/usage/#main_world_eval)
**Type:** `Optional[bool]`
Whether to inject scripts into the main world when prefixed with `mw:`
`with Camoufox(main_world_eval=True) as browser: page = browser.new_page() page.goto("https://example.com") # Modify the DOM page.evaluate("mw:document.querySelector('h1').remove()")`
See more info
../main-world-eval/
[](https://camoufox.com/python/main-world-eval/)
enable\_cache
[](https://camoufox.com/python/usage/#enable_cache)
**Type:** `Optional[bool]`
Whether to cache previous pages, requests, etc. Disabled by default as it uses more memory.
Keeping this disabled will not allow you to use the `page.go_back()` or `page.go_forward()` methods.
`with Camoufox(enable_cache=True) as browser: ...`
persistent\_context
[](https://camoufox.com/python/usage/#persistent_context)
**Type:** `Optional[bool]`
Whether to create a persistent context. Requires `user_data_dir`.
`with Camoufox( persistent_context=True, user_data_dir='/path/to/profile/dir', ) as context: ...`
* * *
[#](https://camoufox.com/python/usage/#location--language)
Location & Language
------------------------------------------------------------------------------
Prevent proxy detection by matching your geolocation & locale with your target IP. This will populate the [Geolocation & Intl](https://camoufox.com/python/geoip/)
properties for you.
geoip
[](https://camoufox.com/python/usage/#geoip)
**Type:** `Optional[Union[str, bool]]`
Calculates longitude, latitude, timezone, country, & locale based on the IP address. Pass the target IP address to use, or `True` to find the IP address automatically.
Geolocation & Proxies
../geoip/
[](https://camoufox.com/python/geoip/)
`# Use a specific IP address with Camoufox(geoip="203.0.113.0", proxy=...) as browser: ... # Automatically find the IP address with Camoufox(geoip=True, proxy=...) as browser: ...`
locale
[](https://camoufox.com/python/usage/#locale)
**Type:** `Optional[Union[str, List[str]]]`
Locale(s) to use in Camoufox. Can be a list of strings, or a single string separated by a comma. The first locale in the list will be used for the Intl API.
`# Use a single locale with Camoufox(locale="en-US") as browser: ... # Generate a language based on the distribution of speakers the US with Camoufox(locale="US") as browser: ... # Use multiple accepted locales with Camoufox(locale=["en-US", "fr-FR", "de-DE"]) as browser: ... with Camoufox(locale="en-US,fr-FR,de-DE") as browser: ...`
* * *
[#](https://camoufox.com/python/usage/#toggles)
Toggles
-------------------------------------------------------
Shortcuts for common Firefox preferences and security toggles.
block\_images
[](https://camoufox.com/python/usage/#block_images)
**Type:** `Optional[bool]`
Blocks all requests to images. This can help save your proxy usage.
`with Camoufox(block_images=True) as browser: ...`
block\_webrtc
[](https://camoufox.com/python/usage/#block_webrtc)
**Type:** `Optional[bool]`
Blocks WebRTC entirely.
`with Camoufox(block_webrtc=True) as browser: ...`
block\_webgl
[](https://camoufox.com/python/usage/#block_webgl)
**Type:** `Optional[bool]`
Whether to block WebGL. To prevent leaks, only use this for special cases.
`with Camoufox(block_webgl=True) as browser: ...`
disable\_coop
[](https://camoufox.com/python/usage/#disable_coop)
**Type:** `Optional[bool]`
Disables the Cross-Origin-Opener-Policy (COOP). This allows elements in `cross-origin` iframes, such as the Turnstile checkbox, to be clicked.
`# Cloudflare turnstile example with Camoufox(disable_coop=True, window=(1280, 720)) as browser: page = browser.new_page() page.goto('https://nopecha.com/demo/cloudflare') page.wait_for_load_state(state="domcontentloaded") page.wait_for_load_state('networkidle') page.wait_for_timeout(5000) # 5 seconds page.mouse.click(210, 290) ...`
Camoufox will warn you if your passed configuration might cause leaks.
* * *
[#](https://camoufox.com/python/usage/#more-usage-docs)
More Usage Docs
-----------------------------------------------------------------------
Geolocation & Proxies
../geoip/
[](https://camoufox.com/python/geoip/)
Virtual Display
../virtual-display/
[](https://camoufox.com/python/virtual-display/)
Remote Server
../remote-server/
[](https://camoufox.com/python/remote-server/)
Contents
* [Device Rotation](https://camoufox.com/python/usage/#device-rotation)
* [Configuration](https://camoufox.com/python/usage/#configuration)
* [Location & Language](https://camoufox.com/python/usage/#location--language)
* [Toggles](https://camoufox.com/python/usage/#toggles)
* [More Usage Docs](https://camoufox.com/python/usage/#more-usage-docs)
---
# Donate | Camoufox
# Donate
========
# About Me
----------
I'm an independent web security researcher working from a dorm room at the University of Texas at Austin.
* * *
# Support Camoufox
------------------
If you'd like to support my work and my tuition, feel free to donate!
---
# GeoIP & Proxy Support | Camoufox
# GeoIP & Proxy Support
=======================
By passing `geoip=True`, or passing in a target IP address, Camoufox will automatically use the target IP's longitude, latitude, timezone, country, locale, & spoof the WebRTC IP address.
It will also calculate and spoof the browser's language based on the distribution of language speakers in the target region.

* * *
# Installation
--------------
Install Camoufox with the `geoip` extra:
pip install -U "camoufox[geoip]"
* * *
# Usage
-------
Pass in `geoip=True` with Playwright's `proxy` parameter:
with Camoufox(
geoip=True,
proxy={
'server': 'http://example.com:8080',
'username': 'username',
'password': 'password'
}
) as browser:
page = browser.new_page()
page.goto("https://www.browserscan.net")
---
# Main World Execution | Camoufox
# Main World Execution
======================
* * *
### # Reading the DOM - Isolated World
By default, all JavaScript execution is ran in an isolated scope, invisible to the page.
This makes it impossible for the page to detect JavaScript reading the DOM:
>>> page.goto("https://example.com/")
>>> page.evaluate("document.querySelector('h1').innerText")
'Example Domain'
However, your JavaScript will **not** be able to modify the DOM:
>>> page.evaluate("document.querySelector('h1').remove()")
# Will not work!
* * *
### # Modifying the DOM - Main World
To be able to modify the DOM, run JavaScript in the **main world**—the non-isolated scope.
##### Leak Warning
All code executed in the main world can be detected by the target website. Only execute JavaScript in the main world if absolutely necessary.
* * *
To enable main world execution, set the `main_world_eval` parameter to `True`:
with Camoufox(main_world_eval=True) as browser:
page = browser.new_page()
page.goto("https://example.com/")
Now, you can inject JavaScript in the main world by prefixing the code with `mw:`
>>> page.evaluate("mw:document.querySelector('h1').remove()")
# h1 is now removed!
You can also return JSON serializable data from the main world:
>>> page.evaluate("mw:{key: 'value'}")
{'key': 'value'}
##### Note
Returning references to nodes/elements from the main world is not supported, since Playwright's utilities do not run in the main world.
To retrieve node references, use the isolated world instead.
---
# Remote Server | Camoufox
# Remote Server
===============
##### Warning
Warning! This feature is experimental. It uses a hacky workaround to gain access to undocumented Playwright methods.
Camoufox can be ran as a remote websocket server. It can be accessed from other devices, and languages other than Python supporting the Playwright API.
* * *
# Launching
-----------
To launch a remote server, run the following CLI command:
python -m camoufox server
Or, configure the server with a launch script:
from camoufox.server import launch_server
launch_server(
headless=True,
geoip=True,
proxy={
'server': 'http://example.com:8080',
'username': 'username',
'password': 'password'
},
port=1234,
ws_path='hello'
)
The server's port and URL path will be defined using the `port` and `ws_path` parameters, or will be random if not defined.
Websocket endpoint: ws://localhost:1234/hello
All of the following parameters are also supported:
See parameters list
../usage/#parameters-list
[](https://camoufox.com/python/usage/#parameters-list)
* * *
# Connecting
------------
To connect to the remote server, use Playwright's `connect` method:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
# Example endpoint
browser = p.firefox.connect('ws://localhost:1234/hello')
page = browser.new_page()
...
##### Note
Because servers only use **one browser instance**, fingerprints will not rotate between sessions. If you plan on using Camoufox at scale, consider rotating the server between sessions.
---
# Virtual Display | Camoufox
# Virtual Display
=================
While Camoufox includes patches to prevent headless detection, running in headless mode may still be detectable in the future. It's recommended to use a virtual display buffer to run Camoufox headlessly.
If you are running Linux, and would like to run Camoufox headlessly in a virtual display, install `xvfb`:
sudo apt-get install xvfb
sudo pacman -S xorg-server-xvfb
#### # Confirm `Xvfb` is installed:
$ which Xvfb
/usr/bin/Xvfb
* * *
# Usage
-------
Passing `headless="virtual"` will spawn a new lightweight virtual display in the background for Camoufox to run in.
from camoufox.sync_api import Camoufox
with Camoufox(
headless="virtual"
) as browser:
page = browser.new_page()
page.goto("https://example.com")
from camoufox.async_api import AsyncCamoufox
async with AsyncCamoufox(
headless="virtual"
) as browser:
page = await browser.new_page()
await page.goto("https://example.com")
---
# Passing Config | Camoufox
# Passing Config
================
If needed, Camoufox [config data](https://github.com/daijro/camoufox?tab=readme-ov-file#fingerprint-injection)
can be overridden/passed as a dictionary to the `config` parameter. This can be used to enable features that have not yet been implemented into the Python library.
* * *
##### Warning
This isn't recommended, as Camoufox will populate this data for you automatically. See the [parameters list](https://camoufox.com/python/usage/#parameters-list)
for more proper usage.
from camoufox.sync_api import Camoufox
with Camoufox(
config={
'webrtc:ipv4': '123.45.67.89',
'webrtc:ipv6': 'e791:d37a:88f6:48d1:2cad:2667:4582:1d6d',
}
) as browser:
page = browser.new_page()
page.goto("https://www.browserscan.net/webrtc")
Camoufox will warn you if you are manually setting properties that the Python library handles internally.
---
# BrowserForge Integration | Camoufox
# BrowserForge Integration
==========================
Camoufox is compatible with [BrowserForge](https://github.com/daijro/browserforge)
fingerprints.
By default, Camoufox will generate an use a random BrowserForge fingerprint based on the target `os` & `screen` constraints.
from camoufox.sync_api import Camoufox
from browserforge.fingerprints import Screen
with Camoufox(
os=('windows', 'macos', 'linux'),
screen=Screen(max_width=1920, max_height=1080),
) as browser:
page = browser.new_page()
page.goto("https://example.com/")
If Camoufox is being ran in headful mode, the max screen size will be generated based on your monitor's dimensions unless otherwise specified.
##### Note
To prevent UA mismatch detection, Camoufox only generates fingerprints with the same browser version as the current Camoufox version by default. If rotating the Firefox version is absolutely necessary, it would be more advisable to rotate between older versions of Camoufox instead.
* * *
##### Warning
It is recommended to pass `os` & `screen` constraints into Camoufox instead. Camoufox will handle fingerprint generation for you. This will be deprecated in the future.
You can also inject your own Firefox BrowserForge fingerprint into Camoufox.
from camoufox.sync_api import Camoufox
from browserforge.fingerprints import FingerprintGenerator
fg = FingerprintGenerator(browser='firefox')
# Launch Camoufox with a random Firefox fingerprint
with Camoufox(fingerprint=fg.generate()) as browser:
page = browser.new_page()
page.goto("https://example.com/")
**Note:** As of now, some properties from BrowserForge fingerprints will not be passed to Camoufox. This is due to the outdated fingerprint dataset from Apify's fingerprint-suite (see [here](https://github.com/apify/fingerprint-suite/discussions/308)
). Properties will be re-enabled as soon as an updated dataset is available.
---
# Navigator | Camoufox
# Navigator
===========
Navigator properties can be fully spoofed to other Firefox fingerprints, and it is **completely safe**!
* * *
# Properties
------------
| Property | Type | Description |
| --- | --- | --- |
| `navigator.userAgent` | str | Browser and system information |
| `navigator.doNotTrack` | str | User's tracking preference |
| `navigator.appCodeName` | str | Browser's code name |
| `navigator.appName` | str | Browser's name |
| `navigator.appVersion` | str | Browser's version |
| `navigator.oscpu` | str | Operating system and CPU information |
| `navigator.language` | str | Preferred language of the user |
| `navigator.languages` | array | User's preferred languages |
| `navigator.platform` | str | Platform the browser is running on |
| `navigator.hardwareConcurrency` | uint | Number of logical processors |
| `navigator.product` | str | Product name of the browser |
| `navigator.productSub` | str | Build number of the browser |
| `navigator.maxTouchPoints` | uint | Maximum number of simultaneous touch contact points |
| `navigator.cookieEnabled` | bool | Whether cookies are enabled |
| `navigator.globalPrivacyControl` | bool | User's global privacy control preference |
| `navigator.buildID` | str | Build identifier of the browser |
| `navigator.onLine` | bool | Whether the browser is online |
* * *
##### Note
* **navigator.webdriver** is set to false at all times.
* `navigator.language` & `navigator.languages` will fall back to the `locale:language`/`locale:region` values if not set.
* When spoofing Chrome fingerprints, the following may leak:
* navigator.userAgentData missing.
* navigator.deviceMemory missing.
* Changing the presented Firefox version can be detected by some testing websites, but typically will not flag production WAFs.
---
# Cursor Movement | Camoufox
# Cursor Movement
=================
# Human-like Cursor movement
----------------------------
Camoufox has built-in support for human-like cursor movement. The natural motion algorithm was originally from [rifosnake's HumanCursor](https://github.com/riflosnake/HumanCursor)
, but has been rewritten in C++ and modified for more distance-aware trajectories.
* * *
# Properties
------------
| Property | Type | Description |
| --- | --- | --- |
| `humanize` | bool | Enable/disable human-like cursor movement. Defaults to False. |
| `humanize:maxTime` | double | Maximum time in seconds for the cursor movement. Defaults to `1.5`. |
| `humanize:minTime` | double | Minimum time in seconds for the cursor movement. |
| `showcursor` | bool | Toggles the cursor highlighter. Defaults to True. |
##### Note
The cursor highlighter is **not** ran in the page context. It will not be visible to the page. You don't have to worry about it leaking.
* * *
# Demo
------
Here is a demo of the cursor highlighter. The testing page for this can be found [here](https://camoufox.com/tests/buttonclick)
.
---
# Screen | Camoufox
# Screen
========
#### # Spoof the screen size, pixel depth, and position of the window.
* * *
# Properties
------------
| Property | Type | Description |
| --- | --- | --- |
| `screen.availHeight` | uint | Available height of the screen |
| `screen.availWidth` | uint | Available width of the screen |
| `screen.availTop` | uint | Y-coordinate of the top of the available area |
| `screen.availLeft` | uint | X-coordinate of the left of the available area |
| `screen.height` | uint | Total height of the screen |
| `screen.width` | uint | Total width of the screen |
| `screen.colorDepth` | uint | Color depth of the screen |
| `screen.pixelDepth` | uint | Pixel depth of the screen |
| `screen.pageXOffset` | double | Horizontal scroll position |
| `screen.pageYOffset` | double | Vertical scroll position |
* * *
##### Note
`screen.colorDepth` and `screen.pixelDepth` are synonymous.
---
# Window | Camoufox
# Window
========
#### # Spoof the inner/outer window size, scroll offsets, window position, history length, and more.
* * *
# Properties
------------
| Property | Type | Description |
| --- | --- | --- |
| `window.scrollMinX` | int | Minimum horizontal scroll offset |
| `window.scrollMinY` | int | Minimum vertical scroll offset |
| `window.scrollMaxX` | int | Maximum horizontal scroll offset |
| `window.scrollMaxY` | int | Maximum vertical scroll offset |
| `window.outerHeight` | uint | Total height of the browser window |
| `window.outerWidth` | uint | Total width of the browser window |
| `window.innerHeight` | uint | Height of the browser viewport |
| `window.innerWidth` | uint | Width of the browser viewport |
| `window.screenX` | int | Horizontal distance from the left border |
| `window.screenY` | int | Vertical distance from the top border |
| `window.history.length` | uint | Number of entries in the session history |
| `window.devicePixelRatio` | double | Ratio of physical pixels to CSS pixels |
* * *
##### Note
Setting the outer window viewport will cause some cosmetic defects to the Camoufox window if the user attempts to manually resize it. Under no circumstances will Camoufox allow the outer window viewport to be resized.
---
# Document | Camoufox
# Document
==========
Spoof the size of the HTML body element.
##### Warning
Spoofing document.body has been implemented, but it is more advisable to set `window.innerWidth` and `window.innerHeight` instead.
* * *
# Properties
------------
| Property | Type | Description |
| --- | --- | --- |
| `document.body.clientWidth` | uint | Width of the document's body |
| `document.body.clientHeight` | uint | Height of the document's body |
| `document.body.clientTop` | uint | Width of the top border of the document's body |
| `document.body.clientLeft` | uint | Width of the left border of the document's body |
---
# Fonts | Camoufox
# Fonts
=======
Fonts can be passed to be used in Camoufox through the `fonts` config property.
| Property | Type | Description |
| --- | --- | --- |
| `fonts` | array | List of font names to be used |
| `fonts:spacing_seed` | uint | Seed to use for font metric spacing randomziation |
* * *
By default, Camoufox is bundled with the default Windows 11 22H2 fonts, macOS Sonma fonts, and Linux fonts used in the TOR bundle. Camoufox will automatically add the default fonts associated your spoofed User-Agent OS (the value passed in `navigator.userAgent`):
Mac OS fonts (from macOS Sonma):
[".Al Bayan PUA", ".Al Nile PUA", ".Al Tarikh PUA", ".Apple Color Emoji UI", ".Apple SD Gothic NeoI", ".Aqua Kana", ".Aqua Kana Bold", ".Aqua かな", ".Aqua かな ボールド", ".Arial Hebrew Desk Interface", ".Baghdad PUA", ".Beirut PUA", ".Damascus PUA", ".DecoType Naskh PUA", ".Diwan Kufi PUA", ".Farah PUA", ".Geeza Pro Interface", ".Geeza Pro PUA", ".Helvetica LT MM", ".Hiragino Kaku Gothic Interface", ".Hiragino Sans GB Interface", ".Keyboard", ".KufiStandardGK PUA", ".LastResort", ".Lucida Grande UI", ".Muna PUA", ".Nadeem PUA", ".New York", ".Noto Nastaliq Urdu UI", ".PingFang HK", ".PingFang SC", ".PingFang TC", ".SF Arabic", ".SF Arabic Rounded", ".SF Compact", ".SF Compact Rounded", ".SF NS", ".SF NS Mono", ".SF NS Rounded", ".Sana PUA", ".Savoye LET CC.", ".ThonburiUI", ".ThonburiUIWatch", ".苹方-港", ".苹方-简", ".苹方-繁", ".蘋方-港", ".蘋方-簡", ".蘋方-繁", "Academy Engraved LET", "Al Bayan", "Al Nile", "Al Tarikh", "American Typewriter", "Andale Mono", "Apple Braille", "Apple Chancery", "Apple Color Emoji", "Apple SD Gothic Neo", "Apple SD 산돌고딕 Neo", "Apple Symbols", "AppleGothic", "AppleMyungjo", "Arial", "Arial Black", "Arial Hebrew", "Arial Hebrew Scholar", "Arial Narrow", "Arial Rounded MT Bold", "Arial Unicode MS", "Athelas", "Avenir", "Avenir Black", "Avenir Black Oblique", "Avenir Book", "Avenir Heavy", "Avenir Light", "Avenir Medium", "Avenir Next", "Avenir Next Condensed", "Avenir Next Condensed Demi Bold", "Avenir Next Condensed Heavy", "Avenir Next Condensed Medium", "Avenir Next Condensed Ultra Light", "Avenir Next Demi Bold", "Avenir Next Heavy", "Avenir Next Medium", "Avenir Next Ultra Light", "Ayuthaya", "Baghdad", "Bangla MN", "Bangla Sangam MN", "Baskerville", "Beirut", "Big Caslon", "Bodoni 72", "Bodoni 72 Oldstyle", "Bodoni 72 Smallcaps", "Bodoni Ornaments", "Bradley Hand", "Brush Script MT", "Chalkboard", "Chalkboard SE", "Chalkduster", "Charter", "Charter Black", "Cochin", "Comic Sans MS", "Copperplate", "Corsiva Hebrew", "Courier", "Courier New", "Czcionka systemowa", "DIN Alternate", "DIN Condensed", "Damascus", "DecoType Naskh", "Devanagari MT", "Devanagari Sangam MN", "Didot", "Diwan Kufi", "Diwan Thuluth", "Euphemia UCAS", "Farah", "Farisi", "Font Sistem", "Font de sistem", "Font di sistema", "Font sustava", "Fonte do Sistema", "Futura", "GB18030 Bitmap", "Galvji", "Geeza Pro", "Geneva", "Georgia", "Gill Sans", "Grantha Sangam MN", "Gujarati MT", "Gujarati Sangam MN", "Gurmukhi MN", "Gurmukhi MT", "Gurmukhi Sangam MN", "Heiti SC", "Heiti TC", "Heiti-간체", "Heiti-번체", "Helvetica", "Helvetica Neue", "Herculanum", "Hiragino Kaku Gothic Pro", "Hiragino Kaku Gothic Pro W3", "Hiragino Kaku Gothic Pro W6", "Hiragino Kaku Gothic ProN", "Hiragino Kaku Gothic ProN W3", "Hiragino Kaku Gothic ProN W6", "Hiragino Kaku Gothic Std", "Hiragino Kaku Gothic Std W8", "Hiragino Kaku Gothic StdN", "Hiragino Kaku Gothic StdN W8", "Hiragino Maru Gothic Pro", "Hiragino Maru Gothic Pro W4", "Hiragino Maru Gothic ProN", "Hiragino Maru Gothic ProN W4", "Hiragino Mincho Pro", "Hiragino Mincho Pro W3", "Hiragino Mincho Pro W6", "Hiragino Mincho ProN", "Hiragino Mincho ProN W3", "Hiragino Mincho ProN W6", "Hiragino Sans", "Hiragino Sans GB", "Hiragino Sans GB W3", "Hiragino Sans GB W6", "Hiragino Sans W0", "Hiragino Sans W1", "Hiragino Sans W2", "Hiragino Sans W3", "Hiragino Sans W4", "Hiragino Sans W5", "Hiragino Sans W6", "Hiragino Sans W7", "Hiragino Sans W8", "Hiragino Sans W9", "Hoefler Text", "Hoefler Text Ornaments", "ITF Devanagari", "ITF Devanagari Marathi", "Impact", "InaiMathi", "Iowan Old Style", "Iowan Old Style Black", "Järjestelmäfontti", "Kailasa", "Kannada MN", "Kannada Sangam MN", "Kefa", "Khmer MN", "Khmer Sangam MN", "Kohinoor Bangla", "Kohinoor Devanagari", "Kohinoor Gujarati", "Kohinoor Telugu", "Kokonor", "Krungthep", "KufiStandardGK", "Lao MN", "Lao Sangam MN", "Lucida Grande", "Luminari", "Malayalam MN", "Malayalam Sangam MN", "Marion", "Marker Felt", "Menlo", "Microsoft Sans Serif", "Mishafi", "Mishafi Gold", "Monaco", "Mshtakan", "Mukta Mahee", "MuktaMahee Bold", "MuktaMahee ExtraBold", "MuktaMahee ExtraLight", "MuktaMahee Light", "MuktaMahee Medium", "MuktaMahee Regular", "MuktaMahee SemiBold", "Muna", "Myanmar MN", "Myanmar Sangam MN", "Nadeem", "New Peninim MT", "Noteworthy", "Noto Nastaliq Urdu", "Noto Sans Adlam", "Noto Sans Armenian", "Noto Sans Armenian Blk", "Noto Sans Armenian ExtBd", "Noto Sans Armenian ExtLt", "Noto Sans Armenian Light", "Noto Sans Armenian Med", "Noto Sans Armenian SemBd", "Noto Sans Armenian Thin", "Noto Sans Avestan", "Noto Sans Bamum", "Noto Sans Bassa Vah", "Noto Sans Batak", "Noto Sans Bhaiksuki", "Noto Sans Brahmi", "Noto Sans Buginese", "Noto Sans Buhid", "Noto Sans CanAborig", "Noto Sans Canadian Aboriginal", "Noto Sans Carian", "Noto Sans CaucAlban", "Noto Sans Caucasian Albanian", "Noto Sans Chakma", "Noto Sans Cham", "Noto Sans Coptic", "Noto Sans Cuneiform", "Noto Sans Cypriot", "Noto Sans Duployan", "Noto Sans EgyptHiero", "Noto Sans Egyptian Hieroglyphs", "Noto Sans Elbasan", "Noto Sans Glagolitic", "Noto Sans Gothic", "Noto Sans Gunjala Gondi", "Noto Sans Hanifi Rohingya", "Noto Sans HanifiRohg", "Noto Sans Hanunoo", "Noto Sans Hatran", "Noto Sans ImpAramaic", "Noto Sans Imperial Aramaic", "Noto Sans InsPahlavi", "Noto Sans InsParthi", "Noto Sans Inscriptional Pahlavi", "Noto Sans Inscriptional Parthian", "Noto Sans Javanese", "Noto Sans Kaithi", "Noto Sans Kannada", "Noto Sans Kannada Black", "Noto Sans Kannada ExtraBold", "Noto Sans Kannada ExtraLight", "Noto Sans Kannada Light", "Noto Sans Kannada Medium", "Noto Sans Kannada SemiBold", "Noto Sans Kannada Thin", "Noto Sans Kayah Li", "Noto Sans Kharoshthi", "Noto Sans Khojki", "Noto Sans Khudawadi", "Noto Sans Lepcha", "Noto Sans Limbu", "Noto Sans Linear A", "Noto Sans Linear B", "Noto Sans Lisu", "Noto Sans Lycian", "Noto Sans Lydian", "Noto Sans Mahajani", "Noto Sans Mandaic", "Noto Sans Manichaean", "Noto Sans Marchen", "Noto Sans Masaram Gondi", "Noto Sans Meetei Mayek", "Noto Sans Mende Kikakui", "Noto Sans Meroitic", "Noto Sans Miao", "Noto Sans Modi", "Noto Sans Mongolian", "Noto Sans Mro", "Noto Sans Multani", "Noto Sans Myanmar", "Noto Sans Myanmar Blk", "Noto Sans Myanmar ExtBd", "Noto Sans Myanmar ExtLt", "Noto Sans Myanmar Light", "Noto Sans Myanmar Med", "Noto Sans Myanmar SemBd", "Noto Sans Myanmar Thin", "Noto Sans NKo", "Noto Sans Nabataean", "Noto Sans New Tai Lue", "Noto Sans Newa", "Noto Sans Ol Chiki", "Noto Sans Old Hungarian", "Noto Sans Old Italic", "Noto Sans Old North Arabian", "Noto Sans Old Permic", "Noto Sans Old Persian", "Noto Sans Old South Arabian", "Noto Sans Old Turkic", "Noto Sans OldHung", "Noto Sans OldNorArab", "Noto Sans OldSouArab", "Noto Sans Oriya", "Noto Sans Osage", "Noto Sans Osmanya", "Noto Sans Pahawh Hmong", "Noto Sans Palmyrene", "Noto Sans Pau Cin Hau", "Noto Sans PhagsPa", "Noto Sans Phoenician", "Noto Sans PsaPahlavi", "Noto Sans Psalter Pahlavi", "Noto Sans Rejang", "Noto Sans Samaritan", "Noto Sans Saurashtra", "Noto Sans Sharada", "Noto Sans Siddham", "Noto Sans Sora Sompeng", "Noto Sans SoraSomp", "Noto Sans Sundanese", "Noto Sans Syloti Nagri", "Noto Sans Syriac", "Noto Sans Tagalog", "Noto Sans Tagbanwa", "Noto Sans Tai Le", "Noto Sans Tai Tham", "Noto Sans Tai Viet", "Noto Sans Takri", "Noto Sans Thaana", "Noto Sans Tifinagh", "Noto Sans Tirhuta", "Noto Sans Ugaritic", "Noto Sans Vai", "Noto Sans Wancho", "Noto Sans Warang Citi", "Noto Sans Yi", "Noto Sans Zawgyi", "Noto Sans Zawgyi Blk", "Noto Sans Zawgyi ExtBd", "Noto Sans Zawgyi ExtLt", "Noto Sans Zawgyi Light", "Noto Sans Zawgyi Med", "Noto Sans Zawgyi SemBd", "Noto Sans Zawgyi Thin", "Noto Serif Ahom", "Noto Serif Balinese", "Noto Serif Hmong Nyiakeng", "Noto Serif Myanmar", "Noto Serif Myanmar Blk", "Noto Serif Myanmar ExtBd", "Noto Serif Myanmar ExtLt", "Noto Serif Myanmar Light", "Noto Serif Myanmar Med", "Noto Serif Myanmar SemBd", "Noto Serif Myanmar Thin", "Noto Serif Yezidi", "Optima", "Oriya MN", "Oriya Sangam MN", "PT Mono", "PT Sans", "PT Sans Caption", "PT Sans Narrow", "PT Serif", "PT Serif Caption", "Palatino", "Papyrus", "Party LET", "Phosphate", "Phông chữ Hệ thống", "PingFang HK", "PingFang SC", "PingFang TC", "Plantagenet Cherokee", "Police système", "Raanana", "Rendszerbetűtípus", "Rockwell", "STIX Two Math", "STIX Two Text", "STIXGeneral", "STIXIntegralsD", "STIXIntegralsSm", "STIXIntegralsUp", "STIXIntegralsUpD", "STIXIntegralsUpSm", "STIXNonUnicode", "STIXSizeFiveSym", "STIXSizeFourSym", "STIXSizeOneSym", "STIXSizeThreeSym", "STIXSizeTwoSym", "STIXVariants", "STSong", "Sana", "Sathu", "Savoye LET", "Seravek", "Seravek ExtraLight", "Seravek Light", "Seravek Medium", "Shree Devanagari 714", "SignPainter", "SignPainter-HouseScript", "Silom", "Sinhala MN", "Sinhala Sangam MN", "Sistem Fontu", "Skia", "Snell Roundhand", "Songti SC", "Songti TC", "Sukhumvit Set", "Superclarendon", "Symbol", "Systeemlettertype", "System Font", "Systemschrift", "Systemskrift", "Systemtypsnitt", "Systémové písmo", "Tahoma", "Tamil MN", "Tamil Sangam MN", "Telugu MN", "Telugu Sangam MN", "Thonburi", "Times", "Times New Roman", "Tipo de letra del sistema", "Tipo de letra do sistema", "Tipus de lletra del sistema", "Trattatello", "Trebuchet MS", "Verdana", "Waseem", "Webdings", "Wingdings", "Wingdings 2", "Wingdings 3", "Zapf Dingbats", "Zapfino", "Γραμματοσειρά συστήματος", "Системний шрифт", "Системный шрифт", "גופן מערכת", "البيان", "التاريخ", "النيل", "بغداد", "بيروت", "جيزة", "خط النظام", "دمشق", "ديوان ثلث", "ديوان كوفي", "صنعاء", "فارسي", "فرح", "كوفي", "منى", "مِصحفي", "مِصحفي ذهبي", "نديم", "نسخ", "وسيم", "आई॰टी॰एफ़॰ देवनागरी", "आई॰टी॰एफ़॰ देवनागरी मराठी", "कोहिनूर देवनागरी", "देवनागरी एम॰टी॰", "देवनागरी संगम एम॰एन॰", "श्री देवनागरी ७१४", "แบบอักษรระบบ", "⹁煵愠芩苈", "システムフォント", "ヒラギノ丸ゴ Pro", "ヒラギノ丸ゴ Pro W4", "ヒラギノ丸ゴ ProN", "ヒラギノ丸ゴ ProN W4", "ヒラギノ明朝 Pro", "ヒラギノ明朝 Pro W3", "ヒラギノ明朝 Pro W6", "ヒラギノ明朝 ProN", "ヒラギノ明朝 ProN W3", "ヒラギノ明朝 ProN W6", "ヒラギノ角ゴ Pro", "ヒラギノ角ゴ Pro W3", "ヒラギノ角ゴ Pro W6", "ヒラギノ角ゴ ProN", "ヒラギノ角ゴ ProN W3", "ヒラギノ角ゴ ProN W6", "ヒラギノ角ゴ Std", "ヒラギノ角ゴ Std W8", "ヒラギノ角ゴ StdN", "ヒラギノ角ゴ StdN W8", "ヒラギノ角ゴ 簡体中文", "ヒラギノ角ゴ 簡体中文 W3", "ヒラギノ角ゴ 簡体中文 W6", "ヒラギノ角ゴシック", "ヒラギノ角ゴシック W0", "ヒラギノ角ゴシック W1", "ヒラギノ角ゴシック W2", "ヒラギノ角ゴシック W3", "ヒラギノ角ゴシック W4", "ヒラギノ角ゴシック W5", "ヒラギノ角ゴシック W6", "ヒラギノ角 ゴシック W7", "ヒラギノ角ゴシック W8", "ヒラギノ角ゴシック W9", "冬青黑体简体中文", "冬青黑体简体中文 W3", "冬青黑体简体中文 W6", "冬青黑體簡體中文", "冬青黑體簡體中文 W3", "冬青黑體簡體中文 W6", "宋体-简", "宋体-繁", "宋體-簡", "宋體-繁", "系統字體", "系统字体", "苹方-港", "苹方-简", "苹方-繁", "荱莉荍荭詰荓⁐牯", "荱莉荍荭詰荓⁓瑤", "荱莉荍荭詰荓荖荢荎", "荱莉荍荭諛荓⁐牯", "荱莉荍荭难銩⁐牯", "蘋方-港", "蘋方-簡", "蘋方-繁", "黑体-简", "黑体-繁", "黑體-簡", "黑體-繁", "黒体-簡", "黒体-繁", "시스템 서체"]
Windows fonts (from Windows 11 22H2):
["Arial", "Arial Black", "Bahnschrift", "Calibri", "Calibri Light", "Cambria", "Cambria Math", "Candara", "Candara Light", "Comic Sans MS", "Consolas", "Constantia", "Corbel", "Corbel Light", "Courier New", "Ebrima", "Franklin Gothic Medium", "Gabriola", "Gadugi", "Georgia", "HoloLens MDL2 Assets", "Impact", "Ink Free", "Javanese Text", "Leelawadee UI", "Leelawadee UI Semilight", "Lucida Console", "Lucida Sans Unicode", "MS Gothic", "MS PGothic", "MS UI Gothic", "MV Boli", "Malgun Gothic", "Malgun Gothic Semilight", "Marlett", "Microsoft Himalaya", "Microsoft JhengHei", "Microsoft JhengHei Light", "Microsoft JhengHei UI", "Microsoft JhengHei UI Light", "Microsoft New Tai Lue", "Microsoft PhagsPa", "Microsoft Sans Serif", "Microsoft Tai Le", "Microsoft YaHei", "Microsoft YaHei Light", "Microsoft YaHei UI", "Microsoft YaHei UI Light", "Microsoft Yi Baiti", "MingLiU-ExtB", "MingLiU_HKSCS-ExtB", "Mongolian Baiti", "Myanmar Text", "NSimSun", "Nirmala UI", "Nirmala UI Semilight", "PMingLiU-ExtB", "Palatino Linotype", "Segoe Fluent Icons", "Segoe MDL2 Assets", "Segoe Print", "Segoe Script", "Segoe UI", "Segoe UI Black", "Segoe UI Emoji", "Segoe UI Historic", "Segoe UI Light", "Segoe UI Semibold", "Segoe UI Semilight", "Segoe UI Symbol", "Segoe UI Variable", "SimSun", "SimSun-ExtB", "Sitka", "Sitka Text", "Sylfaen", "Symbol", "Tahoma", "Times New Roman", "Trebuchet MS", "Twemoji Mozilla", "Verdana", "Webdings", "Wingdings", "Yu Gothic", "Yu Gothic Light", "Yu Gothic Medium", "Yu Gothic UI", "Yu Gothic UI Light", "Yu Gothic UI Semibold", "Yu Gothic UI Semilight", "宋体", "微軟正黑體", "微軟正黑體 Light", "微软雅黑", "微软雅黑 Light", "新宋体", "新細明體-ExtB", "游ゴシック", "游ゴシック Light", "游ゴシック Medium", "細明體-ExtB", "細明體_HKSCS-ExtB", "맑은 고딕", "맑은 고딕 Semilight", "MS ゴシック", "MS Pゴシック"]
Linux fonts (from TOR Browser):
["Arimo", "Cousine", "Noto Naskh Arabic", "Noto Sans Adlam", "Noto Sans Armenian", "Noto Sans Balinese", "Noto Sans Bamum", "Noto Sans Bassa Vah", "Noto Sans Batak", "Noto Sans Bengali", "Noto Sans Buginese", "Noto Sans Buhid", "Noto Sans Canadian Aboriginal", "Noto Sans Chakma", "Noto Sans Cham", "Noto Sans Cherokee", "Noto Sans Coptic", "Noto Sans Deseret", "Noto Sans Devanagari", "Noto Sans Elbasan", "Noto Sans Ethiopic", "Noto Sans Georgian", "Noto Sans Grantha", "Noto Sans Gujarati", "Noto Sans Gunjala Gondi", "Noto Sans Gurmukhi", "Noto Sans Hanifi Rohingya", "Noto Sans Hanunoo", "Noto Sans Hebrew", "Noto Sans JP", "Noto Sans Javanese", "Noto Sans KR", "Noto Sans Kannada", "Noto Sans Kayah Li", "Noto Sans Khmer", "Noto Sans Khojki", "Noto Sans Khudawadi", "Noto Sans Lao", "Noto Sans Lepcha", "Noto Sans Limbu", "Noto Sans Lisu", "Noto Sans Mahajani", "Noto Sans Malayalam", "Noto Sans Mandaic", "Noto Sans Masaram Gondi", "Noto Sans Medefaidrin", "Noto Sans Meetei Mayek", "Noto Sans Mende Kikakui", "Noto Sans Miao", "Noto Sans Modi", "Noto Sans Mongolian", "Noto Sans Mro", "Noto Sans Multani", "Noto Sans Myanmar", "Noto Sans NKo", "Noto Sans New Tai Lue", "Noto Sans Newa", "Noto Sans Ol Chiki", "Noto Sans Oriya", "Noto Sans Osage", "Noto Sans Osmanya", "Noto Sans Pahawh Hmong", "Noto Sans Pau Cin Hau", "Noto Sans Rejang", "Noto Sans Runic", "Noto Sans SC", "Noto Sans Samaritan", "Noto Sans Saurashtra", "Noto Sans Sharada", "Noto Sans Shavian", "Noto Sans Sinhala", "Noto Sans Sora Sompeng", "Noto Sans Soyombo", "Noto Sans Sundanese", "Noto Sans Syloti Nagri", "Noto Sans Symbols", "Noto Sans Symbols 2", "Noto Sans Syriac", "Noto Sans TC", "Noto Sans Tagalog", "Noto Sans Tagbanwa", "Noto Sans Tai Le", "Noto Sans Tai Tham", "Noto Sans Tai Viet", "Noto Sans Takri", "Noto Sans Tamil", "Noto Sans Telugu", "Noto Sans Thaana", "Noto Sans Thai", "Noto Sans Tifinagh", "Noto Sans Tifinagh APT", "Noto Sans Tifinagh Adrar", "Noto Sans Tifinagh Agraw Imazighen", "Noto Sans Tifinagh Ahaggar", "Noto Sans Tifinagh Air", "Noto Sans Tifinagh Azawagh", "Noto Sans Tifinagh Ghat", "Noto Sans Tifinagh Hawad", "Noto Sans Tifinagh Rhissa Ixa", "Noto Sans Tifinagh SIL", "Noto Sans Tifinagh Tawellemmet", "Noto Sans Tirhuta", "Noto Sans Vai", "Noto Sans Wancho", "Noto Sans Warang Citi", "Noto Sans Yi", "Noto Sans Zanabazar Square", "Noto Serif Armenian", "Noto Serif Balinese", "Noto Serif Bengali", "Noto Serif Devanagari", "Noto Serif Dogra", "Noto Serif Ethiopic", "Noto Serif Georgian", "Noto Serif Grantha", "Noto Serif Gujarati", "Noto Serif Gurmukhi", "Noto Serif Hebrew", "Noto Serif Kannada", "Noto Serif Khmer", "Noto Serif Khojki", "Noto Serif Lao", "Noto Serif Malayalam", "Noto Serif Myanmar", "Noto Serif NP Hmong", "Noto Serif Sinhala", "Noto Serif Tamil", "Noto Serif Telugu", "Noto Serif Thai", "Noto Serif Tibetan", "Noto Serif Yezidi", "STIX Two Math", "Tinos", "Twemoji Mozilla"]
* * *
# New fonts
-----------
Other fonts can be added by copying them into the `fonts/` directory in Camoufox, or by installing them on your system.
##### Tip
It is recommended that you **randomly** pass custom fonts to the `fonts` config property to avoid font fingerprinting!
* * *
# Font Metrics
--------------
Camoufox has a built in mechanism to prevent fingerprinting by font metrics & unicode glyphs:

This works by shifting the spacing of each letter by a random value between 0-0.1px.
---
# HTTP Headers | Camoufox
# HTTP Headers
==============
#### # Camoufox can override the following network headers.
* * *
# Properties
------------
| Property | Type | Description |
| --- | --- | --- |
| `headers.User-Agent` | str | Browser and system information |
| `headers.Accept-Language` | str | Acceptable languages for the response |
| `headers.Accept-Encoding` | str | Acceptable encodings for the response |
* * *
##### Note
If `headers.User-Agent` is not set, it will fall back to `navigator.userAgent`.
---
# Geolocation & Intl | Camoufox
# Geolocation & Intl
====================
* * *
# Properties
------------
| Property | Type | Description | Required Keys |
| --- | --- | --- | --- |
| `geolocation:latitude` | double | Latitude to use. | `geolocation:longitude` |
| `geolocation:longitude` | double | Longitude to use. | `geolocation:latitude` |
| `geolocation:accuracy` | double | Accuracy in meters. This will be calculated automatically using the decminal percision of `geolocation:latitude` & `geolocation:longitude` if not set. | |
| `timezone` | str | Set a custom TZ timezone (e.g. "America/Chicago"). This will also change `Date()` to return the local time. | |
| `locale:language` | str | Spoof the Intl API and system language (e.g. "en") | `locale:region` |
| `locale:region` | str | Spoof the Intl API and system region (e.g. "US"). | `locale:language` |
| `locale:script` | str | Set a custom script (e.g. "Latn"). Will be set automatically if not specified. | |
| `locale:all` | str | List of all accepted locale values (separated by comma). The first item should match the Intl API. If not passed, it will default to the locale used in the Intl API in the format `"en-US, en"`. | |
The **Required Keys** are keys that must also be set for the property to work.
* * *
##### Note
* Location permission prompts will be accepted automatically if `geolocation:latitude` and `geolocation:longitude` are set.
* `timezone` **must** be set to a valid TZ identifier. See [here](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones)
for a list of valid timezones.
* `locale:language` & `locale:region` **must** be set to valid locale values. See [here](https://simplelocalize.io/data/locales/)
for a list of valid locale-region values.
---
# Media & Audio | Camoufox
# Media & Audio
===============
* * *
# Media Devices
---------------
Spoof the amount of microphones, webcams, and speakers avaliable.
| Property | Type | Description | Default |
| --- | --- | --- | --- |
| `mediaDevices:enabled` | bool | Whether to enable media device spoofing | `false` |
| `mediaDevices:micros` | uint | Amount of microphones | `3` |
| `mediaDevices:webcams` | uint | Amount of webcams | `1` |
| `mediaDevices:speakers` | uint | Amount of speakers | `1` |
* * *
# AudioContext
--------------
Spoof the AudioContext sample rate, output latency, and max channel count.
| Property | Type | Description |
| --- | --- | --- |
| `AudioContext:sampleRate` | uint | AudioContext sample rate |
| `AudioContext:outputLatency` | double | AudioContext output latency |
| `AudioContext:maxChannelCount` | uint | AudioContext max channel count |
Testing site
https://audiofingerprint.openwpm.com/
[](https://audiofingerprint.openwpm.com/)
---
# WebRTC IP | Camoufox
# WebRTC IP
===========
Camoufox implements WebRTC IP spoofing at the protocol level by modifying ICE candidates and SDP before they're sent.
* * *
# Properties
------------
| Property | Type | Description |
| --- | --- | --- |
| `webrtc:ipv4` | str | IPv4 address to use |
| `webrtc:ipv6` | str | IPv6 address to use |
##### Note
To completely disable WebRTC, set the `media.peerconnection.enabled` preference to `false`.
---
# Miscellaneous | Camoufox
# Miscellaneous
===============
### # Spoof battery status and PDF viewer.
| Property | Type | Description |
| --- | --- | --- |
| `pdfViewerEnabled` | bool | Sets navigator.pdfViewerEnabled. Please keep this on though, many websites will flag a lack of pdfViewer as a headless browser. |
| `battery:charging` | bool | Battery charging status |
| `battery:chargingTime` | double | Battery charging time |
| `battery:dischargingTime` | double | Battery discharging time |
| `battery:level` | double | Battery level |
##### Note
Please keep pdfViewer on, as many websites will flag a lack of PDF viewer as a headless browser.
---
# Addons | Camoufox
# Addons
========
In the Camoufox Python library, addons can be loaded with the `addons` parameter.
Camoufox takes extracted addons. To load an `.xpi` file, rename it to a `.zip` file, extract it, and pass the extracted folder.
from camoufox.sync_api import Camoufox
with Camoufox(addons=['/path/to/addon', '/path/to/addon2']) as browser:
page = browser.new_page()
* * *
### # Default Addons
Camoufox will automatically download and use the latest [uBlock Origin](https://ublockorigin.com/)
with custom privacy/adblock filters to help with ad circumvention.
You can also **exclude** default addons with the `exclude_addons` parameter:
from camoufox.sync_api import Camoufox
from camoufox import DefaultAddons
with Camoufox(exclude_addons=[DefaultAddons.UBO]) as browser:
page = browser.new_page()
---
# Voices | Camoufox
# Voices
========
Spoof the voices used in the browser's Web Speech API.
| Property | Type | Description | Example |
| --- | --- | --- | --- |
| `voices` | array | An array of maps for each voice. Each map must contain the keys `isLocalService`, `isDefault`, `voiceUri`, `name`, and `lang`. | \[
{
"isLocalService": true,
"isDefault": true,
"voiceUri": "Ting-Ting",
"name": "Ting-Ting",
"lang": "zh-CN"
},
...
\] |
| `voices:blockIfNotDefined` | bool | Whether to block system voices. Default is `false`. | `true` |
| `voices:fakeCompletion` | bool | Return a successful TTS completion when a fake voice is used. If disabled, an error is thrown instead (default in RFP). Default is `false`. | `true` |
| `voices:fakeCompletion:charsPerSecond` | double | Playback rate of a fake voice in characters per second. Default is `12.5`, which is ~150wpm. | `15.0` |
Using `voices:fakeCompletion` is not fully implemented. It can be hypothetically detectable if a website measures the utterance duration and compares it with the elapsed time taken. However, anti-bots will never play TTS to detect you.
---
# Build System | Camoufox
# Build System
==============
Here is a diagram of the build system, and its associated make commands:
* * *
graph TD
FFSRC\[Firefox Source\] -->|make fetch| REPO
subgraph REPO\[Camoufox Repository\]
PATCHES\[Fingerprint masking patches\]
ADDONS\[uBlock & B.P.C.\]
DEBLOAT\[Debloat/optimizations\]
SYSTEM\_FONTS\[Win, Mac, Linux fonts\]
JUGGLER\[Patched Juggler\]
end
subgraph Local
REPO -->|make dir| PATCH\[Patched Source\]
PATCH -->|make build| BUILD\[Built\]
BUILD -->|make package-linux| LINUX\[Linux Portable\]
BUILD -->|make package-windows| WIN\[Windows Portable\]
BUILD -->|make package-macos| MAC\[macOS Portable\]
end
This was originally based on the LibreWolf build system.
---
# Building in CLI | Camoufox
# Building in CLI
=================
##### Warning
Camoufox's build system is designed to be used in Linux. WSL will not work!
* * *
First, clone this repository with Git:
git clone --depth 1 https://github.com/daijro/camoufox
cd camoufox
Next, build the Camoufox source code with the following command:
make dir
After that, you have to bootstrap your system to be able to build Camoufox. You only have to do this one time. It is done by running the following command:
make bootstrap
Finally you can build and package Camoufox the following command:
python3 multibuild.py --target linux windows macos --arch x86_64 arm64 i686
Options:
-h, --help show this help message and exit
--target {linux,windows,macos} [{linux,windows,macos} ...]
Target platforms to build
--arch {x86_64,arm64,i686} [{x86_64,arm64,i686} ...]
Target architectures to build for each platform
--bootstrap Bootstrap the build system
--clean Clean the build directory before starting
Example:
$ python3 multibuild.py --target linux windows macos --arch x86_64 arm64
---
# Fingerprint Injection | Camoufox
# Fingerprint Injection
=======================
In Camoufox, data is intercepted at the C++ implementation level, making the changes undetectable through JavaScript inspection.
To spoof fingerprint properties, pass a JSON containing properties to spoof to the [Python interface](https://github.com/daijro/camoufox/tree/main/pythonlib#camoufox-python-interface)
:
>>> with Camoufox(config={"property": "value"}) as browser:
Config data not set by the user will be automatically populated using [BrowserForge](https://github.com/daijro/browserforge)
fingerprints, which mimic the statistical distribution of device characteristics in real-world traffic.
* * *
### # Getting started
Camoufox accepts the following properties:
Navigator
navigator/
[](https://camoufox.com/fingerprint/navigator/)
Cursor Movement
cursor-movement/
[](https://camoufox.com/fingerprint/cursor-movement/)
Fonts
fonts/
[](https://camoufox.com/fingerprint/fonts/)
Screen
screen/
[](https://camoufox.com/fingerprint/screen/)
Window
window/
[](https://camoufox.com/fingerprint/window/)
Document
document/
[](https://camoufox.com/fingerprint/document/)
HTTP Headers
headers/
[](https://camoufox.com/fingerprint/headers/)
Geolocation & Intl
geolocation/
[](https://camoufox.com/fingerprint/geolocation/)
WebRTC IP
webrtc/
[](https://camoufox.com/fingerprint/webrtc/)
WebGL
webgl/
[](https://camoufox.com/fingerprint/webgl/)
Media & Audio
media-audio/
[](https://camoufox.com/fingerprint/media-audio/)
Voices
voices/
[](https://camoufox.com/fingerprint/voices/)
Addons
addons/
[](https://camoufox.com/fingerprint/addons/)
Miscellaneous
miscellaneous/
[](https://camoufox.com/fingerprint/miscellaneous/)
---
# WebGL | Camoufox
# WebGL
=======
As more users visit this site and opt into helping Camoufox's WebGL research, I will have a more solid profile of each GPU's parameters, supported extensions, context attributes, & shader precision formats.
See analytics & research
../../webgl-research/
[](https://camoufox.com/webgl-research/)
* * *
# Demo site
-----------
This repository includes a demo site that prints your browser's WebGL parameters. You can use this site to generate WebGL fingerprints for Camoufox from other devices.
See demo
https://camoufox.com/tests/webgl
[](https://camoufox.com/tests/webgl)

* * *
# Properties
------------
Camoufox supports spoofing WebGL parameters, supported extensions, context attributes, and shader precision formats.
##### Warning
Do **NOT** randomly assign values to these properties. WAFs hash your WebGL fingerprint and compare it against a dataset. Randomly assigning values will lead to detection as an unknown device.
| Property | Description | Example |
| --- | --- | --- |
| `webGl:renderer` | Spoofs the name of the unmasked WebGL renderer. | `"NVIDIA GeForce GTX 980, or similar"` |
| `webGl:vendor` | Spoofs the name of the unmasked WebGL vendor. | `"NVIDIA Corporation"` |
| `webGl:supportedExtensions` | An array of supported WebGL extensions ([full list](https://registry.khronos.org/webgl/extensions/)
). | `["ANGLE_instanced_arrays", "EXT_color_buffer_float", "EXT_disjoint_timer_query", ...]` |
| `webGl2:supportedExtensions` | The same as `webGl:supportedExtensions`, but for WebGL2. | `["ANGLE_instanced_arrays", "EXT_color_buffer_float", "EXT_disjoint_timer_query", ...]` |
| `webGl:contextAttributes` | A dictionary of WebGL context attributes. | `{"alpha": true, "antialias": true, "depth": true, ...}` |
| `webGl2:contextAttributes` | The same as `webGl:contextAttributes`, but for WebGL2. | `{"alpha": true, "antialias": true, "depth": true, ...}` |
| `webGl:parameters` | A dictionary of WebGL parameters. Keys must be GL enums, and values are the values to spoof them as. | `{"2849": 1, "2884": false, "2928": [0, 1], ...}` |
| `webGl2:parameters` | The same as `webGl:parameters`, but for WebGL2. | `{"2849": 1, "2884": false, "2928": [0, 1], ...}` |
| `webGl:parameters:blockIfNotDefined` | If set to `true`, only the parameters in `webGl:parameters` will be allowed. Can be dangerous if not used correctly. | `true`/`false` |
| `webGl2:parameters:blockIfNotDefined` | If set to `true`, only the parameters in `webGl2:parameters` will be allowed. Can be dangerous if not used correctly. | `true`/`false` |
| `webGl:shaderPrecisionFormats` | A dictionary of WebGL shader precision formats. Keys are formatted as `","`. | `{"35633,36336": {"rangeMin": 127, "rangeMax": 127, "precision": 23}, ...}` |
| `webGl2:shaderPrecisionFormats` | The same as `webGL:shaderPrecisionFormats`, but for WebGL2. | `{"35633,36336": {"rangeMin": 127, "rangeMax": 127, "precision": 23}, ...}` |
| `webGl:shaderPrecisionFormats:blockIfNotDefined` | If set to `true`, only the shader percisions in `webGl:shaderPrecisionFormats` will be allowed. | `true`/`false` |
| `webGl2:shaderPrecisionFormats:blockIfNotDefined` | If set to `true`, only the shader percisions in `webGl2:shaderPrecisionFormats` will be allowed. | `true`/`false` |
---
# Development Tools | Camoufox
# Development Tools
===================
This repo comes with a developer UI under scripts/developer.py:
make edits
Patches can be edited, created, removed, and managed through here.

* * *
# How to make a patch
---------------------
1. In the developer UI, click **Reset workspace**.
2. Make changes in the `camoufox-*/` folder as needed. You can test your changes with `make build` and `make run`.
3. After you're done making changes, click **Write workspace to patch** and save the patch file.
# How to work on an existing patch
----------------------------------
1. In the developer UI, click **Edit a patch**.
2. Select the patch you'd like to edit. Your workspace will be reset to the state of the selected patch.
3. After you're done making changes, hit **Write workspace to patch** and overwrite the existing patch file.
---
# Building in Docker | Camoufox
# Building in Docker
====================
To build Camoufox on a non-Linux system you can use Docker.
* * *
1. Create the Docker image containing Firefox's source code:
docker build -t camoufox-builder .
2. Build Camoufox patches to a target platform and architecture:
docker run -v "$(pwd)/dist:/app/dist" camoufox-builder --target --arch
If you want to use the host's .mozbuild directory, you can use the following command instead to run the docker:
docker run \
-v "$HOME/.mozbuild":/root/.mozbuild:rw,z \
-v "$(pwd)/dist:/app/dist" \
camoufox-builder \
--target \
--arch
Options:
-h, --help show this help message and exit
--target {linux,windows,macos} [{linux,windows,macos} ...]
Target platforms to build
--arch {x86_64,arm64,i686} [{x86_64,arm64,i686} ...]
Target architectures to build for each platform
--bootstrap Bootstrap the build system
--clean Clean the build directory before starting
Example:
$ docker run -v "$(pwd)/dist:/app/dist" camoufox-builder --target windows macos linux --arch x86_64 arm64 i686
Build artifacts will now appear written under the `dist/` folder.
---
# Leak Debugging | Camoufox
# Leak Debugging
================
This is a flow chart demonstrating my process for determining leaks without deobfuscating WAF Javascript. The method incrementally reintroduces Camoufox's features into Firefox's source code until the testing site flags.
This process requires a Linux system and assumes you have Firefox build tools installed (see [here](https://github.com/daijro/camoufox?tab=readme-ov-file#build-cli)
).
* * *
# Flowchart
-----------
flowchart TD
A\[Start\] --> B\[Does website flag in the
official Firefox?\]
B -->|Yes| C\[Likely bad IP/rate-
limiting. If the website
fails on both headless and
headful mode on the official
Firefox distribution, the
issue is not with the browser.\]
B -->|No| D\["Run make ff-dbg(1) and
build(2) a clean
distribution of Firefox.
Does the website flag in
Firefox \*\*headless\*\* mode(4)?"\]
D -->|Yes| E\["Does the website flag in
headful mode(3) AND
headless mode(4)?"\]
D -->|No| F\["Open the developer UI(5),
apply config.patch, then
rebuild(2). Does the
website still flag(3)?"\]
E -->|No| G\["Enable privacy.resistFingerprinting
in the config(6). Does the
website still flag(3)?"\]
E -->|Yes| C
G -->|No| H\["In the config(6), enable
FPP and start omitting
overrides until you find
the one that fixed the leak."\]
G -->|Yes| I\[If you get to this point,
you may need to deobfuscate
the Javascript behind the website
to identify what it's testing.\]
F -->|Yes| K\["Open the developer UI,
apply the playwright
bootstrap patch, then
rebuild. Does it still flag?"\]
F -->|No| J\["Omit options from
camoufox.cfg(6) and
rerun(3) until you find the
one causing the leak."\]
K -->|No| M\[Juggler needs to be
debugged to locate the leak.\]
K -->|Yes| L\[The issue has nothing to do
with Playwright. Apply the
rest of the Camoufox patches
one by one until the one
causing the leak is found.\]
M --> I
* * *
# Cited Commands
----------------
| # | Command | Description |
| --- | --- | --- |
| (1) | `make ff-dbg` | Setup vanilla Firefox with minimal patches. |
| (2) | `make build` | Build the source code. |
| (3) | `make run` | Runs the built browser. |
| (4) | `make run args="--headless https://test.com"` | Run a URL in headless mode. All redirects will be printed to the console to determine if the test passed. |
| (5) | `make edits` | Opens the developer UI. Allows the user to apply/undo patches, and see which patches are currently applied. |
| (6) | `make edit-cfg` | Edit camoufox.cfg in the default system editor. |
---
# Development | Camoufox
# Development
=============
* * *
##### Note
The following content is intended for those interested in building & debugging Camoufox.
* * *
### # Building
Instructions on how to build Camoufox from scratch:
Build system overview
overview/
[](https://camoufox.com/development/overview/)
Build via CLI
buildcli/
[](https://camoufox.com/development/buildcli/)
Build via Docker
docker/
[](https://camoufox.com/development/docker/)
* * *
### # Developing patches
How to develop patches for Camoufox and find leaks:
Development tools
tools/
[](https://camoufox.com/development/tools/)
Leak debugging workflow
workflow/
[](https://camoufox.com/development/workflow/)
---
# Liability Disclaimer | Camoufox
# Liability Disclaimer
======================
* * *
### # Camoufox does **NOT** provide **liability or warranty**.
**No responsibility is accepted for the use of this software.** This software is intended for ethical and research purposes only. Users should use this software at their own risk. The developers of the software cannot be held liable for any damages that result from the use of this software. The software must not be used for malicious purposes. By using this software, you agree to this disclaimer and acknowledge that you are using the software responsibly and in compliance with all applicable laws and regulations.
* * *
### # Acceptable Use
By using Camoufox, the User agrees **NOT**:
* to violate, or encourage the violation of, the legal rights of others;
* to engage in, promote or encourage illegal activity, including child sexual exploitation, child abuse, or terrorism or violence that can cause death, serious harm, or injury to individuals or groups of individuals;
* to use Camoufox for any unlawful, invasive, infringing, defamatory or fraudulent purpose including Non-Consensual Explicit Imagery (NCEI), violating intellectual property rights of others, phishing, or creating a pyramid scheme;
* to distribute viruses, worms, Trojan horses, corrupted files, hoaxes, or other items of a destructive or deceptive nature;
* to gain unauthorized access to, disrupt, or impair the use of any service, or the equipment used to provide service, by customers, authorized resellers, or other authorized users;
* to generate, distribute, publish or facilitate unsolicited mass email, promotions, advertisements, or other solicitations (“spam”); or
* to use any service, or any interfaces provided with any service, to access any other product or service in a manner that violates the terms of service of such other product or service without authorization.
---
# Canvas | Camoufox
# Canvas
========
### # What most anti-detect browsers do
Nearly all commerical anti-detect solutions add noise to the canvas to avoid canvas fingerprinting, even on shapes that render the same on every device. This technique is easily detectable by drawing a rectangle and comparing it to an expected result.
### # What Camoufox does
Camoufox implements Canvas anti-fingerprinting by using a patched build of [Skia](https://skia.org/)
with modified subpixel rendering logic, making it impossible to tell your device apart from a device that renders anti-aliasing in a different way.
* * *
# Properties
------------
| Property | Type | Description |
| --- | --- | --- |
| `canvas:aaOffset` | int | Offset each pixel's transparency when drawing anti-aliasing. |
| `canvas:aaCapOffset` | bool | By default, the offset will cause the pixel's transparency to wrap around the 0-255 alpha range. By enabling this property, the offset will be clamped to 0-255. |
This patch is closed source. Releases with this patch is only avaliable on the GitHub releases page.
* * *
### # See related
Canvas fingerprint & integrity tests
https://camoufox.com/tests/canvas
[](https://camoufox.com/tests/canvas)
2D Shape drawing tests
https://camoufox.com/tests/shapetests
[](https://camoufox.com/tests/shapetests)
Research discussion
https://github.com/daijro/camoufox/discussions/41
[](https://github.com/daijro/camoufox/discussions/41)
---
# Random Button Clicker
Click me!
---
# Canvas Fingerprinting Demo
Canvas Fingerprinting Demo
==========================
Combined Hash: \-7f7e5aaf
Rerun all tests
Warning: Canvas randomization is detectable! You are likely flagging WAFs.
### Pixel Integrity Check
i Compares pixel data between two canvases to detect modifications in color channels to find potential canvas fingerprinting countermeasures.
Result: No randomization detected
### Text Rendering
i Renders text using different fonts and measures text metrics to find differences in font rendering across systems.
Hash: \-7d519764
Font Metrics: Measurement: 84
Text Metrics System Sum: 169
### Shape Rendering (Rectangle, Circle, Triangle, and Arc)
i Draws various shapes using canvas methods, testing how different systems render basic geometric forms.
Hash: \-340f1c65
### Shadows
i Applies shadow effects to a rectangle to test how different systems process and render shadow blur and color.
Hash: \-e6791d0
### Text Shadow
i Applies a shadow effect to text to find differences in text shadow processing across systems.
Hash: 68130314
### Gradients
i Creates a linear gradient and fills the canvas, testing how different systems interpolate colors in gradients.
Hash: 2c71b6e0
### Composite Operations
i Uses the 'multiply' composite operation to blend shapes, testing for differences in how systems process complex rendering operations.
Hash: 244a6ea8
### Combined Fingerprint
i Combines all previous tests into a single canvas to create a hash representing the system's rendering characteristics.
---
# Canvas Tests
### Test 1: Solid Image
Hash: 32555f5b80e6905a85aa6dd9e5f8676b10efc619bd47939547ed78f7c1375b53
### Test 2: Red Rectangle
Hash: e0ed8b5baec5e188549b7a54eb8440092d097609afee06202a1e287f9f2d4bda
### Test 3: Red Triangle
Hash: 31b3b358526296a4bd67a9b36754adf42bf1b533cc4f81541f5d93c3c00cc332
### Test 4: Black to White Gradient
Hash: a155afc9840a4891d72ed8aa5570ae40f13a1ad7d0f627dd5ef6a8aec6ec05dc
### Test 5: Blended Squares
Hash: fcb2fcaec4214e812529aa87a0d8ae6cc8a6f5c2e5b8732252ee32b5a5c1596f
### Test 6: Circle
Hash: df6fcca4feb49cf85f285f06484e2455efabab16830148b5716d15e0a896af2a
### Test 7: 1px Diagonal Line
Hash: 8f38ff63d6ccd3197c3484cffc881723244d92b7b511f704b96166ae7723ded6
### Test 8: Aliased Line
Hash: 4eeda1f3bf5d4cb8753b1799aa2db7cbc1483577d28392ecc8bfae8c490b2c7c
### Test 9: Ellipse
Hash: 57d63933ce1b46cdd119d7862a3bfb0b80bd7c4ca55b15b0440f97656920fa71
### Test 10: Curved Line
Hash: 4a259c851c2eb0fc34c2decc2467b52dfc7c6d6ceadb20cf1bc946744816fe32
---
# WebGL Research | Camoufox
[#](https://camoufox.com/webgl-research/#webgl-research)
WebGL Research
=======================================================================
As of January 2025, a newer fingerprint generation library with WebGL is in the works!
Below is a full list of possible WebGL vendor & renderer combinations in Firefox. Items that are checked off indicate that Camoufox has compiled a sufficient amount of analytics on that vendor/renderer combination for accurate simulation and fingerprint rotation.
* * *
### [#](https://camoufox.com/webgl-research/#possible-firefox-webgl-combinations)
Possible Firefox WebGL Combinations
##### Last Updated
This report was last updated on December 05, 2024.
[Windows](https://camoufox.com/webgl-research/#windows)
[MacOS](https://camoufox.com/webgl-research/#macos)
[Linux](https://camoufox.com/webgl-research/#linux)
| Vendor | Renderer | Probability | Sufficient |
| --- | --- | --- | --- |
| Google Inc. (NVIDIA) | ANGLE (NVIDIA, NVIDIA GeForce GTX 980 Direct3D11 vs\_5\_0 ps\_5\_0), or similar | 29.0% | ✅ |
| Google Inc. (NVIDIA) | ANGLE (NVIDIA, NVIDIA GeForce GTX 980 Direct3D11 vs\_5\_0 ps\_5\_0), or similar | 29.0% | ✅ |
| Google Inc. (Intel) | ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs\_5\_0 ps\_5\_0), or similar | 24.1% | ✅ |
| Google Inc. (Intel) | ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs\_5\_0 ps\_5\_0), or similar | 19.7% | ✅ |
| Google Inc. (AMD) | ANGLE (AMD, Radeon HD 3200 Graphics Direct3D11 vs\_5\_0 ps\_5\_0), or similar | 10.6% | ✅ |
| Google Inc. (AMD) | ANGLE (AMD, Radeon R9 200 Series Direct3D11 vs\_5\_0 ps\_5\_0), or similar | 6.6% | ✅ |
| Google Inc. (NVIDIA) | ANGLE (NVIDIA, NVIDIA GeForce GTX 480 Direct3D11 vs\_5\_0 ps\_5\_0), or similar | 1.7% | ✅ |
| Google Inc. (Microsoft) | ANGLE (Microsoft, Microsoft Basic Render Driver Direct3D11 vs\_5\_0 ps\_5\_0), or similar | 1.6% | ✅ |
| Google Inc. (Intel) | ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs\_5\_0 ps\_5\_0) | 0.9% | ✅ |
| Google Inc. (Intel) | ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs\_4\_1 ps\_4\_1), or similar | 0.5% | ✅ |
| Google Inc. (Google) | ANGLE (Google, Vulkan 1.3.0 (SwiftShader Device (Subzero) (0x0000C0DE)), SwiftShader driver) | 0.3% | ✅ |
| Google Inc. (AMD) | ANGLE (AMD, Radeon R9 200 Series Direct3D11 vs\_5\_0 ps\_5\_0) | 0.2% | ✅ |
| Google Inc. (Intel) | ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs\_4\_0 ps\_4\_0) | 0.2% | ✅ |
| Google Inc. (NVIDIA) | ANGLE (NVIDIA, NVIDIA GeForce 8800 GTX Direct3D11 vs\_4\_0 ps\_4\_0) | 0.2% | ✅ |
| Google Inc. (Intel) | ANGLE (Intel, Intel 945GM Direct3D11 vs\_4\_0 ps\_4\_0) | 0.2% | ✅ |
| Google Inc. (Intel) | ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs\_4\_1 ps\_4\_1) | 0.2% | ✅ |
| Google Inc. (NVIDIA) | ANGLE (NVIDIA, NVIDIA GeForce GTX 980 Direct3D11 vs\_5\_0 ps\_5\_0) | 0.2% | ✅ |
| Google Inc. (NVIDIA) | ANGLE (NVIDIA, NVIDIA GeForce GTX 480 Direct3D11 vs\_5\_0 ps\_5\_0) | 0.2% | ✅ |
| Google Inc. (AMD) | ANGLE (AMD, Radeon HD 5850 Direct3D11 vs\_5\_0 ps\_5\_0), or similar | 0.5% | ❌ |
| Intel Inc. | Intel Iris OpenGL Engine | 0.5% | ❌ |
| Google Inc. (AMD) | ANGLE (AMD, Radeon HD 3200 Graphics Direct3D11 vs\_4\_1 ps\_4\_1), or similar | 0.3% | ❌ |
| Google Inc. (NVIDIA) | ANGLE (NVIDIA, NVIDIA GeForce 8800 GTX Direct3D11 vs\_5\_0 ps\_5\_0), or similar | 0.3% | ❌ |
| Google Inc. (Microsoft) | ANGLE (Microsoft, Microsoft Basic Render Driver Direct3D11 vs\_5\_0 ps\_5\_0) | 0.3% | ❌ |
| Google Inc. (NVIDIA) | ANGLE (NVIDIA, NVIDIA GeForce RTX 3080 Direct3D11 vs\_5\_0 ps\_5\_0, D3D11-27.21.14.6663) | 0.2% | ❌ |
| Google Inc. (Intel) | ANGLE (Intel, Intel(R) HD Graphics 630 Direct3D11 vs\_5\_0 ps\_5\_0, D3D11-26.20.100.6861) | 0.2% | ❌ |
| Google Inc. (Intel) | ANGLE (Intel, Intel(R) UHD Graphics 730 Direct3D11 vs\_5\_0 ps\_5\_0, D3D11-30.0.101.1340) | 0.2% | ❌ |
| Google Inc. (Intel) | ANGLE (Intel, Intel 945GM Direct3D11 vs\_4\_0 ps\_4\_0), or similar | 0.2% | ❌ |
| Google Inc. (Intel) | ANGLE (Intel, Intel(R) Arc(TM) A750 Graphics Direct3D11 vs\_5\_0 ps\_5\_0), or similar | 0.2% | ❌ |
| Google Inc. (Unknown) | ANGLE (Unknown, Generic Renderer Direct3D11 vs\_5\_0 ps\_5\_0), or similar | 0.2% | ❌ |
| Google Inc. (AMD) | ANGLE (AMD, Radeon RX 570 Series Direct3D11 vs\_5\_0 ps\_5\_0, D3D11-30.0.14023.1009) | 0.2% | ❌ |
| Google Inc. (Intel) | ANGLE (Intel, Intel(R) UHD Graphics 750 Direct3D11 vs\_5\_0 ps\_5\_0, D3D11) | 0.2% | ❌ |
| Google Inc. (Intel) | ANGLE (Intel, Intel(R) HD Graphics 520 Direct3D11 vs\_5\_0 ps\_5\_0, D3D11-26.20.100.7263) | 0.2% | ❌ |
Contents
* [Possible Firefox WebGL Combinations](https://camoufox.com/webgl-research/#possible-firefox-webgl-combinations)
---
# WebGL Fingerprinting - Camoufox
Your WebGL Information (in Camoufox format)
===========================================
Warning: This browser is not Firefox. The fingerprint below will not run properly on Camoufox.×
SHA256: af0e7fced6928126f9937bfb287a6dba6d76e24ba31a721f9d2e3dfb09a4900b
{
"webGl:renderer": "ANGLE (Google, Vulkan 1.3.0 (SwiftShader Device (Subzero) (0x0000C0DE)), SwiftShader driver)",
"webGl:vendor": "Google Inc. (Google)",
"webGl:contextAttributes": {
"alpha": true,
"antialias": true,
"depth": true,
"desynchronized": false,
"failIfMajorPerformanceCaveat": false,
"powerPreference": "default",
"premultipliedAlpha": true,
"preserveDrawingBuffer": false,
"stencil": false,
"xrCompatible": false
},
"webGl:supportedExtensions": \[\
"ANGLE\_instanced\_arrays",\
"EXT\_blend\_minmax",\
"EXT\_clip\_control",\
"EXT\_color\_buffer\_half\_float",\
"EXT\_depth\_clamp",\
"EXT\_float\_blend",\
"EXT\_frag\_depth",\
"EXT\_polygon\_offset\_clamp",\
"EXT\_shader\_texture\_lod",\
"EXT\_texture\_compression\_bptc",\
"EXT\_texture\_compression\_rgtc",\
"EXT\_texture\_filter\_anisotropic",\
"EXT\_texture\_mirror\_clamp\_to\_edge",\
"EXT\_sRGB",\
"OES\_element\_index\_uint",\
"OES\_fbo\_render\_mipmap",\
"OES\_standard\_derivatives",\
"OES\_texture\_float",\
"OES\_texture\_float\_linear",\
"OES\_texture\_half\_float",\
"OES\_texture\_half\_float\_linear",\
"OES\_vertex\_array\_object",\
"WEBGL\_color\_buffer\_float",\
"WEBGL\_compressed\_texture\_astc",\
"WEBGL\_compressed\_texture\_etc",\
"WEBGL\_compressed\_texture\_etc1",\
"WEBGL\_compressed\_texture\_s3tc",\
"WEBGL\_compressed\_texture\_s3tc\_srgb",\
"WEBGL\_debug\_renderer\_info",\
"WEBGL\_debug\_shaders",\
"WEBGL\_depth\_texture",\
"WEBGL\_draw\_buffers",\
"WEBGL\_lose\_context",\
"WEBGL\_multi\_draw",\
"WEBGL\_polygon\_mode"\
\],
"webGl:parameters": {
"2849": 1,
"2884": false,
"2885": 1029,
"2886": 2305,
"2928": \[\
0,\
1\
\],
"2929": false,
"2930": true,
"2931": 1,
"2932": 513,
"2960": false,
"2961": 0,
"2962": 519,
"2963": 4294967295,
"2964": 7680,
"2965": 7680,
"2966": 7680,
"2967": 0,
"2968": 4294967295,
"2978": \[\
0,\
0,\
256,\
256\
\],
"3024": true,
"3042": false,
"3074": null,
"3088": \[\
0,\
0,\
256,\
256\
\],
"3089": false,
"3106": \[\
0,\
0,\
0,\
0\
\],
"3107": \[\
true,\
true,\
true,\
true\
\],
"3314": null,
"3315": null,
"3316": null,
"3317": 4,
"3330": null,
"3331": null,
"3332": null,
"3333": 4,
"3379": 8192,
"3386": \[\
8192,\
8192\
\],
"3408": 4,
"3410": 8,
"3411": 8,
"3412": 8,
"3413": 8,
"3414": 24,
"3415": 0,
"7936": "WebKit",
"7937": "WebKit WebGL",
"7938": "WebGL 1.0 (OpenGL ES 2.0 Chromium)",
"10752": 0,
"32773": \[\
0,\
0,\
0,\
0\
\],
"32777": 32774,
"32823": false,
"32824": 0,
"32873": null,
"32877": null,
"32878": null,
"32883": null,
"32926": false,
"32928": false,
"32936": 1,
"32937": 4,
"32938": 1,
"32939": false,
"32968": 0,
"32969": 1,
"32970": 0,
"32971": 1,
"33000": null,
"33001": null,
"33170": 4352,
"33901": \[\
1,\
1023\
\],
"33902": \[\
1,\
1\
\],
"34016": 33984,
"34024": 8192,
"34045": null,
"34047": null,
"34068": null,
"34076": 16384,
"34467": null,
"34816": 519,
"34817": 7680,
"34818": 7680,
"34819": 7680,
"34852": null,
"34853": null,
"34854": null,
"34855": null,
"34856": null,
"34857": null,
"34858": null,
"34859": null,
"34860": null,
"34877": 32774,
"34921": 16,
"34930": 32,
"34964": null,
"34965": null,
"35071": null,
"35076": null,
"35077": null,
"35371": null,
"35373": null,
"35374": null,
"35375": null,
"35376": null,
"35377": null,
"35379": null,
"35380": null,
"35657": null,
"35658": null,
"35659": null,
"35660": 32,
"35661": 64,
"35723": null,
"35724": "WebGL GLSL ES 1.0 (OpenGL ES GLSL ES 1.0 Chromium)",
"35725": null,
"35738": 5121,
"35739": 6408,
"35968": null,
"35977": null,
"35978": null,
"35979": null,
"36003": 0,
"36004": 4294967295,
"36005": 4294967295,
"36006": null,
"36007": null,
"36063": null,
"36183": null,
"36203": null,
"36345": null,
"36347": 4096,
"36348": 31,
"36349": 4096,
"36387": null,
"36388": null,
"36392": null,
"36795": null,
"37137": null,
"37154": null,
"37157": null,
"37440": false,
"37441": false,
"37443": 37444,
"37444": null,
"37445": "Google Inc. (Google)",
"37446": "ANGLE (Google, Vulkan 1.3.0 (SwiftShader Device (Subzero) (0x0000C0DE)), SwiftShader driver)",
"37447": null,
"38449": null
},
"webGl:shaderPrecisionFormats": {
"35633,36336": {
"rangeMin": 15,
"rangeMax": 15,
"precision": 10
},
"35633,36337": {
"rangeMin": 15,
"rangeMax": 15,
"precision": 10
},
"35633,36338": {
"rangeMin": 127,
"rangeMax": 127,
"precision": 23
},
"35633,36339": {
"rangeMin": 15,
"rangeMax": 14,
"precision": 0
},
"35633,36340": {
"rangeMin": 15,
"rangeMax": 14,
"precision": 0
},
"35633,36341": {
"rangeMin": 31,
"rangeMax": 30,
"precision": 0
},
"35632,36336": {
"rangeMin": 15,
"rangeMax": 15,
"precision": 10
},
"35632,36337": {
"rangeMin": 15,
"rangeMax": 15,
"precision": 10
},
"35632,36338": {
"rangeMin": 127,
"rangeMax": 127,
"precision": 23
},
"35632,36339": {
"rangeMin": 15,
"rangeMax": 14,
"precision": 0
},
"35632,36340": {
"rangeMin": 15,
"rangeMax": 14,
"precision": 0
},
"35632,36341": {
"rangeMin": 31,
"rangeMax": 30,
"precision": 0
}
},
"webGl2:renderer": "ANGLE (Google, Vulkan 1.3.0 (SwiftShader Device (Subzero) (0x0000C0DE)), SwiftShader driver)",
"webGl2:vendor": "Google Inc. (Google)",
"webGl2:contextAttributes": {
"alpha": true,
"antialias": true,
"depth": true,
"desynchronized": false,
"failIfMajorPerformanceCaveat": false,
"powerPreference": "default",
"premultipliedAlpha": true,
"preserveDrawingBuffer": false,
"stencil": false,
"xrCompatible": false
},
"webGl2:supportedExtensions": \[\
"EXT\_clip\_control",\
"EXT\_color\_buffer\_float",\
"EXT\_color\_buffer\_half\_float",\
"EXT\_conservative\_depth",\
"EXT\_depth\_clamp",\
"EXT\_float\_blend",\
"EXT\_polygon\_offset\_clamp",\
"EXT\_texture\_compression\_bptc",\
"EXT\_texture\_compression\_rgtc",\
"EXT\_texture\_filter\_anisotropic",\
"EXT\_texture\_mirror\_clamp\_to\_edge",\
"NV\_shader\_noperspective\_interpolation",\
"OES\_draw\_buffers\_indexed",\
"OES\_sample\_variables",\
"OES\_shader\_multisample\_interpolation",\
"OES\_texture\_float\_linear",\
"OVR\_multiview2",\
"WEBGL\_clip\_cull\_distance",\
"WEBGL\_compressed\_texture\_astc",\
"WEBGL\_compressed\_texture\_etc",\
"WEBGL\_compressed\_texture\_etc1",\
"WEBGL\_compressed\_texture\_s3tc",\
"WEBGL\_compressed\_texture\_s3tc\_srgb",\
"WEBGL\_debug\_renderer\_info",\
"WEBGL\_debug\_shaders",\
"WEBGL\_lose\_context",\
"WEBGL\_multi\_draw",\
"WEBGL\_polygon\_mode",\
"WEBGL\_stencil\_texturing"\
\],
"webGl2:parameters": {
"2849": 1,
"2884": false,
"2885": 1029,
"2886": 2305,
"2928": \[\
0,\
1\
\],
"2929": false,
"2930": true,
"2931": 1,
"2932": 513,
"2960": false,
"2961": 0,
"2962": 519,
"2963": 4294967295,
"2964": 7680,
"2965": 7680,
"2966": 7680,
"2967": 0,
"2968": 4294967295,
"2978": \[\
0,\
0,\
256,\
256\
\],
"3024": true,
"3042": false,
"3074": 1029,
"3088": \[\
0,\
0,\
256,\
256\
\],
"3089": false,
"3106": \[\
0,\
0,\
0,\
0\
\],
"3107": \[\
true,\
true,\
true,\
true\
\],
"3314": 0,
"3315": 0,
"3316": 0,
"3317": 4,
"3330": 0,
"3331": 0,
"3332": 0,
"3333": 4,
"3379": 8192,
"3386": \[\
8192,\
8192\
\],
"3408": 4,
"3410": 8,
"3411": 8,
"3412": 8,
"3413": 8,
"3414": 24,
"3415": 0,
"7936": "WebKit",
"7937": "WebKit WebGL",
"7938": "WebGL 2.0 (OpenGL ES 3.0 Chromium)",
"10752": 0,
"32773": \[\
0,\
0,\
0,\
0\
\],
"32777": 32774,
"32823": false,
"32824": 0,
"32873": null,
"32877": 0,
"32878": 0,
"32883": 2048,
"32926": false,
"32928": false,
"32936": 1,
"32937": 4,
"32938": 1,
"32939": false,
"32968": 0,
"32969": 1,
"32970": 0,
"32971": 1,
"33000": 2147483647,
"33001": 2147483647,
"33170": 4352,
"33901": \[\
1,\
1023\
\],
"33902": \[\
1,\
1\
\],
"34016": 33984,
"34024": 8192,
"34045": 15,
"34047": null,
"34068": null,
"34076": 16384,
"34467": null,
"34816": 519,
"34817": 7680,
"34818": 7680,
"34819": 7680,
"34852": 6,
"34853": 1029,
"34854": 1029,
"34855": 1029,
"34856": 1029,
"34857": 1029,
"34858": 1029,
"34859": null,
"34860": null,
"34877": 32774,
"34921": 16,
"34930": 32,
"34964": null,
"34965": null,
"35071": 2048,
"35076": \-8,
"35077": 7,
"35371": 14,
"35373": 14,
"35374": 60,
"35375": 72,
"35376": 65536,
"35377": 245760,
"35379": 245760,
"35380": 256,
"35657": 16384,
"35658": 16384,
"35659": 124,
"35660": 32,
"35661": 64,
"35723": 4352,
"35724": "WebGL GLSL ES 3.00 (OpenGL ES GLSL ES 3.0 Chromium)",
"35725": null,
"35738": 5121,
"35739": 6408,
"35968": 4,
"35977": false,
"35978": 128,
"35979": 4,
"36003": 0,
"36004": 4294967295,
"36005": 4294967295,
"36006": null,
"36007": null,
"36063": 6,
"36183": 4,
"36203": 4294967294,
"36345": null,
"36347": 4096,
"36348": 31,
"36349": 4096,
"36387": false,
"36388": false,
"36392": null,
"36795": null,
"37137": 0,
"37154": 128,
"37157": 128,
"37440": false,
"37441": false,
"37443": 37444,
"37444": null,
"37445": "Google Inc. (Google)",
"37446": "ANGLE (Google, Vulkan 1.3.0 (SwiftShader Device (Subzero) (0x0000C0DE)), SwiftShader driver)",
"37447": 0,
"38449": null
},
"webGl2:shaderPrecisionFormats": {
"35633,36336": {
"rangeMin": 15,
"rangeMax": 15,
"precision": 10
},
"35633,36337": {
"rangeMin": 15,
"rangeMax": 15,
"precision": 10
},
"35633,36338": {
"rangeMin": 127,
"rangeMax": 127,
"precision": 23
},
"35633,36339": {
"rangeMin": 15,
"rangeMax": 14,
"precision": 0
},
"35633,36340": {
"rangeMin": 15,
"rangeMax": 14,
"precision": 0
},
"35633,36341": {
"rangeMin": 31,
"rangeMax": 30,
"precision": 0
},
"35632,36336": {
"rangeMin": 15,
"rangeMax": 15,
"precision": 10
},
"35632,36337": {
"rangeMin": 15,
"rangeMax": 15,
"precision": 10
},
"35632,36338": {
"rangeMin": 127,
"rangeMax": 127,
"precision": 23
},
"35632,36339": {
"rangeMin": 15,
"rangeMax": 14,
"precision": 0
},
"35632,36340": {
"rangeMin": 15,
"rangeMax": 14,
"precision": 0
},
"35632,36341": {
"rangeMin": 31,
"rangeMax": 30,
"precision": 0
}
}
}
Copy data Copy data (minified)
---