firefoxantidetectpatch

August 1, 2026 ยท View on GitHub

browser launches

Firefox, patched at the C++ source level so the browser fingerprint is produced by the engine instead of being injected into the page. This repository holds the patched source and publishes the built binaries as releases.

It is the engine behind two projects, and most people want one of those instead of this repository:

Current release: firefox-18, built from Firefox 151.0. Branch stealth/151 is the source of truth; see STEALTH_BRANCH_README.md for the patch series.

What is patched, and why it is done here

An injected script has to run inside the page, which means the page can find it. The override is a function whose source can be printed, its result can be compared against a value nobody thought to change with it, and a worker or an iframe can ask the same question in a context the patch never reached. Doing it in the engine removes the seam instead of hiding it.

The surfaces set from source: navigator and the user agent, screen geometry, WebGL vendor and renderer strings with their numeric limits, canvas pixel output, the font set, the audio pipeline, WebRTC ICE candidates, timezone, locale, and the proxy path.

Every value arrives through a preference, so nothing is hardcoded in C++ and one seed reproduces one machine. What each of those surfaces reveals, and what it costs to get right, is written up at feder-cr.github.io/invisible_playwright.

Anonymous launch counter

This build issues a single HTTPS GET to a public asset on feder-cr/invisible_firefox every time the browser process starts. That asset's download_count is the global launch counter in the badge above, which also carries the 1,162,836 launches counted before 2026-07-22 (the asset was hosted elsewhere until then, and its count cannot be carried over, so the badge adds the two).

What is sent:

  • One GET https://github.com/feder-cr/invisible_firefox/releases/download/usage-counter/launch.txt
  • A standard Firefox User-Agent. No identifiers, no payload, no cookies.

When it fires:

  • At final-ui-startup, before any tab exists and before web content can observe the request from a page context.
  • Fire and forget. Errors are swallowed and the browser never blocks on the network.

How to turn it off:

  • Per session, set invisible_firefox.usage_ping.enabled to false in about:config, or pass extra_prefs={"invisible_firefox.usage_ping.enabled": False} to InvisiblePlaywright().
  • Permanently, remove the STEALTHFOX: anonymous launch counter block in browser/components/BrowserGlue.sys.mjs and the matching preference in browser/app/profile/firefox.js, then rebuild.

Why it exists: the build is given away, and archive download counts both undercount and overcount, because caches and mirrors hide real installs while CI re-pulls inflate them. A per-launch ping is the closest honest signal of how many installs are real.

Bugs and questions

File them in this repository's issue tracker. Please do not file them at Mozilla: this is an unaffiliated fork, and the patches here are not theirs.


Firefox (upstream)

This project is a fork of Firefox. It is not affiliated with or endorsed by Mozilla. The upstream project's own README follows, because everything in it is still true of the code this fork is built on.

Firefox Browser

Firefox is a fast, reliable and private web browser from the non-profit Mozilla organization.

Contributing

To learn how to contribute to Firefox read the Firefox Contributors' Quick Reference document.

Bugs in Firefox itself belong at bugzilla.mozilla.org. Bugs in this fork do not; see above.

Resources

If you have a question about developing Firefox, and can't find the solution on Firefox Source Docs, you can try asking your question on Matrix at chat.mozilla.org in the Introduction channel.