A custom Windows Chromium build that exposes a Chrome DevTools Protocol command to configure TLS ClientHello parameters - JA3/JA3N fingerprint spoofing - at runtime. Paired with a Python playwright_tls package.
Anti-bot systems like Cloudflare, Akamai and DataDome fingerprint the TLS ClientHello to tell real browsers from automation. This project patches Chromium and BoringSSL to make that handshake fully controllable from your automation code.
Parameters flow from Python through Playwright and CDP into the browser and network service, down to BoringSSL, producing a custom ClientHello on every HTTPS connection - no proxy or TLS-termination layer required.
Windows 10/11 x64 with roughly 250 GB of disk. The whole build is scripted in PowerShell:
# one-time prerequisites .\build\install_prerequisites_windows.ps1 # build Chromium (matches a Playwright revision) .\build\build_chromium_windows.ps1 -PlaywrightVersion 1.44.0 # install the Python wrapper pip install -e .
import asyncio from playwright.async_api import async_playwright from playwright_tls import BrowserWithTLS, CHROME_124_WIN async def main(): async with async_playwright() as p: async with BrowserWithTLS(p, executable_path=r"dist\chrome.exe") as browser: await browser.set_fingerprint(CHROME_124_WIN) page = await browser.new_page() await page.goto("https://tls.peet.ws/api/all") print(await page.text_content("body")) asyncio.run(main())
Note: EC point formats beyond uncompressed are logged but not applied, and ALPN / HTTP-2 negotiation stays independent of the TLS fingerprint.