Skip to main content
Heretic measures every session across six independent evidence families, each targeting a different layer of the browser-to-server stack. Independence is the key design property: a verdict requires corroboration across families for composite signals, so a single exploit or misconfiguration can only produce signals within one family — not enough to reach a conclusive ruling on its own. The more families that corroborate, the stronger the verdict.

network-geometry

Family ID: network-geometry Network geometry measures whether the physics of the connection are consistent with the client’s declared location. It compares the measured round-trip time against the speed-of-light floor — the minimum time a photon could travel between the claimed endpoint and the server, given the geodesic distance and fiber refraction index. No amount of software tuning can make a packet travel faster than light. A measured RTT below the theoretical minimum is a physical impossibility, and therefore a conclusive indicator that the declared location is false.

transport-stack

Family ID: transport-stack Transport stack fingerprints the TCP options, SYN flags, window sizes, and QUIC reachability of the incoming connection. Every operating system kernel has a characteristic TCP/TLS handshake structure that is difficult to spoof from userland. If the kernel’s SYN packet identifies a Linux 5.x network stack but the client declares macOS 15, something is misrepresenting itself.

tls-construction

Family ID: tls-construction TLS construction inspects the structure of the TLS ClientHello: the cipher suite ordering, supported groups (elliptic curves), signature algorithm list, and extension layout. Each TLS library — BoringSSL, NSS, OpenSSL, the Windows SChannel — produces a characteristic fingerprint. A ClientHello assembled by a headless automation library looks different from one produced by a genuine Chrome browser, even if the User-Agent string matches.

compute

Family ID: compute Compute probes CPU characteristics: model corpus matching, core count claims versus measured parallelism throughput, and timing resolution. A client that declares an 8-core desktop CPU but can only execute tasks at 2-thread throughput is either running in a constrained VM or misrepresenting its hardware.

render

Family ID: render Render probes the GPU, canvas rasterization, WebGL renderer string, audio processing pipeline, parallel execution timing, and frame delivery cadence. Real GPUs produce characteristic rendering outputs — software rasterizers (SwiftShader, llvmpipe) produce different pixel hashes and timing profiles. Frame timing irregularities reveal headless environments that lack a real display compositor.
You can disable device fingerprinting by passing render: false to the collector options. This removes the render family from the session entirely, which eliminates canvas and audio probes. You lose the render clustering signal and any composite corroboration it would have contributed. Use this option only when your privacy requirements explicitly prohibit device fingerprinting.

declared

Family ID: declared The declared family reads the values the browser exposes directly: navigator, screen, Intl, userAgentData, and WebGL renderer strings. These values are never treated as ground truth. Heretic reads them only as claims — inputs against which the other five families test for contradiction.
The declared family never produces signals on its own. A suspicious navigator.platform value is only meaningful when it contradicts a transport-stack or compute signal. If Heretic only has declared data — because the collector was blocked from running its probes — the verdict will be insufficient.
Read Evidence Families in verdicts to see how contradicting_families tells you exactly which families produced the contradicting signals in a given session.