Skip to content

TLS Fingerprint Report

Researched and authored by Pease Ernest | Ernest Tech House | 2025

What Is TLS Fingerprinting

Before a single HTTP request is made, every client connecting to a TLS-secured website sends a ClientHello message. This message contains the client's supported cipher suites, TLS extensions, elliptic curves, and their exact ordering — before any JavaScript runs, before any User-Agent header is sent.

Bot detection platforms — Cloudflare, Akamai, PerimeterX, DataDome — capture this ClientHello and compute a hash called a JA3 fingerprint. Python requests, cURL, Scrapy, Playwright — they all have known JA3 signatures that are immediately recognized and blocked.

Nothing Browser runs on Qt WebEngine, which uses the full Chromium networking stack with BoringSSL — the same TLS library that ships inside Google Chrome. The ClientHello is not simulated or patched. It is genuinely produced by the same code Chrome uses.

Live Fingerprint Data

Captured live from Nothing Browser v0.1.x hitting tls.browserleaks.com, tls.peet.ws, and fp.impersonate.pro:

Fingerprint LayerHash / ValueVerdict
JA3aa50c12a5dfa717d9d6ab34e97de79d5Chrome-identical
JA4t13d1516h2_8daaf6152771_f37e75b10bccChrome-identical
JA3N (normalised)d30e0275e3aa85343be2d3550d3ced62Chrome-identical
Akamai HTTP/24f04edce68a7ecbe689edce7bf5f23f3Chrome-identical
Akamai text1:65536;3:1000;4:6291456;6:262144│15663105│0│m,a,s,pChrome 124 match
PeetPrintfcf4f05a46efc954776ace0f11f2f38aChrome with GREASE
TLS versionTLS 1.3Correct
HTTP versionHTTP/2Correct
GREASEPresent in ciphers and curvesChrome behavior confirmed

Comparison: Nothing Browser vs Every Major Tool

ToolTLS LibraryJA3 StatusDetectable by Cloudflare
Nothing BrowserBoringSSL (real Chromium)Chrome-identicalNo — passes as real Chrome
Python requestsOpenSSLKnown Python JA3Yes — immediately flagged
Python httpxOpenSSLKnown Python JA3Yes — immediately flagged
Python curl_cffiBoringSSL (patched)Chrome-identicalNo — equal to Nothing Browser
Playwright (Chrome)BoringSSL (real Chrome)Chrome-identicalNo — but JS fingerprint leaks
Playwright (Firefox)NSS (Firefox)Firefox JA3Sometimes
PuppeteerBoringSSL (real Chrome)Chrome-identicalNo — but automation flags leak
ScrapyOpenSSLKnown Python JA3Yes — flagged
curl (stock)OpenSSL / NSSKnown curl JA3Yes — flagged
curl-impersonateBoringSSL (patched)Chrome-identicalNo
Selenium ChromeBoringSSL (real Chrome)Chrome-identicalNo — but webdriver flag leaks

The key distinction

Playwright, Puppeteer, and Selenium use real Chrome TLS — but they leak automation signals in JavaScript (navigator.webdriver, missing chrome.runtime, etc). Nothing Browser patches all of these at injection. curl_cffi patches TLS but has no browser context at all. Nothing Browser is the only tool that addresses both layers simultaneously.

Why Qt WebEngine Is the Right Foundation

Real BoringSSL, Not Patched

curl-impersonate achieves Chrome-identical TLS by patching BoringSSL and cURL's source code with a 9,700-line diff. Nothing Browser achieves the same result without any patching — because Qt WebEngine ships the actual Chromium networking stack.

Full JavaScript Engine

Playwright and Puppeteer drive Chrome from the outside via CDP. They cannot intercept every JavaScript API at the DocumentCreation phase. Nothing Browser injects its spoofing script at DocumentCreation, before any page JavaScript runs, using QWebEngineScript. This is architecturally superior.

No Automation Flags

Chrome driven by Selenium or Playwright sets navigator.webdriver = true at the engine level. This cannot be overridden from JavaScript — it requires patching Chromium source. Nothing Browser is not an automation driver. It is a browser. navigator.webdriver is naturally undefined.

Known Gaps and Roadmap

GapSeverityFix PathVersion Target
Canvas uniqueness 99.98%HighReplace sin() PRNG with xorshift, reduce pixel noise densityv0.2.0
sec-ch-ua brand formatMediumUpdate buildSecChUa() for Chrome 110+ formatv0.1.2
navigator.userAgentData missingMediumAdd UA-CH injection to FingerprintSpooferv0.1.2
WebGL UNMASKED params not spoofedMediumAdd params 37445 and 37446 to WebGL overridev0.1.2
TLS curves missing X25519MLKEM768LowQt WebEngine version bump requiredv0.3.0+
No ECH (Encrypted Client Hello)LowChrome 119+ feature, Qt custom build requiredv0.3.0+
ALPS codepoint 17513 vs 17613LowChrome 133+ only, Qt limitationv0.3.0+

The TLS-layer gaps are Qt WebEngine version constraints. They do not affect detection by current Cloudflare, Akamai, or DataDome systems for Chrome 124 impersonation.

The Advantage Statement

CapabilityNothing BrowserBest Alternative
Real Chromium TLS (no patching)✅ Yescurl_cffi (patched)
No automation flag leakage✅ YesNone — all automation tools leak this
DocumentCreation-phase JS injection✅ YesPlaywright (partial, via CDP)
Full DevTools network capture✅ YesBrowser DevTools (manual only)
One-click Python/curl export✅ YesNone
WebSocket frame capture✅ YesNone in scraping tools
Canvas and audio noise✅ YesBrave (coarser implementation)
Zero telemetry✅ YesBrave (some telemetry)
Auto-update✅ YesManual for most tools

Nothing Browser v0.1.x achieves Chrome-identical TLS fingerprinting natively — without patching, without a proxy layer, and without sacrificing a real browser environment.


Nothing Browser — Coded by Pease Ernest | Ernest Tech House | TLS Research & Analysis | 2025

MIT License — use it, build on it, sell scripts with it.