What Capium patches
Capium rewrites its fingerprint surfaces in Chromium's own source, not in injected JavaScript. A detector cannot catch a property being re-defined, because nothing is being re-defined at runtime. One seed keeps every surface below consistent.
The surfaces
User-Agent & UA-CH
Full User-Agent string plus the modern Client Hints: platform, platform version, brand list and versions, all coherent.
WebGL & GPU
GPU vendor and renderer strings reported by WebGL, matched to the persona instead of the host card.
Canvas
Deterministic per-seed noise on toDataURL, getImageData and measureText so canvas hashes are stable per device and unique across devices.
Audio
Per-seed noise on the AudioContext stack so the audio fingerprint tracks the seed, not the host.
Screen & display
screen.width / height, devicePixelRatio and the storage-quota estimate, all seed-driven.
Hardware
navigator.hardwareConcurrency (CPU cores) reported as the persona, not the real machine.
Fonts
Windows font metrics for a Windows persona so default-text measurement matches real Windows.
Voices
Windows SAPI voice list (speechSynthesis) presented for a Windows persona.
Timezone & geolocation
In-browser IANA timezone and the Geolocation API coordinates, aligned to your proxy exit.
WebRTC
The IP WebRTC reports is pinned to your proxy exit, so it never leaks your real address.
navigator.webdriver
Reported false at the source, not shimmed in JS that detectors can catch re-defining.
DevTools / Runtime.enable
The CDP Runtime.enable console-reporting tell is suppressed in-source, so automation reads as a benign DevTools-open session.
Pointer & hover
Presents a desktop mouse (fine pointer + hover), not a touch device, matching a real desktop.
Client rects
Optional per-seed noise on getClientRects / getBoundingClientRect for layout-based fingerprints.
Source-level, not injected
The distinction that matters: most stealth tooling overrides properties in JavaScript at runtime (Object.defineProperty(navigator, ...)). A detector can notice a getter that has been re-defined, a toString that no longer looks native, or a value that changes between two reads. Capium changes these values in Chromium's own source, so there is nothing re-defined at runtime for a detector to catch, the value simply is what the persona says.
How each surface stays coherent
| Surface | What a site reads | Kept coherent by |
|---|---|---|
| User-Agent + UA-CH | UA string, platform, platformVersion, brand list | One persona drives all of them; the UA can't disagree with the Client Hints |
| WebGL / GPU | unmasked vendor + renderer strings | Reported as the persona's GPU, matched to the OS story |
| Canvas | toDataURL / getImageData / measureText hashes | Deterministic per-seed noise: stable per device, unique across devices |
| Audio | AudioContext fingerprint | Per-seed noise that tracks the seed, not the host |
| WebRTC | the IP candidates it exposes | Pinned to your proxy exit, so it can't leak your real IP |
| Timezone / geo / locale | Intl timezone, geolocation, languages | Aligned to the exit via geoip, so network and browser agree |
| navigator.webdriver | the automation flag | False at the source, not shimmed |
| Fonts | measured text metrics | Windows metrics for a Windows persona (with real fonts present) |
Coherence over uniqueness
The goal is not a maximally unusual fingerprint. It is a maximally consistent one: a device whose UA, UA-CH, GPU, timezone, WebRTC IP and locale all tell a single story. Per-seed noise on canvas and audio keeps devices distinct without reading as tampering.
You can tune every surface individually, see Parameters & flags, or turn spoofing off for named surfaces with --disable-spoofing. To confirm coherence on a real target, use Verifying stealth.