Skip to content

Commit 8f795ac

Browse files
masnwilliamsclaude
andcommitted
Merge origin/main into fumadocs-migration
Brings in #464 (browser-pools guide refresh) and #478 (chrome-policies URLAllowlist example). One manual resolution: main collapsed the browsers/pools/ subfolder (faq + overview) into a single browsers/pools.mdx; applied that at content/docs/browsers/pools.mdx and dropped the old subfolder (docs.json already redirects the old subpaths to /browsers/pools). All other content edits auto-merged. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2 parents 6bfb91e + 74cecd3 commit 8f795ac

26 files changed

Lines changed: 435 additions & 722 deletions

content/docs/auth/profiles.mdx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ You cannot load a profile into a browser that was already created with a profile
264264
</Warning>
265265

266266
<Note>
267-
To use profiles with browser pools, read: [Can pooled browsers save changes back to a profile?](/browsers/pools/faq#can-pooled-browsers-save-changes-back-to-a-profile)
267+
To use profiles with browser pools, see [Profiles with browser pools](/browsers/pools#profiles-with-browser-pools)
268268
</Note>
269269

270270
## Other ways to use profiles
@@ -494,5 +494,5 @@ _ = browser
494494
- Profiles store cookies and local storage. Start the session with `save_changes: true` to write changes back when the browser is closed.
495495
- To keep a profile immutable for a run, omit `save_changes` (default) when creating the browser.
496496
- Multiple browsers in parallel can use the same profile, but only one browser should write (`save_changes: true`) to it at a time. Parallel browsers with `save_changes: true` may cause profile corruption and unpredictable behavior.
497-
- `save_changes` applies to a profile attached to a single browser — either at creation (`kernel.browsers.create()`) or loaded afterward with `kernel.browsers.update()`. A profile set on a [browser pool's](/browsers/pools/overview) config is loaded read-only and never persisted; `save_changes` sent on a pool's profile is silently ignored. To persist per-user state through a pool, attach the profile after acquiring the browser and release with `reuse: false` — see [Per-user profiles with pools](/browsers/pools/overview#per-user-profiles-with-pools).
497+
- `save_changes` applies to a profile attached to a single browser — either at creation (`kernel.browsers.create()`) or loaded afterward with `kernel.browsers.update()`. A profile set on a [browser pool's](/browsers/pools) config is loaded read-only and never persisted; `save_changes` sent on a pool's profile is silently ignored. To persist per-user state through a pool, attach the profile after acquiring the browser and release with `reuse: false` — see [Per-user profiles with pools](/browsers/pools#per-user-profiles-with-browser-pools).
498498
- Profile data is encrypted end to end using a per-organization key.

content/docs/browsers/bot-detection/overview.mdx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,12 @@ Every Kernel browser launches with anti-detection chrome configuration applied.
3131
On top of the defaults, stealth mode adds a default ISP proxy and an automatic CAPTCHA solver. Both are opt-out so you can BYO proxy and/or CAPTCHA tooling.
3232

3333
### [Configurable Proxies](/proxies/overview)
34-
Bring your own proxy network or use Kernel's managed pool (selectable down to ZIP-code level). If needed, use the same IP to reduce detection and allow for regional testing or QA.
34+
Bring your own proxy network or use Kernel's managed proxy pool (selectable down to ZIP-code level). If needed, use the same IP to reduce detection and allow for regional testing or QA.
3535

3636
### [Profiles](/auth/profiles)
3737
Profiles persist cookies, local storage, and session data between runs. Combined with a fixed proxy, this mimics a returning user. We recommend using them to persist authenticated states and reduce CAPTCHAs.
3838

39-
### [Browser Pools](/browsers/pools/overview)
39+
### [Browser Pools](/browsers/pools)
4040
Browser pools let you reuse browsers across multiple visits to the same website, which introduces consistency with respect to the IP address. Since IP addresses are one of the main components of fingerprinting used by modern bot detection systems, browser pools drastically increase your chances of avoiding detection.
4141

4242
### [Playwright Execution API](/browsers/playwright-execution)
@@ -92,7 +92,7 @@ Kernel's [stealth mode](/browsers/bot-detection/stealth) uses static ISP proxies
9292

9393
[Residential proxies](/proxies/residential) route traffic through real consumer devices, making them the least detectable proxy type by ASN classification. However, exit IPs [rotate per connection](/proxies/residential#ip-rotation-behavior) since the underlying devices come online and offline dynamically — different tabs hitting different domains will likely show different public IPs.
9494

95-
Some IP-reputation-based detection systems (such as reCAPTCHA) can detect rotating pool traffic patterns and penalize them, regardless of how clean the individual exit IPs are. On the other hand, residential proxies tend to be a stronger choice against fingerprint-heavy vendors where detection focuses on the browser and behavioral layer rather than the network layer. Residential proxies also offer richer geo-targeting (country, state, city, ZIP, ASN) compared to ISP.
95+
Some IP-reputation-based detection systems (such as reCAPTCHA) can detect rotating proxy-pool traffic patterns and penalize them, regardless of how clean the individual exit IPs are. On the other hand, residential proxies tend to be a stronger choice against fingerprint-heavy vendors where detection focuses on the browser and behavioral layer rather than the network layer. Residential proxies also offer richer geo-targeting (country, state, city, ZIP, ASN) compared to ISP.
9696

9797
### Datacenter proxies
9898

content/docs/browsers/chrome-policies.mdx

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ Keys are Chrome policy names and values are the corresponding settings. The same
99

1010
## Setting chrome policies on a pool
1111

12-
Pass a `chrome_policy` object when [creating](/browsers/pools/overview#create-a-pool-of-reserved-browsers) or [updating](/browsers/pools/overview#update-a-pool) a pool.
12+
Pass a `chrome_policy` object when [creating](/browsers/pools#create-a-browser-pool) or [updating](/browsers/pools#update-a-browser-pool) a pool.
1313

1414
<CodeGroup>
1515
```typescript Typescript/Javascript
@@ -272,6 +272,38 @@ const browser = await kernel.browsers.create({
272272
```
273273
</CodeGroup>
274274

275+
### Restrict navigation to specific URLs
276+
277+
To lock a browser to an approved set of URLs, block everything with `URLBlocklist` and then allow back only the URLs you want with `URLAllowlist`. Entries match a whole domain (`chatgpt.com`) or a specific path (`en.wikipedia.org/wiki/Cat`), and more specific entries take precedence. This gates top-level navigation, so any other URL returns `ERR_BLOCKED_BY_ADMINISTRATOR`; it does not block resources or API calls a permitted page loads from other origins.
278+
279+
<CodeGroup>
280+
```python Python
281+
from kernel import Kernel
282+
283+
kernel = Kernel()
284+
285+
browser = kernel.browsers.create(
286+
chrome_policy={
287+
"URLBlocklist": ["*"],
288+
"URLAllowlist": ["chatgpt.com", "en.wikipedia.org/wiki/Cat"],
289+
}
290+
)
291+
```
292+
293+
```typescript Typescript/Javascript
294+
import Kernel from '@onkernel/sdk';
295+
296+
const kernel = new Kernel();
297+
298+
const browser = await kernel.browsers.create({
299+
chrome_policy: {
300+
URLBlocklist: ["*"],
301+
URLAllowlist: ["chatgpt.com", "en.wikipedia.org/wiki/Cat"],
302+
},
303+
});
304+
```
305+
</CodeGroup>
306+
275307
## Available policies
276308

277309
Any policy listed in the [Chrome Enterprise policy documentation](https://chromeenterprise.google/policies/) can be used in the `chrome_policy` object. Refer to the official docs for the full list of supported policy names, types, and values.

content/docs/browsers/curl.mdx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -157,9 +157,9 @@ func main() {
157157

158158
Browser curl concurrency is constrained by Chromium's internal networking limits:
159159

160-
- **HTTP/1.x (direct)** — About 6 sockets per host group and up to 256 active sockets per pool.
160+
- **HTTP/1.x (direct)** — About 6 sockets per host group and up to 256 active sockets per connection pool.
161161
- **Proxied chains** — On the order of tens of sockets per proxy chain (Chromium clamps configured values into a bounded range).
162162
- **HTTP stream pool** — Similar per-group and per-pool behavior to HTTP/1.x direct connections.
163163
- **HTTP/2** — Roughly 100 concurrent streams per session initially, updated from the server's `SETTINGS_MAX_CONCURRENT_STREAMS`, with an upper cap in Chromium (on the order of 256).
164164

165-
If you're issuing many parallel curls from one browser, you're sharing those pools with navigation, XHR, and other session traffic. Latency may vary, as Chromium may queue requests when it reaches its limits.
165+
If you're issuing many parallel curls from one browser, you're sharing those connection pools with navigation, XHR, and other session traffic. Latency may vary, as Chromium may queue requests when it reaches its limits.

content/docs/browsers/extensions.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ The response includes the extension's ID, name, size, and timestamps.
5252
Passing the extension name or ID to the `create` method will load it into the browser.
5353

5454
<Info>
55-
Loading an extension into a browser triggers a Chromium restart, which can take several seconds. Use [browser pools](/browsers/pools/overview) to access browsers with extensions faster.
55+
Loading an extension into a browser triggers a Chromium restart, which can take several seconds. Use [browser pools](/browsers/pools) to access browsers with extensions faster.
5656
</Info>
5757

5858

content/docs/browsers/live-view.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ connect-src https://*.onkernel.com:8443
8888
Kiosk mode provides a fullscreen live view experience without browser UI elements like the address bar and tabs. You can enable kiosk mode when creating a browser by setting the `kiosk_mode` parameter to `true`.
8989

9090
<Info>
91-
Kiosk mode triggers a Chromium restart, which can take several seconds. Use [browser pools](/browsers/pools/overview) to access kiosk mode browsers faster.
91+
Kiosk mode triggers a Chromium restart, which can take several seconds. Use [browser pools](/browsers/pools) to access kiosk mode browsers faster.
9292
</Info>
9393

9494
<CodeGroup>

content/docs/browsers/performance.mdx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ Kernel browsers [benchmark](https://www.kernel.sh/benchmarks) as the fastest, mo
1111
| P99 | 105ms | April 24, 2026 |
1212

1313
### Troubleshooting latency
14-
If you're experiencing slower-than-expected browser creation (or [browser pool acquisition](/browsers/pools/overview)), review your configuration for the following:
14+
If you're experiencing slower-than-expected browser creation (or [browser pool acquisition](/browsers/pools)), review your configuration for the following:
1515

1616
1. App code ⇔ Kernel browser region
1717

@@ -23,11 +23,11 @@ Kernel enforces [rate limits](/info/pricing#rate-limiting) on browser creation b
2323

2424
3. Non-default browser configurations
2525

26-
Certain browser configurations trigger Chromium to restart, which can take several seconds. Use [browser pools](/browsers/pools/overview) to access browsers with custom configurations faster. The following configurations cause browser restarts, as well as disrupt active CDP connections:
26+
Certain browser configurations trigger Chromium to restart, which can take several seconds. Use [browser pools](/browsers/pools) to access browsers with custom configurations faster. The following configurations cause browser restarts, as well as disrupt active CDP connections:
2727
- Custom viewport configurations
2828
- Chrome extensions
2929
- Setting the live view to `kiosk mode`
3030

3131
4. Browser pool refill rate
3232

33-
Browser pools fill at a [specified rate](https://www.kernel.sh/docs/api-reference/browser-pools/create-a-browser-pool#body-fill-rate-per-minute). Read about browser pool lifecycle best practices [here](/browsers/pools/overview#how-browser-pools-work).
33+
Browser pools fill at a [specified rate](https://www.kernel.sh/docs/api-reference/browser-pools/create-a-browser-pool#body-fill-rate-per-minute). Read about browser pool lifecycle best practices [here](/browsers/pools#how-browser-pools-work).

0 commit comments

Comments
 (0)