Sign inSign up

tilion/fortress

By tilion

•Updated 2 months ago

Stealth Chromium engine: C++ fingerprint spoofing, raw CDP :9222, drop-in for Playwright/Puppeteer

Image
1

10K+

tilion/fortress repository overview

⁠Fortress — stealth Chromium engine

One browser engine to rule them all. Fortress corrects the browser fingerprint from inside Chromium's C++ — canvas, WebGL, audio, fonts, navigator, and ~30 more surfaces — so your scrapers and browser agents stop getting blocked, with one line of code change. There's no JavaScript patch layer for a page to catch: every spoofed getter is a real C++ getter that reports [native code] from every realm. Point your existing Playwright or Puppeteer at it over CDP and nothing else in your code changes.

Docker Pulls GitHub Chromium CreepJS License

⁠Run it

docker run --rm -p 9222:9222 tilion/fortress:latest

Raw CDP is on :9222. Point any Playwright / Puppeteer / CDP client at it — swap the browser, keep your code:

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.connect_over_cdp("http://localhost:9222")   # Fortress under the hood
    page = browser.new_page()
    page.goto("https://bot.sannysoft.com")
    page.screenshot(path="all-green.png")

Tags: :latest and :149 = Chromium 149.0.7827.232 (current stable, recommended — the version the mass of real users run, and the leaner image). :151 = newest engine. Identical stealth across tags.

⁠Why patch the engine, not the page

A JavaScript stealth patch leaves an extra layer the page can find: .toString() shows the override's source, and re-grabbing the same primitive from an iframe or worker reaches past it. Fortress corrects the surface in the engine, so navigator.vendor resolves to the real C++ getter, reports [native code], and reads the same from every realm. A page inspecting itself sees stock Chromium — so whatever blocking is left traces to your proxies and behavior, not the browser.

  • Native-code parity — every spoofed getter is a C++ getter; toString() stays [native code], realm-invariant across main frame, iframes, and Web Workers.
  • Coherent by construction — real V8, Blink, and BoringSSL keep engine, user-agent, and JA3/JA4 TLS shape in agreement; one coherent, per-launch device persona from a single binary.
  • Drop-in CDP — nodriver-style raw CDP with no Runtime.enable leak.

⁠Clears the gauntlet

0% headless / 0% stealth on CreepJS · Sannysoft all-green · BrowserScan "Normal" · live Cloudflare Turnstile cleared · real Akamai Bot Manager cleared on aa.com, lowes.com, macys.com, kohls.com — same residential IP, the variable is the fingerprint, not the IP.

⁠Configure the persona

One binary mints a different coherent real-device identity on every launch. The container geo-matches the persona's timezone/locale to the egress IP by default; override any surface with --uxr-*:

# pin the persona to a proxy's exit region
docker run --rm -p 9222:9222 tilion/fortress:latest \
  --uxr-country=DE --uxr-timezone=Europe/Berlin

⁠AI agents — the Fortress MCP

29 stealth-browser tools (navigate, extract, solve captchas, detect WAF, run browser tasks) as an MCP server for Claude, Cursor, and any MCP client:

npx tilion-mcp

⁠More

  • GitHub — https://github.com/tiliondev/fortress⁠ · full docs, the 34 auditable patches, build-from-source
  • pip / npm — pip install -U tilion-fortress · npm install tilion-fortress
  • Verify — every release is reproducible and gauntlet-gated; check SHA256SUMS.

BSD-3-Clause · open engine, rebuild it yourself.

Tag summary

Content type

Image

Digest

sha256:b4f331693…

Size

582.4 MB

Last updated

2 months ago

docker pull tilion/fortress