Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -25,3 +25,10 @@ Thumbs.db

# Claude Code worktrees
.claude/

# Benchmark captures (screenshots can show the host locale)
measurements/

# Competitor research stays local, out of the public repo
docs/reverse-engineering.md
scripts/research/
107 changes: 107 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,43 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]

### Added

- **Kernel engine.** `engine: 'auto' | 'kernel' | 'inject'` on launch, `--engine` in the CLI and
MCP. With a [fingerprint-chromium](https://github.com/adryfish/fingerprint-chromium) binary the
fingerprint is spoofed inside Chromium from a per-profile seed and no JavaScript hooks are
installed. `auto` picks it when the binary has the switch.

### Changed

- **Kernel profiles without a platform claim this machine's OS.** Windows claimed on Apple Silicon
is reported as a virtual machine by fingerprint.com (suspect score 38); macOS claimed scores 8.
A profile that sets `fingerprint.platform` is unchanged, and the inject engine still defaults to
Windows. When another OS is claimed on a Mac, `--force-color-profile=srgb` hides the P3/HDR display.
- `docs/anti-detect.md` names the kernel build that was tested, with its SHA-256, and states what
kernel mode does not cover: Windows claimed on Apple Silicon, and Widevine.
- Detector scores in the README now come from `scripts/measure.mjs`, run against AdsPower, GPM
Login and Multilogin on the same machine and proxy: see `docs/benchmark.md`. The earlier numbers
could not be reproduced.

### Fixed

- **The timezone came from the proxy's host, not its exit IP.** A gateway proxy exits elsewhere, so
the profile could report another country's timezone. It is now looked up through the proxy.

- **`Intl` reported the host locale.** Chrome on macOS ignores `--lang`, so `Intl.DateTimeFormat()`
showed e.g. `zh-CN` while `navigator.language` said `en-US`. Every tab and worker now gets
`Emulation.setLocaleOverride` from `fingerprint.language`.
- **Module, shared and service workers leaked the real machine** (platform, cores, GPU, and for
shared workers the user agent). Every worker target is now paused at start, spoofed and resumed.
- **Own properties on `navigator` gave the inject engine away.** `webdriver`, `plugins`,
`connection` and `getBattery` were defined on the `navigator` object, where real Chrome has none;
they now replace the getters on `Navigator.prototype`. browserscan no longer reports a bot.
- **Accept-Language disagreed with `navigator.languages`.** The header was `en-US` while
`navigator.languages` said `en-US,en`; it is now `en-US,en;q=0.9`, as Chrome sends.

## [0.3.0] - 2026-09-12

### Added
Expand Down Expand Up @@ -52,8 +89,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
`fingerprint.webgl` instead of being random per page load.
- Removed the hardcoded `USER_AGENTS` list; the User-Agent is built from the running Chrome.

### Changed

- **Kernel profiles without a platform claim this machine's OS.** Windows claimed on Apple Silicon
is reported as a virtual machine by fingerprint.com (suspect score 38); macOS claimed scores 8.
A profile that sets `fingerprint.platform` is unchanged, and the inject engine still defaults to
Windows. When another OS is claimed on a Mac, `--force-color-profile=srgb` hides the P3/HDR display.

### Fixed

- **The timezone came from the proxy's host, not its exit IP.** A gateway proxy exits elsewhere, so
the profile could report another country's timezone. It is now looked up through the proxy.

- **User-Agent now matches the running Chrome.** The UA and Client Hints (`Sec-CH-UA`,
`navigator.userAgentData`) were pinned to Chrome 119-121; current Chrome is 152, and detectors
compare the two. The launcher reads the real version via `Browser.getVersion` and builds the UA
Expand Down Expand Up @@ -136,8 +183,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [0.2.9] - 2026-01-12

### Changed

- **Kernel profiles without a platform claim this machine's OS.** Windows claimed on Apple Silicon
is reported as a virtual machine by fingerprint.com (suspect score 38); macOS claimed scores 8.
A profile that sets `fingerprint.platform` is unchanged, and the inject engine still defaults to
Windows. When another OS is claimed on a Mac, `--force-color-profile=srgb` hides the P3/HDR display.

### Fixed

- **The timezone came from the proxy's host, not its exit IP.** A gateway proxy exits elsewhere, so
the profile could report another country's timezone. It is now looked up through the proxy.

- **Chrome stale lock file cleanup** 🔓
- Auto-cleans `SingletonLock`, `SingletonCookie`, `SingletonSocket` files before launching
- These files are left behind when Chrome crashes and prevent new instances from starting
Expand All @@ -153,8 +210,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [0.2.8] - 2026-01-12

### Changed

- **Kernel profiles without a platform claim this machine's OS.** Windows claimed on Apple Silicon
is reported as a virtual machine by fingerprint.com (suspect score 38); macOS claimed scores 8.
A profile that sets `fingerprint.platform` is unchanged, and the inject engine still defaults to
Windows. When another OS is claimed on a Mac, `--force-color-profile=srgb` hides the P3/HDR display.

### Fixed

- **The timezone came from the proxy's host, not its exit IP.** A gateway proxy exits elsewhere, so
the profile could report another country's timezone. It is now looked up through the proxy.

- **Connection retry on stale browser** ⚡
- If puppeteer.connect() fails with ECONNREFUSED, automatically retries with a fresh browser launch
- Handles race condition where browser crashes between detection and connection
Expand Down Expand Up @@ -223,8 +290,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
// Connects to existing browser instead of failing!
```

### Changed

- **Kernel profiles without a platform claim this machine's OS.** Windows claimed on Apple Silicon
is reported as a virtual machine by fingerprint.com (suspect score 38); macOS claimed scores 8.
A profile that sets `fingerprint.platform` is unchanged, and the inject engine still defaults to
Windows. When another OS is claimed on a Mac, `--force-color-profile=srgb` hides the P3/HDR display.

### Fixed

- **The timezone came from the proxy's host, not its exit IP.** A gateway proxy exits elsewhere, so
the profile could report another country's timezone. It is now looked up through the proxy.

- Running multiple scripts with the same profile ID no longer causes "port already in use" errors
- Stale lock files are automatically cleaned up when browser process has died

Expand Down Expand Up @@ -257,8 +334,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [0.2.4] - 2026-01-12

### Changed

- **Kernel profiles without a platform claim this machine's OS.** Windows claimed on Apple Silicon
is reported as a virtual machine by fingerprint.com (suspect score 38); macOS claimed scores 8.
A profile that sets `fingerprint.platform` is unchanged, and the inject engine still defaults to
Windows. When another OS is claimed on a Mac, `--force-color-profile=srgb` hides the P3/HDR display.

### Fixed

- **The timezone came from the proxy's host, not its exit IP.** A gateway proxy exits elsewhere, so
the profile could report another country's timezone. It is now looked up through the proxy.

- **Multiple pages issue** - Fixed browser opening with 2 pages instead of 1
- `withPuppeteer()`, `quickLaunch()`, and `createSession()` now reuse existing browser pages
- Prevents duplicate empty pages from appearing on browser launch
Expand Down Expand Up @@ -390,8 +477,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
});
```

### Changed

- **Kernel profiles without a platform claim this machine's OS.** Windows claimed on Apple Silicon
is reported as a virtual machine by fingerprint.com (suspect score 38); macOS claimed scores 8.
A profile that sets `fingerprint.platform` is unchanged, and the inject engine still defaults to
Windows. When another OS is claimed on a Mac, `--force-color-profile=srgb` hides the P3/HDR display.

### Fixed

- **The timezone came from the proxy's host, not its exit IP.** A gateway proxy exits elsewhere, so
the profile could report another country's timezone. It is now looked up through the proxy.

- **ESM Compatibility** - Package now works correctly in ESM environments (tsx, vite, next.js)
- Replaced `require()` with dynamic `import()` in `getPuppeteer()`
- Properly handles both ESM default exports and CJS module.exports
Expand All @@ -411,7 +508,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [0.1.1] - 2026-01-07

### Changed

- **Kernel profiles without a platform claim this machine's OS.** Windows claimed on Apple Silicon
is reported as a virtual machine by fingerprint.com (suspect score 38); macOS claimed scores 8.
A profile that sets `fingerprint.platform` is unchanged, and the inject engine still defaults to
Windows. When another OS is claimed on a Mac, `--force-color-profile=srgb` hides the P3/HDR display.

### Fixed

- **The timezone came from the proxy's host, not its exit IP.** A gateway proxy exits elsewhere, so
the profile could report another country's timezone. It is now looked up through the proxy.
- Minor bug fixes and stability improvements

## [0.1.0] - 2026-01-06
Expand Down
9 changes: 1 addition & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,7 @@ Like **n8n** for automation or **Affine** for notes, this is **AdsPower for deve
| Vendor lock-in | **Open source** (MIT) |
| No customization | **Full control** |

| Site | Score |
|------|-------|
| browserleaks.com | 100% |
| pixelscan.net | 100% |
| browserscan.net | 95% |
| creepjs | 85% |

95% is the Puppeteer ceiling; 100% needs a modified Chromium. What is protected, how it is injected, and the honest limits: [docs/anti-detect.md](./docs/anti-detect.md).
Kernel mode drives fingerprint-chromium, which spoofs inside Chromium and installs no JavaScript hooks. It scores 100% on browserscan and passes a Cloudflare challenge, next to AdsPower, GPM Login and Multilogin on the same machine and proxy; none of them, paid or not, hides from fingerprint.com. Every number and how to reproduce it: [docs/benchmark.md](./docs/benchmark.md). What is protected, how each engine applies it, and the honest limits: [docs/anti-detect.md](./docs/anti-detect.md).

## Quick start

Expand Down
Loading
Loading