Chromix README

The project's README from github.com/xiaozhou26/Chromix. As one markdown file: README.md.

Chromix

Windows x64 build Linux x64 build Linux ARM64 build macOS Intel build macOS ARM build GitHub release

Chromix is a Chromium-based browser build focused on presenting a coherent, per-launch browser persona across JavaScript-visible surfaces. It is built on pinned ungoogled-chromium sources and the matching Windows/Linux/macOS platform layer, then adds a reviewed Chromium 152 patch series and lightweight Python and Node SDKs. Five independent workflows build Windows x64, Linux x64/arm64, and macOS x64/arm64. Each platform publishes independently after its build, checksum, extraction, version, and headless smoke checks succeed. Successful platforms append to the same Chromium-version release tag; they need not share a source commit or wait for other platforms.

Chromix is intended for browser automation, compatibility testing, privacy research, and controlled fingerprinting experiments. A custom browser does not make automation undetectable; network reputation, behavior, account history, and application-specific signals still matter.

Highlights

Fingerprint verification

FINGERPRINT_STATUS.md records the P0/P1/P2 coverage, retired inconsistent overrides, and build/runtime verification boundaries. For a locally built or independently verified existing executable, run python3 tools/fingerprint_smoke.py --browser /path/to/chrome --platform linux --locale de-DE --output /tmp/fingerprint-smoke.json. The runner requires Python Playwright, serves its own loopback test pages, and never downloads a browser. A passing tooling test is not a passing browser smoke.

The GPU pool currently contains synthetic Windows test templates, not a measured full-device dataset. Screen/layout, font provenance, CPU/memory capabilities, media backends and wire-level networking still have open consistency work. Storage quotas and Network Information now retain native backend/notifier values instead of isolated getter-only substitutions. See the status document for retired switches and remaining priorities.

Downloads

Prebuilt Windows x64, Linux x64/arm64, and macOS x64/arm64 packages are published on the GitHub Releases page as each independent platform succeeds, without waiting for the others. Available platforms accumulate under one v<CHROMIUM_VERSION> tag, titled Chromix <version>. The tag stays pinned to its initial source commit; notes identify each platform's actual source SHA and build run, which may differ for the same Chromium version. Existing assets and checksums are preserved, and an already published ZIP is never replaced with different bytes. Every browser bundle is accompanied by SHA256SUMS. macOS bundles remain unsigned and are not notarized because Apple signing credentials are not part of this build.

Old aggregate runs are not automatically adopted. The selected Windows run 34080799322 (artifact 10066146011, source 23fd0a7a0c63cd452cfaec6b2aba8469ef5d4123) was verified and published manually to v152.0.7977.82 as Chromix 152.0.7977.82, with the original ZIP unchanged and licenses supplied as sidecars. Successful artifacts from the old POSIX aggregate run 34308090891 likewise require manual verification before appending to that tag; a failed aggregate event cannot publish them. Future independent platform successes append automatically. See the release assets for current availability; this transition does not require another Windows build.

Browser version Platform Release
152.0.7977.82 Windows x64; other platforms pending v152.0.7977.82
152.0.7977.75 Windows x64 v152.0.7977.75
151.0.7922.173 Windows x64 v151.0.7922.173

The source tree is pinned to Chromium 152.0.7977.82; binary releases can lag behind that pin. Machine-readable source pins are in build/ungoogled-revisions.psd1; legacy version files remain available for tooling compatibility. SDK package versions and release channels are unchanged.

Verify and run on Windows

Download both chromix-win-x64.zip and SHA256SUMS from the same release, then verify the archive in PowerShell:

$actual = (Get-FileHash .\chromix-win-x64.zip -Algorithm SHA256).Hash.ToLowerInvariant()
$expected = ((Get-Content .\SHA256SUMS | Where-Object { $_ -match '\s+\*?chromix-win-x64\.zip$' }) -split '\s+')[0].ToLowerInvariant()
if ($actual -ne $expected) { throw "Chromix archive checksum mismatch" }

Extract and start the browser:

Expand-Archive .\chromix-win-x64.zip -DestinationPath .\chromix-win-x64
.\chromix-win-x64\chromix\chromix.cmd

Pass Chromium flags after the launcher when a deterministic test persona is needed:

.\chromix-win-x64\chromix\chromix.cmd `
  --fingerprint=123456789 `
  --fingerprint-platform=windows `
  --fingerprint-timezone=Europe/Berlin `
  --fingerprint-locale=de-DE

Python SDK

The Python wrapper returns Playwright Browser and BrowserContext objects and uses CloakBrowser-compatible function names and keyword arguments.

Install from PyPI:

python -m pip install chromix playwright
python -m playwright install-deps

To install the current checkout instead, replace chromix with ./sdk/python.

Launch Chromix:

from chromix import launch

browser = launch(
    proxy="http://user:[email protected]:8080",
    geoip=True,
    headless=False,
    humanize=True,
)
page = browser.new_page()
page.goto("https://example.com")
print(page.title())
browser.close()

Async and persistent-context variants are also available:

from chromix import launch_persistent_context

context = launch_persistent_context(
    "./profile",
    locale="en-US",
    timezone="America/New_York",
    headless=False,
)
page = context.new_page()
page.goto("https://example.com")
context.close()

Binary management commands:

python -m chromix --version
python -m chromix install
python -m chromix info
python -m chromix clear-cache
python -m chromix widevine    # Linux x64 Widevine helper

See sdk/python/README.md for the full API and environment variables.

Node SDK

The Node wrapper uses playwright-core and exposes the matching camelCase API.

Install from npm:

npm install @xiaoxiaofeihh/chromix playwright-core

Launch Chromix:

import { launch } from "@xiaoxiaofeihh/chromix";

const browser = await launch({
  proxy: "http://user:[email protected]:8080",
  geoip: true,
  headless: false,
  humanize: true,
});
const page = await browser.newPage();
await page.goto("https://example.com");
console.log(await page.title());
await browser.close();

Binary management commands:

npx chromix --version
npx chromix install
npx chromix info
npx chromix clear-cache

See sdk/node/README.md for all options and intentional compatibility differences.

Package publication

Use a local browser binary

Set CLOAKBROWSER_BINARY_PATH to bypass release download in either SDK. Point to the actual executable, not a ZIP, directory, Windows .cmd, or macOS .app directory. Keep the rest of the extracted bundle alongside it.

Windows example:

$env:CLOAKBROWSER_BINARY_PATH = "D:\chromix-build\src\out\Chromix\chrome.exe"

For an extracted Linux candidate use /absolute/path/chromix/chrome; on macOS use /absolute/path/chromix/Chromium.app/Contents/MacOS/Chromium. Export that path in the shell running the SDK, then call the usual launch(...). Verify the inner ZIP's checksum and preserve executable bits/framework symlinks when extracting it; see BUILDING.md.

The current Python chromix.launch/launch_async wrappers resolve the binary first and pass their own executable_path to Playwright. Supplying chromix.launch(executable_path=...) is not supported: it does not bypass download and results in duplicate keyword arguments at launch. Direct Playwright chromium.launch(executable_path=...) is a different API and does accept that option. Similarly, Node's top-level executablePath is not a local-binary selector; launchOptions.executablePath overrides Playwright's option only after ensureBinary() runs. Use CLOAKBROWSER_BINARY_PATH for download-free local use in both wrappers.

Other useful environment variables:

Variable Purpose
CLOAKBROWSER_VERSION Select a configured browser major/version channel
CLOAKBROWSER_RELEASE_CHANNEL Select stable or latest
CLOAKBROWSER_GEOIP_TIMEOUT_SECONDS Set the GeoIP lookup timeout
CLOAKBROWSER_WIDEVINE_CDM Point to an existing Widevine CDM directory
CLOAKBROWSER_WIDEVINE=0 Disable Widevine discovery
CHROMIX_CACHE_DIR Override the SDK binary cache directory
CHROMIX_DOWNLOAD_HOST Override the release asset host

Configured native bundle targets are Windows x64, Linux x64/arm64, and macOS x64/arm64. All use ZIP archives. macOS candidates are unsigned for distribution and not notarized.

Persona options

The SDK accepts familiar high-level options such as proxy, timezone, locale, geoip, userAgent, viewport, colorScheme, extension paths, and persistent profile directories. It converts those settings into Playwright options and the browser's --fingerprint-* command-line aliases.

Useful explicit arguments include:

--fingerprint=<32-bit-seed>
--fingerprint-platform=windows|macos
--fingerprint-timezone=<IANA-timezone>
--fingerprint-locale=<locale>
--fingerprint-webrtc-ip=<address|auto>

Explicit caller settings take priority over GeoIP-derived values. Keep one stable seed and profile directory when a test needs a persistent identity; generate a new seed only when a new persona is intended.

Advanced opt-in features

The following ports are compiled in but disabled by default because they can break automation assumptions or weaken browser isolation:

Use these only in controlled environments. More implementation detail is in patches/README.md.

Build from source

Chromix packages Windows x64, Linux x64/arm64, and macOS x64/arm64. The pinned layers are:

Layer Pin
Chromium 152.0.7977.82
ungoogled-chromium 152.0.7977.82-1
ungoogled-chromium-windows 152.0.7977.82-1.1
ungoogled-chromium-portablelinux 152.0.7977.82-1
ungoogled-chromium-macos 152.0.7977.82-1.1
Chromix 110 patches listed in patches/series

Requirements include Visual Studio 2022 with Desktop development with C++, the Windows 11 SDK 10.0.26100 Debugging Tools, Python 3, Git, PowerShell 7, 7-Zip, and roughly 120 GB of free disk space for Windows. Linux additionally needs Chromium's Debian/Ubuntu build dependencies, Node.js, Go, and Ninja. macOS needs Xcode, the command-line tools, Node.js, Ninja, and zip for packaging. macOS artifacts are unsigned and not notarized because Developer ID and Apple notary credentials are not part of this build.

From a Developer PowerShell:

pwsh build/windows/build.ps1 -WorkDir D:\chromix-build -Jobs 8

Resume an interrupted compile with the same source tree:

pwsh build/windows/build.ps1 -WorkDir D:\chromix-build -Resume -Jobs 8

The resulting browser is written to:

D:\chromix-build\src\out\Chromix\chrome.exe

Read BUILDING.md for source revisions, GitHub Actions cache reuse, domain substitution, packaging, and patch-maintenance details.

Repository layout

patches/          Chromium persona and integration patch series
build/windows/    Windows preparation, staged CI, build, and packaging scripts
build/linux/      Linux packaging helper
build/macos/      macOS build and notarization helpers
sdk/python/       Python Playwright wrapper and binary manager
sdk/node/         Node Playwright wrapper and binary manager
tools/            Patch linter, GN helpers, and regression tests
assets/fonts/     Font assets and provenance used by packaging

Development checks

Run the repository checks before submitting a change:

python3 tools/check_patches.py
python3 -m unittest discover -s tools/tests -v
git diff --check

A full source preparation and compile is performed by the staged Windows GitHub Actions workflow and the parallel Linux/macOS workflow; Chromium builds exceed a single hosted runner's normal time budget.

License

Chromix's original source code, patch integration, and SDKs are released under the BSD 3-Clause License. Bundled Chromium and third-party components retain their own upstream licenses and notices; the BSD license does not replace those terms. Font assets likewise retain the terms documented by their original providers—see assets/fonts/SOURCE.md.

Project status

Chromix is under active development. Chromium rebases can require individual patch updates, and binaries are published only after the corresponding staged Windows build and package checks succeed. Use a fixed release tag and verify its checksum for reproducible automation.

community

LINUX DO

Chromix (xiaozhou26/Chromix)

Searching Database…

这是什么东西?一个基于 Chromium 的浏览器构建,能让 JavaScript 可见的各项特征在每次启动时呈现一套连贯一致的浏览器人设,并配有轻量的 Python 和 Node SDK 用于自动化。官方声明的用途包括:浏览器自动化、兼容性测试、隐私研究,以及受控的指纹实验。
它是一个需要安装的浏览器,还是我要加到自己脚本里的库?两者都是:你得到一个按操作系统打包的便携浏览器,外加薄薄的 Python 和 Node SDK 封装,launch() 返回的是标准的 Playwright Browser 和 BrowserContext 对象,所以脚本仍然用熟悉的 Playwright 风格 API。
怎么把它跑起来?先装 SDK——Python 用 pip install chromix,Node 用 npm install @xiaoxiaofeihh/chromix——然后调用 chromix.launch():它会自动下载匹配的浏览器包。设置 CLOAKBROWSERBINARYPATH 可以跳过下载,直接使用本地的可执行文件。
我得自己编译 Chromium 吗,还是有现成的构建?只需要一个 Python 或 Node 运行环境——正常使用无需任何编译。GitHub Releases 上提供现成的 Windows x64、Linux x64/arm64、macOS x64/arm64 ZIP 包,并附带 SHA256SUMS 用于校验;从源码构建是可选的,但非常费劲,在 Windows 上大约需要 120 GB 磁盘空间。
用定制浏览器构建真的能让我的自动化检测不出来吗?不能——README 明确警告定制浏览器并不能让自动化无法被检测:网络信誉、行为模式和账号历史仍会暴露你。此外覆盖面还有未补齐的缺口,比如屏幕/布局、字体来源、CPU/内存、媒体后端以及底层网络传输。
它就是原版 Chromium 吗,还是为了隐私做过改造?做过改造:它基于锁定的 ungoogled-chromium 源码编译,在 Chromium 152 上叠加了一套经过审阅的 110 个补丁,并且隐私研究是其声明的用途之一。可选的 GeoIP 查询能让语言区域、时区和声明的 WebRTC 地址与代理出口保持一致。
它采用什么许可证?Chromix 自身的代码、补丁集成和 SDK 采用 BSD 3-Clause;捆绑的 Chromium、第三方组件和字体资源则保留其上游的许可证和条款。
我现有的 Playwright 脚本还能用吗?通常可以,只需改一行:SDK 接口与 CloakBrowser 兼容,现有的基于 Playwright 的 Python 和 Node 脚本一般只要改一下导入语句就能迁移。Python 封装返回的是真正的 Playwright Browser 和 BrowserContext 对象;Node SDK 在 playwright-core 上做了对应实现,采用 camelCase 命名。
浏览器人设到底能改变哪些东西?User agent、平台、语言区域、时区、屏幕、硬件、媒体、canvas、WebGL、WebGPU、音频、字体,以及其他 JavaScript 可见的特征。每个特征的验证状态和已知的跨接口缺口都记录在 FINGERPRINTSTATUS.md 里。
同一个配置在多次运行时能保持相同的身份吗?可以——持久化 SDK 配置会复用同一个指纹种子,从而在多个会话中保持稳定身份;非持久化启动则使用随机的 32 位种子。命令行开关还支持完全可复现的测试人设。
安装 Node SDK 有什么坑?有:不带 scope 的 npm 包名 chromix 属于另一个不相干的项目,所以要安装并导入带 scope 的包 @xiaoxiaofeihh/chromix。在 PyPI 上,包名就简单地叫 chromix。
Creator
xiaozhou26
Size
84.6 MB
Stars
479
Age
1mo
Commits · 90 Days