🚀 Big News:Socket Has Acquired Secure Annex.Learn More
Socket
Book a DemoSign in
Socket

cloakbrowser

Package Overview
Dependencies
Maintainers
1
Versions
43
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

cloakbrowser - pypi Package Compare versions

Comparing version
0.3.20
to
0.3.21
+0
-2
.github/workflows/publish.yml

@@ -88,4 +88,2 @@ name: Publish

registry-url: 'https://registry.npmjs.org'
- name: Upgrade npm
run: npm install -g npm@latest
- name: Build

@@ -92,0 +90,0 @@ run: cd js && npm ci && npm run build

+9
-0

@@ -9,2 +9,11 @@ # Changelog

## [0.3.21] — 2026-04-07
- **[wrapper]** Remove dead `--disable-blink-features=AutomationControlled` flag -- binary patch 009 already handles `navigator.webdriver` at source level
- **[wrapper]** Remove hardcoded GPU vendor/renderer flags -- binary auto-generates diverse, realistic GPU profiles from the fingerprint seed. Each seed gets a unique GPU instead of every user sharing the same one
- **[wrapper]** Allow `viewport=None` to disable viewport emulation in both Python and JS wrappers (thanks [@kitiho](https://github.com/kitiho), #107)
- **[wrapper]** Enable `geoip=True` in stealth test example to fix FingerprintJS detection
- **[meta]** Remove npm self-upgrade step in CI -- Node 22 ships with compatible npm
- **[docker]** Install `geoip2` in Docker image for GeoIP auto-detection support
## [0.3.20] — 2026-04-06

@@ -11,0 +20,0 @@

@@ -1,1 +0,1 @@

__version__ = "0.3.20"
__version__ = "0.3.21"

@@ -27,3 +27,6 @@ """Core browser launch functions for cloakbrowser.

# Sentinel to distinguish "viewport not provided" from "viewport=None" (disable emulation)
_VIEWPORT_UNSET = object()
def _resolve_timezone(timezone: str | None, kwargs: dict[str, Any]) -> str | None:

@@ -241,3 +244,3 @@ """Accept both timezone and timezone_id — either works, no warning."""

user_agent: str | None = None,
viewport: dict | None = None,
viewport: dict | None = _VIEWPORT_UNSET,
locale: str | None = None,

@@ -269,2 +272,3 @@ timezone: str | None = None,

viewport: Viewport size dict, e.g. {"width": 1920, "height": 1080}.
Pass None to disable viewport emulation (use OS window size).
locale: Browser locale, e.g. "en-US".

@@ -316,3 +320,8 @@ timezone: IANA timezone (e.g. 'America/New_York').

context_kwargs["user_agent"] = user_agent
context_kwargs["viewport"] = viewport or DEFAULT_VIEWPORT
if viewport is _VIEWPORT_UNSET:
context_kwargs["viewport"] = DEFAULT_VIEWPORT
elif viewport is None:
context_kwargs["no_viewport"] = True
else:
context_kwargs["viewport"] = viewport
if color_scheme:

@@ -361,3 +370,3 @@ context_kwargs["color_scheme"] = color_scheme

user_agent: str | None = None,
viewport: dict | None = None,
viewport: dict | None = _VIEWPORT_UNSET,
locale: str | None = None,

@@ -388,2 +397,3 @@ timezone: str | None = None,

viewport: Viewport size dict, e.g. {"width": 1920, "height": 1080}.
Pass None to disable viewport emulation (use OS window size).
locale: Browser locale, e.g. "en-US".

@@ -438,3 +448,8 @@ timezone: IANA timezone (e.g. 'America/New_York').

context_kwargs["user_agent"] = user_agent
context_kwargs["viewport"] = viewport or DEFAULT_VIEWPORT
if viewport is _VIEWPORT_UNSET:
context_kwargs["viewport"] = DEFAULT_VIEWPORT
elif viewport is None:
context_kwargs["no_viewport"] = True
else:
context_kwargs["viewport"] = viewport
if color_scheme:

@@ -482,3 +497,3 @@ context_kwargs["color_scheme"] = color_scheme

user_agent: str | None = None,
viewport: dict | None = None,
viewport: dict | None = _VIEWPORT_UNSET,
locale: str | None = None,

@@ -506,2 +521,3 @@ timezone: str | None = None,

viewport: Viewport size dict, e.g. {"width": 1920, "height": 1080}.
Pass None to disable viewport emulation (use OS window size).
locale: Browser locale, e.g. "en-US".

@@ -539,3 +555,8 @@ timezone: IANA timezone (e.g. 'America/New_York').

context_kwargs["user_agent"] = user_agent
context_kwargs["viewport"] = viewport or DEFAULT_VIEWPORT
if viewport is _VIEWPORT_UNSET:
context_kwargs["viewport"] = DEFAULT_VIEWPORT
elif viewport is None:
context_kwargs["no_viewport"] = True
else:
context_kwargs["viewport"] = viewport
if color_scheme:

@@ -542,0 +563,0 @@ context_kwargs["color_scheme"] = color_scheme

@@ -51,3 +51,2 @@ """Stealth configuration and platform detection for cloakbrowser."""

"--no-sandbox",
"--disable-blink-features=AutomationControlled",
f"--fingerprint={seed}",

@@ -58,16 +57,8 @@ ]

# Tell the fingerprint patches we're on macOS so GPU/UA match natively
return base + [
"--fingerprint-platform=macos",
"--fingerprint-gpu-vendor=Google Inc. (Apple)",
"--fingerprint-gpu-renderer=ANGLE (Apple, ANGLE Metal Renderer: Apple M3, Unspecified Version)",
]
return base + ["--fingerprint-platform=macos"]
# Linux/Windows: Windows fingerprint profile
# Hardware concurrency, device memory, screen, and window size are
# Hardware concurrency, device memory, screen, window size, and GPU are
# auto-generated by the binary from the seed (v14+).
return base + [
"--fingerprint-platform=windows",
"--fingerprint-gpu-vendor=Google Inc. (NVIDIA)",
"--fingerprint-gpu-renderer=ANGLE (NVIDIA, NVIDIA GeForce RTX 3070 (0x00002484) Direct3D11 vs_5_0 ps_5_0, D3D11)",
]
return base + ["--fingerprint-platform=windows"]

@@ -74,0 +65,0 @@

@@ -23,3 +23,3 @@ FROM python:3.12-slim

COPY cloakbrowser/ cloakbrowser/
RUN pip install --no-cache-dir ".[serve]"
RUN pip install --no-cache-dir ".[serve,geoip]"

@@ -26,0 +26,0 @@ # JS wrapper

@@ -231,3 +231,3 @@ """Run stealth tests against major bot detection services.

browser = launch(headless=not HEADED, proxy=PROXY)
browser = launch(headless=not HEADED, proxy=PROXY, geoip=True)
page = browser.new_page()

@@ -234,0 +234,0 @@

{
"name": "cloakbrowser",
"version": "0.3.20",
"version": "0.3.21",
"description": "Stealth Chromium that passes every bot detection test. Drop-in Playwright/Puppeteer replacement with source-level fingerprint patches.",

@@ -5,0 +5,0 @@ "type": "module",

@@ -206,7 +206,7 @@ <p align="center">

|---|---|---|---|
| Linux x86_64 | 145 | 33 | ✅ Latest |
| Linux arm64 (RPi, Graviton) | 145 | 33 | ✅ Latest |
| Linux x86_64 | 145 | 48 | ✅ Latest |
| Linux arm64 (RPi, Graviton) | 145 | 48 | ✅ Latest |
| macOS arm64 (Apple Silicon) | 145 | 26 | ✅ Latest |
| macOS x86_64 (Intel) | 145 | 26 | ✅ Latest |
| Windows x86_64 | 145 | 33 | ✅ Latest |
| Windows x86_64 | 145 | 48 | ✅ Latest |

@@ -213,0 +213,0 @@ ## Requirements

@@ -214,3 +214,2 @@ /**

"--no-sandbox",
"--disable-blink-features=AutomationControlled",
`--fingerprint=${seed}`,

@@ -221,19 +220,9 @@ ];

// macOS: run as native Mac browser — GPU/UA match natively
return [
...base,
"--fingerprint-platform=macos",
"--fingerprint-gpu-vendor=Google Inc. (Apple)",
"--fingerprint-gpu-renderer=ANGLE (Apple, ANGLE Metal Renderer: Apple M3, Unspecified Version)",
];
return [...base, "--fingerprint-platform=macos"];
}
// Linux/Windows: spoof as Windows desktop
// Hardware concurrency, device memory, screen, and window size are
// Hardware concurrency, device memory, screen, window size, and GPU are
// auto-generated by the binary from the seed (v14+).
return [
...base,
"--fingerprint-platform=windows",
"--fingerprint-gpu-vendor=Google Inc. (NVIDIA)",
"--fingerprint-gpu-renderer=ANGLE (NVIDIA, NVIDIA GeForce RTX 3070 (0x00002484) Direct3D11 vs_5_0 ps_5_0, D3D11)",
];
return [...base, "--fingerprint-platform=windows"];
}

@@ -109,3 +109,3 @@ /**

...(options.userAgent ? { userAgent: options.userAgent } : {}),
viewport: options.viewport ?? DEFAULT_VIEWPORT,
viewport: options.viewport === undefined ? DEFAULT_VIEWPORT : options.viewport,
...(options.colorScheme ? { colorScheme: options.colorScheme } : {}),

@@ -185,3 +185,3 @@ });

...(options.userAgent ? { userAgent: options.userAgent } : {}),
viewport: options.viewport ?? DEFAULT_VIEWPORT,
viewport: options.viewport === undefined ? DEFAULT_VIEWPORT : options.viewport,
...(options.colorScheme ? { colorScheme: options.colorScheme } : {}),

@@ -188,0 +188,0 @@ ...options.launchOptions,

@@ -39,3 +39,3 @@ /**

/** Viewport size. */
viewport?: { width: number; height: number };
viewport?: { width: number; height: number } | null;
/** Browser locale, e.g. "en-US". */

@@ -42,0 +42,0 @@ locale?: string;

@@ -24,8 +24,5 @@ import { describe, it, expect } from "vitest";

expect(args).toContain("--no-sandbox");
expect(args).toContain("--disable-blink-features=AutomationControlled");
if (isMac) {
expect(args).toContain("--fingerprint-platform=macos");
// macOS: no hardware-concurrency or GPU spoofing (uses native values)
expect(args.some((a) => a.includes("hardware-concurrency"))).toBe(false);
} else {

@@ -35,2 +32,6 @@ expect(args).toContain("--fingerprint-platform=windows");

// GPU flags removed — binary auto-generates from seed + platform
expect(args.some((a) => a.includes("fingerprint-gpu-vendor"))).toBe(false);
expect(args.some((a) => a.includes("fingerprint-gpu-renderer"))).toBe(false);
// Should have a random fingerprint seed

@@ -37,0 +38,0 @@ const fingerprintArg = args.find((a) => a.startsWith("--fingerprint="));

+10
-13
Metadata-Version: 2.4
Name: cloakbrowser
Version: 0.3.20
Version: 0.3.21
Summary: Stealth Chromium that passes every bot detection test. Drop-in Playwright replacement with source-level fingerprint patches.

@@ -596,11 +596,7 @@ Project-URL: Homepage, https://github.com/CloakHQ/CloakBrowser

| `--fingerprint-platform` | `windows` | `macos` | `navigator.platform`, User-Agent OS, GPU pool selection |
| `--fingerprint-gpu-vendor` | `NVIDIA Corporation` | `Google Inc. (Apple)` | WebGL `UNMASKED_VENDOR_WEBGL` |
| `--fingerprint-gpu-renderer` | `NVIDIA GeForce RTX 3070` | `ANGLE (Apple, ANGLE Metal Renderer: Apple M3, Unspecified Version)` | WebGL `UNMASKED_RENDERER_WEBGL` |
The binary auto-generates hardware concurrency (8), device memory (8), and screen dimensions (1920x1080 on Windows/Linux, 1440x900 on macOS) from the seed. Override with explicit flags if needed.
The binary auto-generates everything else from the seed: GPU, hardware concurrency, device memory, and screen dimensions. Each seed produces a unique, consistent fingerprint. Override with explicit flags if needed.
> **Using the binary directly?** It works out of the box with zero flags — the binary auto-spoofs everything. Pass `--fingerprint=seed` for a persistent identity, or use explicit flags like `--fingerprint-gpu-renderer` to override any auto-generated value.
> **Using the binary directly?** It works out of the box with zero flags -- the binary auto-spoofs everything. Pass `--fingerprint=seed` for a persistent identity, or use explicit flags like `--fingerprint-gpu-renderer` to override any auto-generated value.
> **Production tip:** For better stealth at scale, pass your own GPU, screen, and hardware values instead of relying on defaults. Custom parameters make your sessions harder to cluster by anti-bot systems that look for uniform fingerprint profiles.
### Additional Flags

@@ -612,2 +608,4 @@

|------|----------|
| `--fingerprint-gpu-vendor` | WebGL `UNMASKED_VENDOR_WEBGL` (auto-generated from seed + platform) |
| `--fingerprint-gpu-renderer` | WebGL `UNMASKED_RENDERER_WEBGL` (auto-generated from seed + platform) |
| `--fingerprint-hardware-concurrency` | `navigator.hardwareConcurrency` (auto-generated: `8`) |

@@ -642,7 +640,5 @@ | `--fingerprint-device-memory` | `navigator.deviceMemory` in GB (auto-generated: `8`) |

"--fingerprint-platform=windows",
"--fingerprint-gpu-vendor=NVIDIA Corporation",
"--fingerprint-gpu-renderer=NVIDIA GeForce RTX 3070",
])
# Override GPU to look like a different machine
# Override GPU to look like a specific machine
browser = launch(args=[

@@ -701,7 +697,7 @@ "--fingerprint-gpu-vendor=Intel Inc.",

|---|---|---|---|
| Linux x86_64 | 145 | 42 | ✅ Latest |
| Linux arm64 (RPi, Graviton) | 145 | 33 | ✅ |
| Linux x86_64 | 145 | 48 | ✅ Latest |
| Linux arm64 (RPi, Graviton) | 145 | 48 | ✅ |
| macOS arm64 (Apple Silicon) | 145 | 26 | ✅ |
| macOS x86_64 (Intel) | 145 | 26 | ✅ |
| Windows x86_64 | 145 | 33 | ✅ |
| Windows x86_64 | 145 | 48 | ✅ |

@@ -1114,1 +1110,2 @@ The wrapper auto-downloads the correct binary for your platform.

- [@yahooguntu](https://github.com/yahooguntu) — persistent contexts
- [@kitiho](https://github.com/kitiho) — null viewport fix

@@ -557,11 +557,7 @@ <p align="center">

| `--fingerprint-platform` | `windows` | `macos` | `navigator.platform`, User-Agent OS, GPU pool selection |
| `--fingerprint-gpu-vendor` | `NVIDIA Corporation` | `Google Inc. (Apple)` | WebGL `UNMASKED_VENDOR_WEBGL` |
| `--fingerprint-gpu-renderer` | `NVIDIA GeForce RTX 3070` | `ANGLE (Apple, ANGLE Metal Renderer: Apple M3, Unspecified Version)` | WebGL `UNMASKED_RENDERER_WEBGL` |
The binary auto-generates hardware concurrency (8), device memory (8), and screen dimensions (1920x1080 on Windows/Linux, 1440x900 on macOS) from the seed. Override with explicit flags if needed.
The binary auto-generates everything else from the seed: GPU, hardware concurrency, device memory, and screen dimensions. Each seed produces a unique, consistent fingerprint. Override with explicit flags if needed.
> **Using the binary directly?** It works out of the box with zero flags — the binary auto-spoofs everything. Pass `--fingerprint=seed` for a persistent identity, or use explicit flags like `--fingerprint-gpu-renderer` to override any auto-generated value.
> **Using the binary directly?** It works out of the box with zero flags -- the binary auto-spoofs everything. Pass `--fingerprint=seed` for a persistent identity, or use explicit flags like `--fingerprint-gpu-renderer` to override any auto-generated value.
> **Production tip:** For better stealth at scale, pass your own GPU, screen, and hardware values instead of relying on defaults. Custom parameters make your sessions harder to cluster by anti-bot systems that look for uniform fingerprint profiles.
### Additional Flags

@@ -573,2 +569,4 @@

|------|----------|
| `--fingerprint-gpu-vendor` | WebGL `UNMASKED_VENDOR_WEBGL` (auto-generated from seed + platform) |
| `--fingerprint-gpu-renderer` | WebGL `UNMASKED_RENDERER_WEBGL` (auto-generated from seed + platform) |
| `--fingerprint-hardware-concurrency` | `navigator.hardwareConcurrency` (auto-generated: `8`) |

@@ -603,7 +601,5 @@ | `--fingerprint-device-memory` | `navigator.deviceMemory` in GB (auto-generated: `8`) |

"--fingerprint-platform=windows",
"--fingerprint-gpu-vendor=NVIDIA Corporation",
"--fingerprint-gpu-renderer=NVIDIA GeForce RTX 3070",
])
# Override GPU to look like a different machine
# Override GPU to look like a specific machine
browser = launch(args=[

@@ -662,7 +658,7 @@ "--fingerprint-gpu-vendor=Intel Inc.",

|---|---|---|---|
| Linux x86_64 | 145 | 42 | ✅ Latest |
| Linux arm64 (RPi, Graviton) | 145 | 33 | ✅ |
| Linux x86_64 | 145 | 48 | ✅ Latest |
| Linux arm64 (RPi, Graviton) | 145 | 48 | ✅ |
| macOS arm64 (Apple Silicon) | 145 | 26 | ✅ |
| macOS x86_64 (Intel) | 145 | 26 | ✅ |
| Windows x86_64 | 145 | 33 | ✅ |
| Windows x86_64 | 145 | 48 | ✅ |

@@ -1075,1 +1071,2 @@ The wrapper auto-downloads the correct binary for your platform.

- [@yahooguntu](https://github.com/yahooguntu) — persistent contexts
- [@kitiho](https://github.com/kitiho) — null viewport fix

@@ -136,3 +136,5 @@ """Unit tests for config.py — platform detection, paths, stealth args."""

assert "--fingerprint-platform=macos" in args
assert any("Apple" in a for a in args)
# GPU flags removed — binary auto-generates from seed + platform
assert not any("fingerprint-gpu-vendor" in a for a in args)
assert not any("fingerprint-gpu-renderer" in a for a in args)

@@ -143,2 +145,4 @@ def test_linux_windows_profile(self):

assert "--fingerprint-platform=windows" in args
assert any("NVIDIA" in a for a in args)
# GPU flags removed — binary auto-generates from seed + platform
assert not any("fingerprint-gpu-vendor" in a for a in args)
assert not any("fingerprint-gpu-renderer" in a for a in args)