Fingerprints that agree with each other
Spoofing a user agent is easy and useless. facetbrowser generates a whole profile from one seed so that every signal tells the same story.
A browser fingerprint is a few dozen values a site can read: the user agent, the screen size, the GPU name from WebGL, the number of CPU cores, the timezone, the fonts, the way a canvas renders a line of text. Detection systems do not care about any one of them. They care about whether the set is plausible.
A Windows user agent with an Apple GPU is not plausible. A 1366 by 768 screen on a machine claiming sixteen cores is suspicious. A timezone of Europe/Berlin on an IP in Ho Chi Minh City is a flag on its own. Most anti-detect browsers let you edit these values one by one, which is how people end up with combinations that have never existed on a real machine.
One seed, one machine
facetbrowser does not let you set fingerprint fields individually by default. You pick an operating system and the generator produces a complete profile from one random seed: a user agent and client hints that match the OS, a screen size from the distribution real machines of that OS report, a GPU from the list that OS and that screen size usually come with, a core count that fits, and matching values for the smaller signals. Edit one field manually and the fields that depend on it are regenerated.
The seed is stored with the profile, so the same profile produces the same values every time it opens. That matters more than people expect: a profile whose canvas hash changes between sessions looks less like a returning user than one with no spoofing at all.
Noise that stays put
Canvas, WebGL and audio fingerprints are defeated by adding small noise to the output. The noise has to be deterministic per profile for the reason above, and it has to be small enough not to break sites that actually use canvas. facetbrowser derives the noise from the profile seed and applies it at the pixel and sample level inside the Chromium process, not through a JavaScript shim that a site can detect by checking whether toDataURL has been replaced.
Doing less
The thing that surprised us most while building this: when the profile OS matches the host OS, the best move is to spoof almost nothing. Native client hints, native GPU string, native fonts. We only add the per-profile noise and route through the proxy. Real Chrome on a real Windows machine is the most convincing fingerprint there is; the risk is in the modifications, not the defaults. facetbrowser launches Chromium with the minimum set of flags and none of the automation ones that navigator.webdriver and friends would reveal.
The proxy is a fingerprint too
The timezone and the locale are set from the proxy’s geolocation, not from the host. A profile routed through a Lisbon proxy reports Europe/Lisbon and pt-PT, because that is what a browser in Lisbon reports. The built-in checker grades each proxy before you use it: latency, whether it leaks the real IP, which ASN it belongs to, whether that address shows up on abuse lists. A residential proxy with an abuse history is worse than no proxy.
Proxy credentials never reach Chromium. A small local bridge in the app authenticates to the upstream proxy and exposes an unauthenticated loopback endpoint to the browser, so a site cannot extract the credentials through a proxy authentication prompt or a misconfigured extension.