Skip to content

Commit 369f763

Browse files
committed
docs: changelog 2026-05-15, sync to 148.0.7778.168 with per-context proxy stability and canvas fingerprint replay
1 parent 50c0b37 commit 369f763

7 files changed

Lines changed: 32 additions & 21 deletions

File tree

CHANGELOG.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,15 @@
33
> **Research scope:** Entries in this changelog describe features evaluated in authorized labs and defensive benchmarking programs. Follow the [Legal Disclaimer](DISCLAIMER.md) and [Responsible Use Guidelines](RESPONSIBLE_USE.md). We work with security vendors to investigate any misuse, so report concerns to [support@botbrowser.io](mailto:support@botbrowser.io).
44
55

6+
## [2026-05-15]
7+
### Major
8+
- **Chromium Core → 148.0.7778.168**: Updated to Chrome 148 stable (148.0.7778.168). Web Platform consistency, rendering accuracy, and security patches stay aligned with upstream Chrome.
9+
10+
### Improvements
11+
- **Per-Context Proxy Stability**: `setBrowserContextFlags` now preserves the context proxy route when a later call only supplies `--proxy-ip`. Existing proxies configured via `Target.createBrowserContext` stay active, and explicit `--proxy-server` overrides still replace the route for new targets.
12+
- **Canvas Fingerprint Replay**: Full WebGPU canvas recording and kernel-side replay are now production-ready. Canvas operations across 2D, WebGL, and WebGPU are recorded, matched by operation hash at runtime, and returned from profile data rather than live GPU execution.
13+
14+
615
## [2026-05-09]
716
### Major
817
- **Chromium Core → 148.0.7778.120**: Updated to Chrome 148 stable (148.0.7778.120). Web Platform consistency, rendering accuracy, and security patches stay aligned with upstream Chrome.

CLI_FLAGS.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ This skips per-page IP lookups and speeds up navigation.
106106

107107
⚠️ Important:
108108
- Browser-level proxy: use `--proxy-server` for protected geo-detection across contexts
109-
- [Per-context proxy](PER_CONTEXT_FINGERPRINT.md) (ENT Tier1): set different proxies via `createBrowserContext({ proxy })`; BotBrowser auto-derives geo info in both cases. Guide: [Per-Context Proxy](https://botbrowser.io/docs/network/per-context-proxy/)
109+
- [Per-context proxy](PER_CONTEXT_FINGERPRINT.md) (ENT Tier1): set different proxies via `createBrowserContext({ proxyServer })` or `BotBrowser.setBrowserContextFlags` with `--proxy-server`; BotBrowser auto-derives geo info in both cases. Guide: [Per-Context Proxy](https://botbrowser.io/docs/network/per-context-proxy/)
110110
- Avoid: framework-specific options like `page.authenticate()` that disable BotBrowser's geo-detection, which may leak location information
111111

112112
<a id="--proxy-bypass-rgx"></a>
@@ -228,14 +228,14 @@ Guide: [Bookmark Seeding](https://botbrowser.io/docs/identity/bookmark-seeding/)
228228
### `--bot-canvas-record-file`
229229
Canvas forensics and tracking analysis.
230230

231-
Records all Canvas 2D, WebGL, and WebGL2 API calls to a JSONL file for forensic analysis and replay.
231+
Records all Canvas 2D, WebGL, WebGL2, and WebGPU API calls to a JSONL file for forensic analysis and replay.
232232

233233
```bash
234234
--bot-canvas-record-file="/tmp/canvaslab.jsonl"
235235
```
236236

237237
**Key Features:**
238-
- Complete Canvas 2D, WebGL, and WebGL2 API call recording with full parameter serialization
238+
- Complete Canvas 2D, WebGL, WebGL2, and WebGPU API call recording with full parameter serialization
239239
- Deterministic capture (noise variance disabled during recording)
240240
- JSONL format for easy parsing and analysis
241241
- HTML replay viewer with WebGL enum reverse-lookup and source location mapping

PER_CONTEXT_FINGERPRINT.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ await Promise.all([
204204

205205
Pass the proxy via context creation options, and set `--proxy-ip` via CDP to skip IP lookups.
206206

207-
> **Note**: Puppeteer uses `proxyServer`, Playwright uses `proxy: { server }`. See [examples/](examples/) for framework-specific syntax.
207+
> **Note**: Puppeteer uses `proxyServer`, Playwright uses `proxy: { server }`. See [examples/](examples/) for framework-specific syntax. `--proxy-ip` only updates the exit IP for geo-detection. When calling `setBrowserContextFlags` with only `--proxy-ip` (no `--proxy-server`), the proxy routing set via `createBrowserContext({ proxyServer })` is preserved.
208208
209209
```javascript
210210
// Puppeteer example
@@ -339,6 +339,8 @@ See [CLI_FLAGS.md](CLI_FLAGS.md) for the complete flag reference.
339339

340340
⚠️ Each context can load a completely different profile (`--bot-profile`), or use `--bot-config-*` flags to override specific settings from the browser's base profile.
341341

342+
⚠️ Proxy merge semantics are explicit: `--proxy-server` in `botbrowserFlags` sets or replaces the context proxy route, while `--proxy-ip` only supplies the exit IP for geo-detection. If a context was created with `createBrowserContext({ proxyServer })`, a later `setBrowserContextFlags` call with only `--proxy-ip` preserves that proxy route.
343+
342344
## High-Concurrency Tuning
343345

344346
When running many per-context fingerprints under one browser instance (for example, 20+ concurrent BrowserContexts), launch with [`--bot-gpu-emulation=priority`](CLI_FLAGS.md#--bot-gpu-emulation) to prioritize GPU and WebGPU command-buffer scheduling across sibling contexts. Default behavior is unchanged; this is an opt-in mode for high-concurrency workloads. See [`--bot-gpu-emulation` modes](docs/guides/deployment/LINUX_GPU_BACKEND.md#gpu-emulation-modes).

VALIDATION.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,6 @@ For detailed, measured performance data, see [BENCHMARK.md](BENCHMARK.md). Key f
299299
### Ongoing Studies
300300

301301
**Advanced Tracking Techniques:**
302-
- WebGPU tracking research
303302
- Machine learning-based tracking
304303
- Behavioral biometric analysis
305304
- Network-level tracking

docs/guides/getting-started/CANVASLAB.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# CanvasLab: Canvas Forensics and Tracking Analysis
22

3-
> Record Canvas 2D, WebGL, and WebGL2 API calls to study tracking techniques and verify fingerprint protection.
3+
> Record Canvas 2D, WebGL, WebGL2, and WebGPU API calls to study tracking techniques and verify fingerprint protection.
44
55
---
66

@@ -27,15 +27,15 @@ chromium-browser \
2727
"https://example.com"
2828
```
2929

30-
After the session, `/tmp/canvaslab.jsonl` contains every Canvas 2D, WebGL, and WebGL2 API call the page made. Open it in the [Replay Viewer](https://botswin.github.io/BotBrowser/tools/canvaslab/canvas_replay_viewer.html) to inspect calls interactively.
30+
After the session, `/tmp/canvaslab.jsonl` contains every Canvas 2D, WebGL, WebGL2, and WebGPU API call the page made. Open it in the [Replay Viewer](https://botswin.github.io/BotBrowser/tools/canvaslab/canvas_replay_viewer.html) to inspect calls interactively.
3131

3232
---
3333

3434
<a id="how-it-works"></a>
3535

3636
## How It Works
3737

38-
When `--bot-canvas-record-file` is set, BotBrowser intercepts every Canvas API call at the browser engine level and writes it to a JSONL file. Each line is a JSON object representing one API call, including:
38+
When `--bot-canvas-record-file` is set, BotBrowser intercepts every Canvas API call at the browser engine level and writes it to a JSONL file. This covers Canvas 2D, WebGL, WebGL2, and WebGPU. Each line is a JSON object representing one API call, including:
3939

4040
- **Event type**: `canvas_init`, `context_create`, `state`, `draw`, `read`, `resize`
4141
- **Full parameters**: all arguments serialized (ImageData as base64, Path2D as command arrays, gradients as color stops)
@@ -136,7 +136,7 @@ diff /tmp/canvaslab-linux.jsonl /tmp/canvaslab-macos.jsonl
136136

137137
## Next Steps
138138

139-
- [CanvasLab Documentation](../../../tools/canvaslab/). Complete reference including recording format, event types, and replay viewer usage.
139+
- [CanvasLab Documentation](../../../tools/canvaslab/). Complete reference including recording format, event types, replay viewer usage, and canvas fingerprint replay.
140140
- [Canvas Fingerprinting](../fingerprint/CANVAS.md). Configure Canvas noise and rendering consistency.
141141
- [WebGL Fingerprinting](../fingerprint/WEBGL.md). Manage WebGL parameter control.
142142
- [CLI Flags Reference](../../../CLI_FLAGS.md#--bot-canvas-record-file). Flag documentation.

docs/guides/network/PER_CONTEXT_PROXY.md

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,19 +120,23 @@ const ctxB = await browser.createBrowserContext({
120120

121121
### Using --proxy-ip to Skip Detection
122122

123-
When you know the exit IP for each proxy, pass it via `--proxy-ip` to skip the auto-detection step. This eliminates the one-time IP lookup overhead per context:
123+
When you know the exit IP for each proxy, pass it via `--proxy-ip` to skip the auto-detection step. This eliminates the one-time IP lookup overhead per context. The proxy routing set via `createBrowserContext({ proxyServer })` is preserved:
124124

125125
```javascript
126+
const ctx = await browser.createBrowserContext({
127+
proxyServer: "socks5://user:pass@proxy.example.com:1080",
128+
});
126129
await client.send("BotBrowser.setBrowserContextFlags", {
127130
browserContextId: ctx._contextId,
128131
botbrowserFlags: [
129132
"--bot-profile=/path/to/profile.enc",
130-
"--proxy-server=socks5://user:pass@proxy.example.com:1080",
131133
"--proxy-ip=203.0.113.1",
132134
],
133135
});
134136
```
135137

138+
> **Note**: `--proxy-ip` only updates the exit IP used for geo-detection. Omitting `--proxy-server` in `setBrowserContextFlags` does not clear proxy routing already set via `createBrowserContext({ proxyServer })`. If the context was created without `proxyServer`, pass `--proxy-server` in `botbrowserFlags` to set the per-context proxy route.
139+
136140
---
137141

138142
<a id="common-scenarios"></a>
@@ -222,6 +226,7 @@ await client.send("BotBrowser.setBrowserContextFlags", {
222226
| Geo signals identical across contexts | Each context needs a different proxy. Verify proxies resolve to different IPs. |
223227
| `setBrowserContextFlags` not found | Send CDP commands to the browser-level session, not a page-level session. |
224228
| Flags not taking effect | Call `setBrowserContextFlags` before creating any page in the context. |
229+
| Proxy seems lost after calling `setBrowserContextFlags` with `--proxy-ip` | Passing only `--proxy-ip` does not clear the proxy set via `createBrowserContext`. If no proxy was set during context creation, pass `--proxy-server` in `botbrowserFlags`; if the proxy still disappears, ensure you are on a current binary. |
225230
| Need to change proxy after context creation | Use `BotBrowser.setBrowserContextProxy` (ENT Tier3) for runtime switching. See [Dynamic Proxy Switching](DYNAMIC_PROXY_SWITCHING.md). |
226231

227232
---

tools/canvaslab/README.md

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,8 @@ CanvasLab records every Canvas 2D, WebGL, and WebGL2 API call so you can see exa
3636
|-----------|--------|
3737
| **Canvas 2D Recording** | **Shipped** - full API coverage with call stack tracking |
3838
| **WebGL / WebGL2 Recording** | **Shipped** - full API coverage including shaders, textures, buffers, uniforms |
39+
| **WebGPU Recording** | **Shipped** - full API coverage including adapters, devices, pipelines, render/compute passes, and readback |
3940
| **Replay Viewer** | **Shipped** - HTML-based event viewer with Canvas 2D and WebGL support |
40-
| **Canvas 2D Browser Replay** | **In Development** - reconstruct canvas operations from JSONL |
41-
| **WebGL Browser Replay** | **Planned** |
4241

4342
---
4443

@@ -53,10 +52,10 @@ chromium \
5352
```
5453

5554
**Step 2: Visit a site and let tracking happen**
56-
Go to the website you want to study. Let it load normally. CanvasLab will record every Canvas 2D, WebGL, and WebGL2 API call the tracking code makes.
55+
Go to the website you want to study. Let it load normally. CanvasLab will record every Canvas 2D, WebGL, WebGL2, and WebGPU API call the tracking code makes.
5756

5857
**Step 3: Look at what was recorded**
59-
Close BotBrowser. Your recording is saved to `/tmp/canvaslab.jsonl`. You can now see exactly what Canvas and WebGL calls the tracking code tried to make.
58+
Close BotBrowser. Your recording is saved to `/tmp/canvaslab.jsonl`. You can now see exactly what Canvas, WebGL, and WebGPU calls the tracking code tried to make.
6059

6160
---
6261

@@ -131,14 +130,11 @@ Close BotBrowser. Your recording is saved to `/tmp/canvaslab.jsonl`. You can now
131130

132131
---
133132

134-
## What's Next
133+
## Canvas Fingerprint Replay
135134

136-
### Canvas 2D Browser Replay (In Development)
137-
Load your JSONL recordings back into BotBrowser to test privacy protections:
138-
- **Verify privacy protection** - replay tracking code's Canvas calls and check if BotBrowser handles them correctly
139-
- **Cross-platform testing** - check that privacy works the same on Windows, macOS, and Linux
140-
- **Ongoing validation** - make sure each BotBrowser update keeps privacy protections working
135+
BotBrowser supports exact canvas fingerprint replay: when a profile contains canvas data for a specific site, BotBrowser returns those recorded values at runtime instead of performing live GPU/CPU rendering. This makes canvas fingerprints deterministic and site-specific.
141136

137+
Canvas data is embedded in the profile, not controlled by a CLI flag. To get a profile with replay support for a specific site or antibot system, contact us at [support@botbrowser.io](mailto:support@botbrowser.io). We analyze the target's canvas fingerprinting approach and provide a profile with the corresponding canvas data.
142138

143139
---
144140

0 commit comments

Comments
 (0)