Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
45cf958
Refresh browser pool guides and standardize on "browser pools"
andrewleesteele Jul 28, 2026
bf5ab05
Add reuse-isolation, throughput, and profile guidance to pools docs
andrewleesteele Jul 29, 2026
0ca62af
Remove the browser-pools quickstart, point entry links to the overview
andrewleesteele Jul 29, 2026
ad048aa
Reframe home-page pools blurb: production step, not a day-one default
andrewleesteele Jul 29, 2026
8f38449
Fold the browser-pools FAQ into the overview and delete it
andrewleesteele Jul 29, 2026
fd9c595
Spell out "browser pool" in prose; stop using bare "pool"
andrewleesteele Jul 29, 2026
802f277
Merge remote-tracking branch 'origin/main' into hypeship/browser-pool…
andrewleesteele Jul 29, 2026
f2bc19e
Collapse browser pools to a single page at /browsers/pools
andrewleesteele Jul 29, 2026
1a43c11
Disambiguate non-browser-pool "pool" mentions
andrewleesteele Jul 29, 2026
bb8cca9
Soften the pool-sizing threshold and add a Limitations section
andrewleesteele Jul 30, 2026
042447f
Drop the ~50 threshold from pool sizing guidance
andrewleesteele Jul 30, 2026
b6987e8
Rewrite the Scale page around benefit → when-to-use, soften home CTA
andrewleesteele Jul 30, 2026
8618c4e
Stop describing browser pools as "warm"
andrewleesteele Jul 30, 2026
58517c6
Tidy the Browser Pools page description
andrewleesteele Jul 30, 2026
99e5ce2
Reword pools intro: configure a set of identical browsers
andrewleesteele Jul 30, 2026
6b87a04
Dedupe the Browser Pools page
andrewleesteele Jul 30, 2026
59fcb57
Point the profiles cross-link at the whole pools profiles section
andrewleesteele Jul 30, 2026
bfe3a06
Flag the profile constraints in the pools intro
andrewleesteele Jul 30, 2026
0f19f9f
Tighten the Browser Pools page to behavior and reference
andrewleesteele Jul 30, 2026
52b75d5
Trim the pools page to behavior and the operations that carry it
andrewleesteele Jul 30, 2026
6f322a2
Reorder pools sections and trim the limitations to pointers
andrewleesteele Jul 30, 2026
d75d11b
Apply review feedback to the pools and pricing pages
andrewleesteele Jul 30, 2026
f6abf40
Polish the pools page after review
andrewleesteele Jul 30, 2026
a4c7e45
Open the pools page with a definition
andrewleesteele Jul 30, 2026
d67b61c
Tighten browser pools copy and fix update-size docs
andrewleesteele Aug 3, 2026
327ca95
Replace "the right tool" in the Scale intro
andrewleesteele Aug 3, 2026
cd11471
Add pools/faq redirect and drop remaining reserved-browsers wording
andrewleesteele Aug 4, 2026
0281a92
Merge branch 'main' into hypeship/browser-pools-docs-refresh
andrewleesteele Aug 5, 2026
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
2 changes: 1 addition & 1 deletion auth/profiles.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -264,7 +264,7 @@ You cannot load a profile into a browser that was already created with a profile
</Warning>

<Note>
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)
To use profiles with browser pools, see [Per-user profiles with pools](/browsers/pools/overview#per-user-profiles-with-pools)
</Note>

## Other ways to use profiles
Expand Down
74 changes: 0 additions & 74 deletions browsers/pools/faq.mdx

This file was deleted.

33 changes: 27 additions & 6 deletions browsers/pools/overview.mdx
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
---
title: "Overview"
description: "Pre-configure pools of reserved browsers"
description: "Pre-configure pools of warm, ready-to-use browsers"
---

Browser pools let you maintain a set of reserved, identical browsers ready for immediate use. Use them to set your preferred browser configuration in advance (such as stealth, proxies, extensions, and profiles), allowing you to minimize browser start-up latency and scale your workloads in production.
Browser pools let you maintain a set of identically-configured browsers ready for immediate use. Use them to set your preferred browser configuration in advance (such as stealth, proxies, extensions, and profiles), allowing you to minimize browser start-up latency and scale your workloads in production.

Acquiring a browser from a pool is faster than creating a browser directly. Reserved browsers and on-demand browsers share the same concurrency limit, and reserved browsers aren't billed until they're used. See [Scale](/introduction/scale) for how pools fit into best practices for production architecture.
Acquiring a browser from a pool is faster than creating a browser directly. Pooled browsers and on-demand browsers share the same concurrency limit, and browsers sitting idle in a pool aren't billed until they're used. See [Scale](/introduction/scale) for how pools fit into best practices for production architecture.

Two things make acquisition faster than `browsers.create()`. The browser is already booted with your configuration applied — including [configurations that restart Chromium](/browsers/performance#troubleshooting-latency) when applied to a fresh browser, such as custom viewports, extensions, and kiosk-mode live view. And acquiring from a pool isn't subject to the [rate limit](/info/pricing#rate-limiting) on browser creation that high-volume workloads otherwise hit.

## How browser pools work

Expand Down Expand Up @@ -38,7 +40,7 @@ Browser pools are a way to pre-configure a fixed set of browsers without being c
</Steps>


## Create a pool of reserved browsers
## Create a pool

Create a browser pool with a specified size and configuration. All browsers in the pool share the same settings.

Expand Down Expand Up @@ -125,7 +127,7 @@ func main() {

Pools can be pre-configured with options like start url, custom extensions, supported viewports, residential proxies, profiles, and more. See the [API reference](https://kernel.sh/docs/api-reference/browser-pools/create-a-browser-pool) for more details.

A profile attached to a pool is loaded read-only: pooled browsers never persist changes back to the profile, so `save_changes` does not apply to pools (it is silently ignored if sent). To capture profile state, use a single browser session with `save_changes` instead — see [Profiles](/auth/profiles).
A profile attached to a pool is loaded read-only: pooled browsers never persist changes back to the profile, so `save_changes` does not apply to pools (it is silently ignored if sent). This doesn't block per-user persistence — to load and save per-user profiles through a pool's warm browsers, attach the profile *after* you acquire, following [Per-user profiles with pools](#per-user-profiles-with-pools). For a standalone session, use [Profiles](/auth/profiles) with `save_changes`.

When a pool has a profile attached, `refresh_on_profile_update` is automatically enabled — the pool flushes idle browsers whenever the profile's contents are updated, so it always picks up the latest profile data. See [Refresh on profile update](#refresh-on-profile-update) below.

Expand Down Expand Up @@ -176,6 +178,15 @@ Browsers remain in the pool indefinitely until acquired. Once acquired, the pool

When you're done with a browser, release it back to the pool. By default, the browser instance is reused. Set `reuse: false` to destroy it and create a fresh one.

Reuse controls whether browser state carries across acquisitions:

- **`reuse: true`** (default) returns the same browser instance to the pool without resetting it. Cookies, local storage, logged-in sessions, and open tabs persist, and the next caller to acquire it inherits that state. Fast, but not isolated between acquirers.
- **`reuse: false`** destroys the browser and refills the pool with a fresh one. Isolated and clean, at the cost of a rebuild at the pool's [fill rate](https://kernel.sh/docs/api-reference/browser-pools/create-a-browser-pool#body-fill-rate-per-minute).

<Warning>
If you acquire pooled browsers on behalf of different end users, releasing with `reuse: true` leaks one user's session to the next. Use `reuse: false` for per-user work — see [Per-user profiles with pools](#per-user-profiles-with-pools).
</Warning>

<CodeGroup>
```typescript Typescript/Javascript
await kernel.browserPools.release("my-pool", {
Expand Down Expand Up @@ -268,7 +279,7 @@ You have three ways to get an in-use browser onto the new configuration:

## Per-user profiles with pools

A profile attached to the pool config is [read-only](#create-a-pool-of-reserved-browsers) and shared by every browser, so it can't hold per-user login state across many users in a single pool. To use a pool's pre-warmed browsers to load many different per-user profiles **and** persist each user's state, attach the profile to the browser *after* you acquire it, then destroy the browser on release:
A profile attached to the pool config is [read-only](#create-a-pool) and shared by every browser, so it can't hold per-user login state across many users in a single pool. To use a pool's pre-warmed browsers to load many different per-user profiles **and** persist each user's state, attach the profile to the browser *after* you acquire it, then destroy the browser on release:

1. **Create the pool with no profile.** A profile can only be loaded into a browser that was created without one, so the pool must be profile-free.
2. **Acquire a browser** from the pool.
Expand Down Expand Up @@ -472,6 +483,16 @@ if err := client.BrowserPools.Delete(ctx, "my-pool", kernel.BrowserPoolDeletePar
```
</CodeGroup>

## Sizing a browser pool

`retrieve` returns `available_count` (browsers ready to acquire right now) and `acquired_count` (browsers in use). Watch `available_count` to size the pool:

- If it regularly hits **0**, tasks are queueing behind `acquire` — the pool is too small.
- If it stays above **30–40%** of the pool size under normal load, you're over-provisioned and can shrink the pool to free up concurrency.
- Target **10–20%** available during typical load.

Resize at any time with `update` — no need to tear the pool down and rebuild it. Added capacity warms up at the pool's [fill rate](https://kernel.sh/docs/api-reference/browser-pools/create-a-browser-pool#body-fill-rate-per-minute), so raise the size before a traffic peak rather than during it. As a rough starting point, a browser pool earns its keep once you're running many browsers concurrently (roughly 50+); below that, on-demand `browsers.create()` is usually enough.

## Full example

This example assumes you've already created a pool named "my-pool". In practice, you'd create pools once (via the SDK, CLI, or dashboard) and then acquire from them repeatedly.
Expand Down
6 changes: 3 additions & 3 deletions browsers/pools/policy-json.mdx
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
---
title: "Custom Chrome Policies"
description: "Customize Chrome behavior in reserved browser pools using Chrome policies"
description: "Customize Chrome behavior in browser pools using Chrome policies"
---

Browser pools accept an optional [`chrome_policy`](https://kernel.sh/docs/api-reference/browser-pools/create-a-browser-pool#body-chrome-policy) object that lets you apply [Chrome enterprise policies](https://chromeenterprise.google/policies/) to every browser in the pool. Use this to control startup behavior, default homepages, bookmarks, and other browser-level settings.

## Setting chrome policies

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. Keys are Chrome policy names and values are the corresponding settings.
Pass a `chrome_policy` object when [creating](/browsers/pools/overview#create-a-pool) or [updating](/browsers/pools/overview#update-a-pool) a pool. Keys are Chrome policy names and values are the corresponding settings.

<CodeGroup>
```typescript Typescript/Javascript
Expand Down Expand Up @@ -176,7 +176,7 @@ The example above demonstrates setting a default homepage and managed bookmarks.

## Common use cases

`chrome_policy` is also accepted directly on `browsers.create()` when you don't need a reserved pool. The examples below use that path.
`chrome_policy` is also accepted directly on `browsers.create()` when you don't need a pool. The examples below use that path.

### Allow pop-ups

Expand Down
5 changes: 2 additions & 3 deletions docs.json
Original file line number Diff line number Diff line change
Expand Up @@ -162,11 +162,10 @@
]
},
{
"group": "Reserved Browsers",
"group": "Browser Pools",
"pages": [
"browsers/pools/overview",
"browsers/pools/policy-json",
"browsers/pools/faq"
"browsers/pools/policy-json"
]
}
]
Expand Down
2 changes: 1 addition & 1 deletion index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -75,4 +75,4 @@ kernel invoke my-agent my-task --payload '{"url": "https://example.com"}'

### scaling

once you're ready to scale, check out how to create a [pool of reserved browsers](/browsers/pools/overview).
[browser pools](/browsers/pools/overview) are how you take a working automation to production: they keep browsers warm and pre-configured so you skip start-up latency on every task, and idle browsers in a pool aren't billed. once you know how to create and drive a browser, browser pools are worth evaluating for almost any production workload.
2 changes: 2 additions & 0 deletions info/concepts.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ title: "Concepts"
## Browser
A `Browser` is a cloud-based browser managed by Kernel. They accept Chrome DevTools Protocol connections and can be used to run browser automations or web agents.

## Browser Pool

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

love this

A `Browser Pool` is a set of identically-configured browsers that Kernel keeps warm and ready to use. You acquire a browser from the pool when a task starts and release it back when the task finishes. Browser pools remove browser start-up latency from your workload — see [Browser Pools](/browsers/pools/overview).

## App
An `App` is a codebase deployed on Kernel. You can use Kernel for a variety of use cases, including web automations, data processing, and more.
Expand Down
8 changes: 4 additions & 4 deletions info/pricing.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,9 @@ import { PricingCalculator } from '/snippets/calculator.jsx';

> Note: Included monthly credits apply to usage costs only.

## Reserved browsers (browser pools)
## Browser pools

With Browser Pools, you pay the standard usage-based price per GB-second while browsers are running. Idle browsers in a pool incur no disk charges — you only pay when a browser is actively in use.
With [browser pools](/browsers/pools/overview), you pay the standard usage-based price per GB-second while browsers are running. Idle browsers in a pool incur no disk charges — you only pay when a browser is actively in use, so keeping a pool warm between tasks costs nothing.

> Note: GPU acceleration is not available for browser pools.

Expand All @@ -59,7 +59,7 @@ Auth sessions are fast (typically 5-30 seconds each). Kernel monitors session he

## Concurrency limits

Kernel enforces a single concurrency limit covering all browsers you run at once — whether created on demand with `browsers.create()` or reserved in a [browser pool](/browsers/pools/overview). Your full limit is available to either API in any mix.
Kernel enforces a single concurrency limit covering all browsers you run at once — whether created on demand with `browsers.create()` or warmed in a [browser pool](/browsers/pools/overview). Your full limit is available to either API in any mix.

| Feature | Developer (free + usage) | Hobbyist ($30 / mo + usage) | Start-Up ($200 / mo + usage) | Enterprise |
| --- | --- | --- | --- | --- |
Expand All @@ -68,7 +68,7 @@ Kernel enforces a single concurrency limit covering all browsers you run at once
| App invocations (per-app) | 5 | 10 | 20 | Custom |
| Managed auth health check interval | N/A | 1 hour minimum | 20 minutes minimum | Custom |

> Note: Reserved capacity in a [browser pool](/browsers/pools/overview) counts toward your concurrency limit whether or not the browsers are currently acquired — a pool sized to 40 browsers uses 40 of your limit. Browser pools are available on Start-Up and Enterprise plans.
> Note: A [browser pool](/browsers/pools/overview) counts toward your concurrency limit whether or not its browsers are currently acquired — a pool sized to 40 browsers uses 40 of your limit. Browser pools are available on Start-Up and Enterprise plans.

> Note: Browsers in [Standby Mode](/browsers/standby) count against your concurrency limit.

Expand Down
Loading