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

SurfaceWhat a site readsKept coherent by
User-Agent + UA-CHUA string, platform, platformVersion, brand listOne persona drives all of them; the UA can't disagree with the Client Hints
WebGL / GPUunmasked vendor + renderer stringsReported as the persona's GPU, matched to the OS story
CanvastoDataURL / getImageData / measureText hashesDeterministic per-seed noise: stable per device, unique across devices
AudioAudioContext fingerprintPer-seed noise that tracks the seed, not the host
WebRTCthe IP candidates it exposesPinned to your proxy exit, so it can't leak your real IP
Timezone / geo / localeIntl timezone, geolocation, languagesAligned to the exit via geoip, so network and browser agree
navigator.webdriverthe automation flagFalse at the source, not shimmed
Fontsmeasured text metricsWindows 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.