fortress

tiliondev活跃维护

改一行代码就能把 Playwright/Puppeteer 换成隐身 Chromium 内核,绕过反爬和指纹检测,让爬虫和浏览器自动化不再被封。

Stealth Chromium engine that stops scrapers and browser agents from getting blocked, with one line of code change.

v156.0.8078.47发布于 2026-10-23 01:51 UTC795star +7 / 7 天53fork同步于 2026-11-10 11:55 UTC

怎么上手

由 README 提炼,执行前请确认
pip install tilion-fortress
docker run --rm -p 9222:9222 tilion/fortress:latest
硬件要求按 README 说明

README 未说明显存或 CPU 要求;预编译二进制支持 Linux x64、Windows x64,Linux arm64 已发布,macOS 需用 Docker 镜像或从源码构建。

有 Docker 镜像
下载:源码 zip·GitHub Releases(安装包)本站不镜像安装包

项目说明

由 README 自动翻译提炼

改一行代码就能接入的隐身 Chromium 引擎,让爬虫和浏览器 Agent 不被反爬检测拦截

改一行代码就能把 Playwright/Puppeteer 换成隐身 Chromium 内核,绕过反爬和指纹检测,让爬虫和浏览器自动化不再被封。

核心能力

  • 在 Chromium 的 C++ 层修正浏览器指纹,让浏览器看起来像普通 Chrome
  • 通过 CDP 直接对接现有 Playwright 或 Puppeteer,业务代码不用改
  • 每次启动生成全新身份,支持 on_restore 批量重建身份
  • 提供 MCP 服务器,把隐身浏览封装成 29 个 Agent 工具
  • 内置 92 个受保护站点的基准测试,并每月跟随 Chromium 重新基线

容易踩的坑

pip/npm SDK 会额外下载经 SHA-256 校验的预编译二进制,需保证网络可访问;不激活时只运行第一代公开引擎,需执行 tilion activate 或设置 TILION_LICENSE_KEY 才能用 v3;对按 IP 段拦截的站点(如 Cloudflare、DataDome)仍需住宅或移动代理,Linux 主机默认 persona 为 Windows,TLS 等信号可能不一致。

内容由模型根据 README 生成,可能不完整或不准确,以官方文档为准。看原文 README

最近发版

5 个版本v156.0.8078.47
  1. v156.0.8078.47Fortress (Chromium 156.0.8078.47)最新正式版2026-10-23 · 2026-10-23 01:51 UTC

    Fortress (Chromium 156.0.8078.47)

    Security update: the Fortress engine on Chromium 156.0.8078.47, the current Chrome stable release.

    • Chromium 156 security fixes. Carries every security fix Google shipped in Chrome 154, 155 and 156.
    • eMudhra CA distrust. emSign ECC Root CA - G3 is removed from the built-in trust store after the eMudhra subordinate CA key compromise, so it stays distrusted even when Playwright or Puppeteer launch the browser with component updates disabled.
    • Same v3 engine, license gate and launcher as v153.0.8010.36, including the click-hang fix.

    Download

    PlatformArtifact
    Linux x64fortress-v156-linux-x64.tar.gz
    Linux arm64fortress-v156-linux-arm64.tar.gz
    Linux armhf (32-bit ARM)fortress-v156-linux-armhf.tar.gz
    181512397a027e65099c8f2c7c8591c98dfd19649fe7bdbb4fc629989237d3c9  fortress-v156-linux-x64.tar.gz
    2fead923de56b92fad78940bde373c07d38a925f229b710353e601b07d13af87  fortress-v156-linux-arm64.tar.gz
    787b0977b9ef45ed4df133ed2e1712426013fcb46663ab6819371632089026ca  fortress-v156-linux-armhf.tar.gz
    
    tar xzf fortress-v156-linux-x64.tar.gz
    ./fortress-v156/tilion https://example.com
    

    Windows and macOS builds of 156 follow. Chromium 156 no longer supports 32-bit x86 Linux, so there is no 156 x86 build. Until then, those platforms (and pip install tilion-fortress / npm install tilion-fortress) use v153.0.8010.36, which has the same eMudhra fix on Linux.

  2. v153.0.8010.36Fortress v3 (Chromium 153.0.8010.36)2026-09-30 · 2026-09-30 10:29 UTC
    查看更新说明

    Fortress v3 (Chromium 153.0.8010.36)

    Fortress is a recompiled Chromium that corrects its own fingerprint in C++ (canvas, WebGL, WebGPU, audio, fonts, navigator, and 40 more surfaces) and exposes raw CDP, a drop-in for Playwright and Puppeteer. This release is the v3 engine, the offline license gate, and a new license.

    Highlights

    • A distinct machine every launch. Each start mints a fresh, coherent persona across canvas, WebGL, WebGPU, audio, fonts, navigator, and hardware, verified 48 of 48 distinct across a clone fleet.
    • Recorded-human mouse motion. A bank of real human cursor trajectories drives movement inside the engine, not a JavaScript overlay.
    • Widevine EME on the Linux x64, Windows x64, and macOS builds for DRM playback.
    • Native per platform. The same engine ships as a native binary for each OS, now including native Apple Silicon. A Windows build draws Windows personas (Win32, D3D11 GPUs), a Mac build draws Mac personas (Apple GPU, Metal), a real OS story a single host cannot fully emulate.
    • Free for developers, unlocked in one command. tilion activate runs a browser sign-in that takes about ten seconds and saves your key to ~/.tilion/license.jwt. The key is verified offline after that; Fortress never phones home or reports usage. Skip activation and it still runs, printing one notice and falling back to the public first-generation engine.
    • A new license. Fortress moves from BSD to the Fortress Source Available License 1.1. Development, testing and evaluation stay free at any company size; production is free for individuals and for organizations under US$500,000 in cumulative funding and US$300,000 or less in ARR; every other organization buys one flat subscription.

    Downloads

    Every bundle carries the license gate and the production key, and ships the launcher plus a bundled activator, so tilion activate works with no extra install.

    PlatformArtifactWidevine
    Linux x64fortress-v153-linux-x64.tar.gzyes
    Windows x64fortress-v153-win-x64.zipyes
    macOS arm64 (Apple Silicon)fortress-v153-mac-arm64.tar.gzyes
    Linux arm64fortress-v153-linux-arm64.tar.gzno
    Linux x86 (32-bit)fortress-v153-linux-x86.tar.gzno
    Linux armhf (32-bit ARM)fortress-v153-linux-armhf.tar.gzno

    macOS Intel (x64) follows in a later build.

    SHA-256

    b39b37189995ce6678ad0980477782dd6af21d98a1db31c8422110da513ed2bc  fortress-v153-linux-x64.tar.gz
    adcb11912654637c76615c146fa6b65afaa4da72d42459530332a2c05f9e6b82  fortress-v153-win-x64.zip
    f9fabcc4971f44110ad9e19b6f9d9ad30823bc8570cbaad58b041d5c086e531a  fortress-v153-mac-arm64.tar.gz
    507f413a15c187666f7f6caa30993c0a70bd9374388e8229fc7559a2eae063cb  fortress-v153-linux-arm64.tar.gz
    27448fe5c14826b78064c9f21e1c2df63954fa6e4db1e38354c7beecd174f284  fortress-v153-linux-x86.tar.gz
    498710cda27c66caf8c7c347576525397e782153cf71fc7f566d62a2530a2e0a  fortress-v153-linux-armhf.tar.gz
    

    Downloads through the SDK are verified against SHA256SUMS automatically.

    Install

    # Python / Node: prebuilt native binary auto-fetched, SHA-256 verified
    pip install tilion-fortress
    npm install tilion-fortress
    
    # Any OS via Docker: raw CDP on :9222
    docker run --rm -p 9222:9222 tilion/fortress:latest
    
    # Portable tarball (Linux x64 / arm64 / x86 / armhf)
    tar xzf fortress-v153-linux-x64.tar.gz
    ./fortress-v153/tilion https://example.com
    
    # macOS arm64: extract in Terminal (avoids Gatekeeper quarantine)
    tar xzf fortress-v153-mac-arm64.tar.gz
    ./fortress-v153/tilion --remote-debugging-port=9222 --user-data-dir=~/tf-profile
    
    # Native Windows x64 (raw CDP, same --uxr-* overrides)
    #   fortress-v153-win-x64\tillion.cmd --headless=new --remote-debugging-port=9222 --user-data-dir=C:\tmp\p
    

    The tilion CLI

    Installing the SDK (pip install tilion-fortress or npm install tilion-fortress) puts the tilion command on your PATH. The portable tarball and the Docker image bundle the sa

  3. v150.0.7871.114Fortress 150.0.7871.114 (stable)2026-07-15 · 2026-07-15 21:59 UTC
    查看更新说明

    Fortress on Chromium 150.0.7871.114 — built from the current stable Chrome version, so the engine reports the exact version the mass of real users run. Version-database detectors read it as genuine, up-to-date Chrome (149 reads as "out of date"; 151 doesn’t exist yet and reads as generic "Chromium").

    Same stealth engine as the 149/151 releases, rebased onto Chromium 150, plus every fix from this cycle:

    • Per-clone canvas/audio divergence — the noise seed is applied correctly, so two instances no longer share one un-noised fingerprint.
    • Explicit --uxr-* flags win over the generated persona (--uxr-ua-os, --uxr-ua-platform, --uxr-timezone, …), so a pinned surface stays pinned — no UA/platform mismatch.
    • Geo-matched persona — the Docker image derives timezone/locale from the egress IP (set --uxr-country/--uxr-timezone yourself when behind a proxy).
    • Coherent OS voices and the completed WebGL parameter spoof under software render.
    docker run --rm -p 9222:9222 tilion/fortress:150
    pip install -U tilion-fortress
    

    Verify with SHA256SUMS.


    Downloads to date: 0 (new release). GitHub zeroes an asset’s counter on re-upload, so this line is the running total.

  4. v149.0.7827.232Fortress 149.0.7827.232 (stable)2026-07-04 · 2026-07-04 18:57 UTC
    查看更新说明

    Fortress on Chromium 149.0.7827.232 — current stable, the recommended stealth default (matches the Chrome version the mass of real users run; 151 is available for anyone wanting the newest engine).

    Same 35-patch stealth engine as the 151 release, rebased onto Chromium 149. Gauntlet-verified stealth-clean.

    • tilion-fortress-linux-x64.tar.gz — extract & run; exposes CDP on http://localhost:9222
    • Windows x64 asset added shortly.

    Verify with SHA256SUMS.


    Downloads to date: ~250 (linux 125 + win 111 recorded 2026-07-12 before an asset re-upload reset GitHub's per-asset counters, plus downloads since). GitHub zeroes an asset's counter on re-upload, so this line is the running total; the live per-asset numbers undercount.

  5. v151.0.7908.0Fortress 151.0.7908.0 — Engine Refresh2026-07-02 · 2026-07-02 22:41 UTC
    查看更新说明

    Fortress 151.0.7908.0 — Engine Refresh · Released

    The stealth Chromium engine, rebuilt. Every launch is a different, fully-coherent real-device persona — compiled into Chromium's C++, not bolted on in JavaScript.

    What's new

    • Per-locale keyboard — navigator.keyboard.getLayoutMap() returns the persona's real country layout (QWERTY / QWERTZ / AZERTY), full length, coherent with the locale.
    • Per-persona media devices — enumerateDevices() presents a coherent per-persona device set; no empty or host-leaking enumerations.
    • Coherence hardening — a full delivery-parity audit closed the last surfaces where a value could be read but not delivered. Platform ↔ GPU ↔ timezone ↔ language ↔ voices ↔ keyboard now move as one.
    • Real-silicon-calibrated render family — GPU / WebGPU surfaces validated against real consumer hardware.

    Why it's different — the methodology

    Fortress doesn't rewrite the fingerprint in JavaScript. It compiles coherence into the browser itself.

    • Native-code parity — no JS wrappers, so toString() stays [native code] and every descriptor is untouched. The anti-instrumentation traps that catch script-injection stealth pass here by construction.
    • Realm-invariant — one persona holds across the main frame, workers, service workers, and nested iframes. Detectors that diff the worker realm find nothing to diff.
    • One binary, per-launch personas — a single build mints a different coherent device identity on every launch, zero config. No profile pool, no fingerprint to reuse.
    • Coherent, not random — every surface is drawn from a real-device joint distribution, so a persona blends into the real-user crowd instead of flagging itself as "randomized."

    Built to resist reverse-engineering

    The intelligence ships as compiled machine code, not JavaScript — no bytecode to deobfuscate, no readable fingerprint table to lift. The device-model corpus and the engine that mints personas are not in the binary. You get a browser that behaves like a real fleet; the how stays ours.

    Verified

    CreepJS 0% headless / 0% stealth · sannysoft all-green · Runtime.enable no-leak · worker-realm coherent.

    Install

    pip install -U tilion-fortress
    docker run --rm -p 9222:9222 tilion/fortress:latest
    

    Drop-in for the Playwright / Puppeteer / CDP you already use — just point it at f.cdp_url.


    Downloads to date: ~50+ (current live counts; earlier totals were reset by prior asset re-uploads). GitHub zeroes an asset's counter on re-upload, so this line is the running total.

用户点评

登录用户的真实使用记录,可按版本和硬件筛选
共 0 条

    还没有人点评。第一个说出真实体验的人最有价值。

    README 原文

    未翻译

    One browser engine to rule them all

    Stealth Chromium engine · v3 (Chromium 153)

    Chromium Docker pulls Discord Copy for agent llms.txt MCP server npm tilion-mcp

    Fortress is a Chromium fork that stops scrapers and browser agents from getting blocked. Bot detectors flag automation by reading the browser fingerprint. Fortress corrects that fingerprint inside Chromium's C++, so the browser reads as an ordinary Chrome install. Point your existing Playwright or Puppeteer at it over CDP; nothing else in your code changes.

    Headless, on datacenter IPs, with no proxies, Fortress loaded 86.4% of 92 protected sites. The next best stack (Camoufox) loaded 74.5%.

    A site reads the fingerprint. Stock Chrome driven by a script fails CreepJS, BrowserScan, rebrowser and the WebGL check and is blocked; Fortress passes all four.

    Real runs, fully headless

    Unedited captures over CDP, with no stealth plugins. Reproduce with examples/scrape_demos.py.

    Akamai, before and after, on aa.com from the same residential IP: a stock browser gets Access Denied, Fortress loads the page and Akamai issues its _abck sensor cookie. Same result on lowes.com, macys.com and kohls.com.

    Contents

    Quick start · Every session a distinct machine · The Fortress MCP · Works with your stack · Why patch the engine · How Fortress compares · Results · Configure the persona · Build & verify · Reference

    Quick start

    pip install tilion-fortress                       # or: npm install tilion-fortress
    docker run --rm -p 9222:9222 tilion/fortress:latest   # any OS, raw CDP on :9222
    
    from tilion_fortress import Fortress
    from playwright.sync_api import sync_playwright
    
    with Fortress() as f:                       # launches the engine on a CDP endpoint
        with sync_playwright() as p:
            browser = p.chromium.connect_over_cdp(f.cdp_url)
            page = browser.new_page()
            page.goto("https://bot.sannysoft.com")
    
    import { Fortress } from "tilion-fortress";
    import { chromium } from "playwright";
    
    const f = await Fortress.launch();
    const browser = await chromium.connectOverCDP(f.cdpUrl);
    const page = await browser.newPage();
    await page.goto("https://browserscan.net");
    

    The pip and npm SDKs download a prebuilt, SHA-256-verified binary (Linux x64, Windows x64). Portable tarballs, a .deb and the Windows .zip are on Releases.

    Free for developers

    v3 is free for developers, with no machine, session or concurrency caps. Activate once:

    tilion activate      # sign in with GitHub, Google or email; key saved to ~/.tilion/license.jwt
    

    The key is checked offline and Fortress never reports usage. Without activation it still runs, on the public first-generation engine. For CI, Docker and agents, set TILION_LICENSE_KEY=<key> or run tilion activate --token <key>; one key covers a fleet. Production keys for larger organizations are at fortress.tilion.com/pricing.

    CommandWhat it does
    tilion activateUnlock v3 with a one-click device flow (browser sign-in)
    tilion activate --headlessSame flow, prints the URL and code (SSH or remote hosts)
    tilion activate --token <jwt>Save a key with no browser (CI, agents)
    tilion license status [--json]Show the saved key's tier and expiry (--json for scripts)
    tilion license refreshRe-issue the key before it expires
    tilion license logoutRemove the saved key and drop back to v1
    tilion get [platform]Download the build for this host. tilion get list shows all: linux-x64, arm64, armhf, x86, win-x64, mac-arm64, mac-x64
    tilion mcpRun the Fortress MCP server, stealth browsing as agent tools
    tilion [--port N]Launch the engine and print the CDP endpoint

    Platforms

    PlatformPackageWidevineStatus
    Linux x64portable tarball · Docker · pip / npm shipping
    Windows x64portable .zip + tillion.cmd launcher shipping
    Linux arm64portable tarball (Graviton, dense cloud fleets)no shipping
    Linux x86 · armhfportable tarball (32-bit x86 / ARM)no shipping
    macOS (arm64 / x64).app, built from sourcebuild from source

    The arm64, x86 and armhf builds ship without the bundled Widevine CDM.

    Set it up with an AI assistant

    Ask ChatGPT Ask Claude Ask Gemini Copy for agent

    Every session a distinct machine

    Each launch mints a fresh, internally coherent machine: GPU, screen, cores, timezone, language and fonts all agree. The persona reaches the renderer over IPC, so nothing shows on the command line and every BrowserContext can hold its own identity. Across 40 back-to-back launches of the same binary:

    Across 40 launchesDistinct
    Canvas fingerprint40 / 40
    Audio fingerprint40 / 40
    GPU (WebGL renderer)25
    Screen resolution14
    Timezone (geo-coherent with language)23
    Platform mix31 Windows · 9 macOS

    Reproduce with tools/gauntlet.py --runs 40. A 64-clone fleet resumed from one snapshot comes up 48/48 distinct, because on_restore re-keys the whole persona with no relaunch.

    The Fortress MCP

    A Model Context Protocol server that gives Claude, Codex, Cursor, Windsurf, Cline or any MCP client a stealth browser as 29 tools, local and free. When a plain fetch is blocked, the agent calls a tool and gets the page.

    pip install "tilion[mcp]"                  # or zero-install: npx -y tilion-mcp
    claude mcp add fortress -- tilion-mcp      # Claude Code
    

    For Claude Desktop, Cursor (~/.cursor/mcp.json), Cline and Windsurf, add the same block to the client's MCP config:

    { "mcpServers": { "fortress": { "command": "tilion-mcp" } } }
    
    tools
    Get blocked pagesfetch_protected_page · read_page · get_page_html · search_web
    Structured dataextract_page (schema-aware) · extract_document (PDF/DOCX/XLSX)
    Whole sitescrawl_site (auto-SPA) · recon_site_apis (find the private JSON API)
    Drive a pagepage_elements · click_button · fill_field · press_key · wait_for · evaluate_js
    Multi-step flowsrun_browser_task (login, paginate, infinite-scroll, checkout, …)
    Capture / authscreenshot_page · save_page · download_file · save_profile / load_profile
    Bring your ownget_stealth_cdp_endpoint: a CDP url for Playwright / Puppeteer / browser-use

    The full tool reference, benchmarks and agent skill are in mcp/.

    Works with your stack

    With Fortress running (Docker or the tilion command), one line changes: launch() becomes connect_over_cdp("http://localhost:9222").

    FrameworkConnect via
    browser-use (~70k stars)cdp_url="http://localhost:9222"
    Crawl4AI (~58k stars)CDP endpoint
    Stagehand (~21k stars)connectOverCDP
    LangChain Playwright toolkitPlaywright CDP
    Playwright / Puppeteer (Python & JS)connect_over_cdp / connect
    Fortress MCP + pip install tilion facadetools for agents, raw CDP underneath

    Why patch the engine, not the page

    A JavaScript stealth patch is a function standing where a native one belongs, and detectors check for exactly that:

    The tellWhy it catches a JS spoof
    toString self-revealA native method stringifies to function get vendor() { [native code] }; an override stringifies to its own source, so one .toString() catches it.
    Descriptor and hasOwnPropertygetOwnPropertyDescriptor exposes redefined props, and hasOwnProperty('toString') returns true on a tampered function where a native one returns false.
    failsTypeErrorNative getters throw a specific TypeError on the wrong this; a naive shim stays quiet, and the silence is the signal.

    Realm re-acquisition defeats every main-world patch. A detector takes a pristine primitive from another realm and turns it on your function:

    const iframe = document.createElement('iframe'); document.body.appendChild(iframe);
    const realToString = iframe.contentWindow.Function.prototype.toString;
    realToString.call(navigator.__lookupGetter__('vendor')); // returns your source code. Caught.
    

    In Fortress the getter for navigator.vendor is the C++ getter. It reports [native code] because it is native code, the same in every frame and worker. Fortress applies the Camoufox idea to V8 and Blink, so the fingerprint matches a Chrome user agent by construction.

    The four layers of bot detection

    LayerThe tellsWhere the fix livesFortress
    A: driver / binary artifactscdc_ ChromeDriver vars, WebDriver protocol surfaceDrive raw CDP, skip chromedriver built to be driven this way
    B: CDP side-effectsRuntime.enable leaks via sourceURL + init-script footprints, however clean the binary isThe control / CDP-client layer: hold back Runtime.enable, use Runtime.addBinding + isolated worlds no leak (verified on rebrowser)
    C: fingerprint surfacecanvas, WebGL, WebGPU, audio, fonts, navigator, across main frame, iframes, workersThe engine (C++), because JS overrides self-reveal this is Fortress
    D: network / IP egressdatacenter ASN, IP reputation, geo-vs-persona mismatchYour proxies (residential / mobile), or the Tilion hosted version bring your own with the self-hosted engine; available on the Tilion hosted version, waitlist at tilion.com

    Fortress is the Layer C engine, built to be driven so A and B hold too, and to stay geo-coherent (timezone, locale, WebRTC) once you bring a Layer D IP.

    How Fortress compares

    Stock Playwrightpuppeteer-extra-stealthundetected-chromedriverCamoufoxAntidetect apps¹Fortress v3
    Spoof layernoneJS injectionCDP/config patchC++ engine (Firefox)C++ engineC++ engine (Chromium)
    toString yields [native code]n/an/a
    Survives realm re-acquisition (iframe/worker)
    No Runtime.enable leak
    Engine = Chrome / V8 (majority traffic) Firefox
    Coherent Chromium TLS shape Firefox
    Parameter-level WebGL + WebGPU coherencen/a no WebGPUvaries
    Per-launch fleet dynamism (distinct machine) persistent by design 48/48
    Full-persona re-key on snapshot resume on_restore
    Native single-surface C++ patch enginen/an/an/a closed 81 patches
    States its own limitsn/an/an/a

    ¹ Multilogin / GoLogin / Dolphin / Nstbrowser: closed-source engine patches, persistent identity by design, bundled residential egress (their Layer-D advantage over Fortress).

    Fortress builds on prior art: fingerprint-chromium, ChromiumFish and CloakBrowser came first, and Camoufox, Multilogin, GoLogin and Dolphin also patch engine C++. Fortress's edge is the combination: the broadest native surface set on a Chromium base, fleet dynamism with on_restore, and parameter-level coherence. Where it is behind: IP egress (bring your own) and behavioral humanization beyond mouse motion.

    Axisv2v3
    Chromium base151 / 152153.0.8010.36
    Single-surface C++ patches~3481
    Persona transportcommand line, per launch, host-readableIPC-delivered, in-process, per-context isolated
    Multi-identity in one binaryone persona per processper-BrowserContext isolation
    Snapshot resumerelaunch to change identityon_restore full-persona re-key, no relaunch
    Fleet distinctnessnot measured48/48 across 64 clones (500-clone stress-gated)
    Canvas noiseseededidempotent, byte-exact cross-path, 64-bit seeds, fail-closed
    WebGLrenderer string only (incoherent numbers)parameter-level limits + extensions + string, per backend
    WebGPUabsent / software-backend tellcoherent with the persona GPU + per-clone variation
    Fontsmetric substitutes (~33)154-family substrate, enumeration gated to the persona
    Client-HintsUA basicsfull Sec-CH-UA + Device-Memory on the navigation path
    prefers-color-schemefleet-uniformper persona (about a third dark)
    Mouse motionraw driverrecorded-human trajectories (~10k paths, ~16× more human)
    DRMno Widevinereal Widevine CDM bundled, EME verified

    Full release notes

    Results

    Benchmark: 92 protected sites, eight stacks

    Run on 2026-09-28 from US-East cloud machines, headless, on datacenter IPs with no proxies. Every tool loaded every target twice, each time on a fresh machine destroyed afterwards (1,584 machines). A run counts only if the real page loaded with no challenge or deny page. Method and target list: docs/BENCHMARK.md.

    StackServedn95% range
    Fortress86.4%159/18481 to 91
    Camoufox74.5%137/18468 to 80
    puppeteer-extra + stealth72.3%133/18465 to 78
    Brave36.4%67/18430 to 44
    nodriver35.9%66/18429 to 43
    stock Chrome34.2%63/18428 to 41
    patchright34.2%63/18428 to 41
    undetected-chromedriver33.7%62/18427 to 41

    95% Wilson intervals; Fortress's does not overlap the next stack's. Fortress got 2/2 on ten sites where neither Camoufox nor puppeteer-stealth got more than 1/2, and there is no site where it got 0/2 while either of them got 2/2. A repeat run the same day scored 85.3%.

    Live detectors

    Headless, from a datacenter IP, on the v3 binary. Reproduce with tools/gauntlet.py --bundle ./fortress-v153; dated re-runs are in docs/GAUNTLET_RESULTS.md.

    SuiteStock ChromiumFortress v3
    CreepJSflagged headless0% headless · 0% stealth, worker signals coherent
    bot.sannysoft.comred rows0 failed · every intoli + PHANTOM_/HEADCHR_ check green · navigator.webdriver undefined
    browserscan.netbot detected“Normal: No bots detected, could be a human” · WebDriver / Selenium / PhantomJS / Headless / CDP / DevTool all Normal
    BrowserLeaks · WebGLSwiftShader leakUnmasked ANGLE (Intel HD Graphics, Direct3D11) with fully coherent D3D11 parameters
    WebGPU (secure context)software-backend tellnavigator.gpu coherent with the persona GPU: adapter identity, limits, subgroup sizes (verified)
    AmIUnique · pixelscan · ipheyautomation flagsconsistent, no automation flags
    rebrowser bot-detectorRuntime.enable LEAKno leak · webdriver=false · clean init-scripts (raw CDP)
    64-clone fleetone shared identity48/48 distinct canvas / audio / Math.random (fleet gate)
    Cloudflare Turnstileblockedcleared: a human click cleared a live challenge (headed, datacenter IP)

    Unedited capture in a real window: Fortress clears a live Cloudflare challenge, turns bot.sannysoft.com all green and reads BrowserScan "Normal".

    Configure the persona

    The default is a fresh coherent persona per launch, delivered over IPC. Pin or override any surface with --uxr-* switches:

    --uxr-platform / --uxr-ua-platform / --uxr-ua-os / --uxr-ua-arch / --uxr-ua-bitness
    --uxr-ua-platform-version / --uxr-ua-brand / --uxr-hw-concurrency / --uxr-device-memory
    --uxr-webgl-vendor / --uxr-webgl-renderer / --uxr-webgl-fullparams / --uxr-webgpu-vendor
    --uxr-canvas-seed / --uxr-audio-seed / --uxr-timezone / --uxr-languages / --uxr-color-scheme
    --uxr-screen-width / --uxr-screen-height / --uxr-webrtc-policy=disable_non_proxied_udp
    
    Env varPurpose
    TILION_NO_DEFAULTS=1Skip the default persona (bare launch)
    TILION_TZ / TILION_LANGQuick timezone / language override

    Every flag, env var and coherence rule: docs/UXR_CONFIG.md.

    Build & verify

    export CHROMIUM_VERSION=$(cat CHROMIUM_VERSION)   # 153.0.8010.36
    build/build.sh                         # depot_tools, sync the tag, apply patches, gn gen, ninja
    build/rebase-monthly.sh 154.0.XXXX.0   # bump + 3-way apply + rebuild + gauntlet-gate
    

    Output: out/Fortress/chrome. The fork is 81 single-surface patches, and the gauntlet gates every release. The first-generation patch series is public and rebuilds with the same script.

    Fortress ships only from these channels:

    Official source
    Sourcegithub.com/tiliondev/fortress
    Dockertilion/fortress
    Pythontilion-fortress
    Nodetilion-fortress

    Every release ships SHA256SUMS (the SDKs check it on install). Verify the Docker image by digest against the release notes:

    BASE=https://github.com/tiliondev/fortress/releases/download/v153.0.8010.36
    curl -LO $BASE/fortress-v153-linux-x64.tar.gz
    curl -Ls $BASE/SHA256SUMS | sha256sum -c --ignore-missing     # -> OK
    docker inspect --format '{{index .RepoDigests 0}}' tilion/fortress:153.0.8010.36
    

    Reference

    Still blocked on Cloudflare, DataDome or Kasada. Usually the IP: datacenter ranges are flagged before any page script runs. Retry through a residential or mobile proxy; if it clears, the fingerprint was fine. Tilion Cloud runs Fortress on residential egress (waitlist at tilion.com).

    The fingerprint looks off on a Linux host. The default persona is Windows, but TLS and some OS signals follow the host. Match the persona to your egress OS with --uxr-*, or run the native Windows build.

    macOS. Run the Docker image or build the .app from source.

    A detector flags something the gauntlet passes. Confirm you are on the current rebase, then email [email protected] with the test page.

    Does Fortress work with Selenium? Drive it over CDP. chromedriver adds the driver artifacts Fortress is built to avoid.

    How is it different from puppeteer-stealth, undetected-chromedriver, nodriver and patchright? Those patch the JavaScript or CDP layer, which toString and realm re-acquisition reveal, and headless they send HeadlessChrome in the user agent. In the benchmark they loaded 34 to 36% (puppeteer-stealth 72.3%) against Fortress's 86.4%.

    How is it different from Camoufox? Same engine-level idea. Camoufox forks Firefox; Fortress forks Chromium/V8, the majority engine, and adds WebGPU coherence and on_restore fleet re-identity. Benchmark: 86.4% vs 74.5%.

    Is it an alternative to Multilogin, GoLogin, Kameleo, AdsPower or Dolphin? Those are closed-source builds sold as persistent profiles with bundled proxies. Fortress is an engine you run yourself, with a fresh identity per launch, published first-generation patches and no telemetry.

    Does it run headless? Yes. The benchmark is headless, and headless and headed launches present the same fingerprint.

    Do I still need proxies? For sites that block datacenter ranges, yes. Fortress keeps timezone, locale and WebRTC coherent with whatever exit you use.

    Is it open source? What does it cost? Source-available under the Fortress Source Available License 1.1; see License.

    Is this legal? Fortress is for legitimate automation, testing and scraping of public data. Respect each site's terms and your local law.

    Will it pass everything forever? No. Detection moves, so Fortress rebases on Chromium monthly and publishes a dated, reproducible gauntlet.

    • First-party residential and mobile egress, wired to the existing geo-coherence
    • Keystroke and scroll variance (mouse motion has shipped)
    • TLS ClientHello (JA3/JA4) in the persona surface set
    • Linux arm64 / x86 / armhf tarballs (rolling out) and a macOS .app
    • Code-signed Windows .exe and macOS .app

    Shipped in v3: the IPC persona with per-context isolation, on_restore, parameter-level WebGL and WebGPU, recorded-human mouse motion, the Widevine CDM, the native Windows build, the MCP server and the 92-site benchmark.

    patches/     the first-generation C++ patch series (Fortress Source Available License 1.1)
    build/       args.gn, build.sh, apply-patches.sh, rebase-monthly.sh, windows/, macos/
    packaging/   tilion launcher, fonts.conf, Dockerfile, .deb + bundle builders
    fonts/       222 metric-compatible OS-named font files (154 distinct families, incl. color emoji)
    sdk/         python + node (tilion-fortress) prebuilt-binary SDKs
    mcp/         the Fortress MCP server (29 tools) and the agent skill
    tools/       gauntlet.py, the CreepJS / Sannysoft / BrowserScan CI gate
    docs/        UXR_CONFIG (the --uxr-* reference), GAUNTLET_RESULTS, BENCHMARK
    

    Contributing

    Fortress does not accept outside pull requests; see CONTRIBUTING.md. Found a detection vector or a leak? Email [email protected] with a reproducible test page.

    License

    Fortress Source Available License 1.1. Free to read, modify, rebuild and redistribute, and to use for development, testing and evaluation at any size. Production use is free for individuals and for organizations under US$500,000 in cumulative funding and US$300,000 or less in ARR; other organizations need one flat subscription (fortress.tilion.com/pricing, LICENSE, SUBSCRIPTION-TERMS.md). Earlier BSD-licensed releases keep their BSD permissions (LICENSE-BSD-LEGACY). Chromium and the bundled fonts keep their own licenses (NOTICE).