Skip to content
Open
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
2 changes: 1 addition & 1 deletion auth/faq.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,6 @@ See [Profiles — Multiple auth connections per profile](/auth/profiles#multiple

## How is Managed Auth billed?

Managed Auth is included on all paid plans with no per-connection fees. It uses browser sessions to log in and keep your sessions fresh—these count toward your browser usage like any other browser session.
Managed Auth is included on all plans with no per-connection fees. It uses browser sessions to log in and keep your sessions fresh—these count toward your browser usage like any other browser session.

Auth sessions are fast (typically 5-30 seconds each). Kernel monitors session health and re-authenticates automatically when sessions expire—most stay valid for days. For example, keeping 100 auth connections logged in typically costs less than $5/month in browser usage. See [Pricing & Limits](/info/pricing#managed-auth) for details.
51 changes: 26 additions & 25 deletions info/pricing.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -25,54 +25,55 @@ import { PricingCalculator } from '/snippets/calculator.jsx';
| Feature | Developer (free + usage) | Hobbyist ($30 / mo + usage) | Start-Up ($200 / mo + usage) | Enterprise |
| --- | --- | --- | --- | --- |
| Included credits / mo | $5 | $10 | $50 | Custom |
| Extended browser timeouts | ✅ | ✅ | ✅ | ✅ |
| Browser live view | ✅ | ✅ | ✅ | ✅ |
| Extended browser timeouts | ✅ | ✅ | ✅ | ✅ |
| Browser telemetry | ✅ | ✅ | ✅ | ✅ |
| Configurable browser viewports | ✅ | ✅ | ✅ | ✅ |
| Managed stealth mode | ✅ | ✅ | ✅ | ✅ |
| Stealth mode | ✅ | ✅ | ✅ | ✅ |
| Browser profiles | ✅ | ✅ | ✅ | ✅ |
| File i/o | ✅ | ✅ | ✅ | ✅ |
| Computer controls API | ✅ | ✅ | ✅ | ✅ |
| Browser replays | ❌ | 7 days | 30 days | Custom |
| Browser profiles | ❌ | ✅ | ✅ | ✅ |
| Managed auth profiles | ❌ | ✅ | ✅ | ✅ |
| File uploads & downloads | ❌ | ✅ | ✅ | ✅ |
| Configurable browser extensions | ❌ | ❌ | ✅ | ✅ |
| Browser replays | 1 day | 7 days | 30 days | Custom |
| Managed auth connections | 3 | unlimited | unlimited | unlimited |
| Configurable browser extensions | 1 | 1 | unlimited | unlimited |

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.

The "1" here is the cap on stored custom extensions per org (runtime loading into sessions isn't plan-limited), so naming it by what's counted:

Suggested change
| Configurable browser extensions | 1 | 1 | unlimited | unlimited |
| Custom browser extensions | 1 | 1 | unlimited | unlimited |

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.

It's a bit trickier to gate Chrome web extensions (which can be loaded at runtime) because we don't track it right now. Gating in custom browser extension upload is a lot easier and covers the majority case: very very few sessions use more than one extension, but lots of orgs have multiple custom browser extensions uploaded.

| Configurable & BYO proxies | ❌ | ❌ | ✅ | ✅ |
| Browser pools | ❌ | ❌ | ✅ | ✅ |

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.

Browser pools are in scope for the new packaging — ungated on every plan, with pool size naturally bounded by the plan's browser concurrency limit (kernel/kernel#3173):

Suggested change
| Browser pools | | |||
| Browser pools | | |||

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.

Un-gating browser pools in the PRD. Also, due to our fill rate, getting people to use browser pools is actually kinder on our infra, as disk i/o is the hardest blocker to VM packing and fill rate guards against this.

| GPU acceleration | ❌ | ❌ | ✅ | ✅ |
| Projects | 1 | 1 | unlimited | unlimited |
| Support | Discord | Discord | Email | Shared Slack |
| SOC2 compliance | ✅ | ✅ | ✅ | ✅ |
| GPU acceleration | ❌ | ❌ | ✅ | ✅ |
| HIPAA compliance (BAA) | ❌ | ❌ | ❌ | ✅ |

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

## Reserved browsers (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.

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

## Managed Auth

Managed Auth is included on all paid plans with no per-connection fees. Under the hood, it uses browser sessions to log in and keep your sessions fresh—these count toward your browser usage and concurrency like any other browser session.

Auth sessions are fast (typically 5-30 seconds each). Kernel monitors session health and re-authenticates automatically when sessions expire—most stay valid for days. For example, keeping 100 auth connections logged in typically costs less than $5/month in browser usage.

## Concurrency limits

Kernel enforces a single concurrency limit covering all browsers you run at oncewhether 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 oncewhether 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.

| Feature | Developer (free + usage) | Hobbyist ($30 / mo + usage) | Start-Up ($200 / mo + usage) | Enterprise |
| --- | --- | --- | --- | --- |
| Concurrent browsers | 5 | 10 | 150 | Custom |
| App invocations | 5 | 10 | 50 | Custom |
| App invocations | 5 | 10 | 150 | Custom |

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.

Suggested change
| App invocations | 5 | 10 | 150 | Custom |
| App invocations | 5 | 10 | 50 | Custom |

| App invocations (per-app) | 5 | 10 | 20 | Custom |
| Managed auth health check interval | N/A | 1 hour minimum | 20 minutes minimum | Custom |

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.

Free-plan connections now have a 6-hour minimum health-check interval (kernel/kernel#3143), so this cell shouldn't stay N/A:

Suggested change
| Managed auth health check interval | N/A | 1 hour minimum | 20 minutes minimum | Custom |
| Managed auth health check interval | 6 hours minimum | 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.
#### Notes
- 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.
- Browsers in [Standby Mode](/browsers/standby) count against your concurrency limit.
- Limits are org-wide by default unless stated otherwise. `Managed auth connections` refer to profiles with active auth connections that Kernel maintains using your stored [Credentials](/auth/credentials) or [1Password connection](/integrations/1password). A single profile can have multiple auth connections (one per domain)—see [Profiles](/auth/profiles#multiple-auth-connections-per-profile) for details.

## 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.

GPU acceleration is not available for browser pools.

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

Managed Auth is included on all plans with no per-connection fees. Under the hood, it uses browser sessions to log in and keep your sessions fresh—these count toward your browser usage and concurrency like any other browser session.
Comment thread
cursor[bot] marked this conversation as resolved.

Auth sessions are fast (typically 5-30 seconds each). Kernel monitors session health and re-authenticates automatically when sessions expire—most stay valid for days. For example, keeping 100 auth connections logged in typically costs less than $5/month in browser usage.

> Note: Limits are org-wide by default unless stated otherwise. `Managed auth profiles` refer to profiles with active auth connections that Kernel maintains using your stored [Credentials](/auth/credentials) or [1Password connection](/integrations/1password). A single profile can have multiple auth connections (one per domain) — see [Profiles](/auth/profiles#multiple-auth-connections-per-profile) for details.

## Rate limiting

Expand Down
19 changes: 8 additions & 11 deletions snippets/calculator.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -67,9 +67,6 @@ export const PricingCalculator = () => {
const labelStyle = { fontWeight: 600, fontSize: '0.875rem', minWidth: '10rem', flexShrink: 0, maxWidth: '10rem' };
const rowStyle = { display: 'flex', alignItems: 'center', gap: '0.5rem', minHeight: '2.25rem' };
const inputStyle = { minWidth: 0, flex: 1, maxWidth: '100%', boxSizing: 'border-box', background: 'transparent' };
const numberInputStyle = {
borderBottom: '1px solid #81b300', textAlign: 'right'
};
const selectStyle = {
...inputStyle,
appearance: 'none',
Expand All @@ -82,7 +79,7 @@ export const PricingCalculator = () => {
const btnStyle = (active) => ({
padding: '0.25rem 0.5rem',
borderRadius: '0.375rem',
border: `1px solid ${active ? '#81b300' : 'var(--btn-border)'}`,
border: '1px solid var(--btn-border)',
fontSize: '0.875rem',
background: active ? 'var(--btn-selected-bg)' : undefined,
});
Expand All @@ -99,11 +96,11 @@ export const PricingCalculator = () => {
</div>
<div style={rowStyle}>
<label style={labelStyle}>Session length (seconds)</label>
<input type="number" style={{...inputStyle, ...numberInputStyle}} value={avgSessionLength} onChange={(e) => { hasInteracted.current = true; setAvgSessionLength(parseInt(e.target.value)); }} />
<input type="number" style={{...inputStyle}} value={avgSessionLength} onChange={(e) => { hasInteracted.current = true; setAvgSessionLength(parseInt(e.target.value)); }} />
</div>
<div style={rowStyle}>
<label style={labelStyle}>Number of sessions</label>
<input type="number" style={{...inputStyle, ...numberInputStyle}} value={numSessions} onChange={(e) => { hasInteracted.current = true; setNumSessions(parseInt(e.target.value)); }} />
<input type="number" style={{...inputStyle}} value={numSessions} onChange={(e) => { hasInteracted.current = true; setNumSessions(parseInt(e.target.value)); }} />
</div>
<div style={rowStyle}>
<button class="btn btn-primary dark:text-white" style={btnStyle(browserType === 'headless')} onClick={() => handleBrowserTypeChange('headless')}>Headless</button>
Expand All @@ -113,15 +110,15 @@ export const PricingCalculator = () => {
<div style={rowStyle}>
<span style={{ width: '100%', fontSize: '0.8rem', fontStyle: 'italic' }}>
${(usagePrices * multiplier).toFixed(8)}/second
{browserType === 'gpu' && <span style={{ marginLeft: '0.5rem', color: '#81b300' }}>(Startup tier required)</span>}
{browserType === 'gpu' && <span style={{ marginLeft: '0.5rem' }}>(Startup tier required)</span>}
</span>
</div>
</Card>
<Card title="Price" icon="circle-dollar">
<div style={rowStyle}><span style={labelStyle}>Base plan:</span> <span style={{ background: flash ? '#81b300' : 'transparent', transition: 'background 0.5s ease', marginLeft: 'auto' }}>${planPrices[plan].toFixed(2)}</span></div>
<div style={rowStyle}><span style={labelStyle}>Usage:</span> <span style={{ background: flash ? '#81b300' : 'transparent', transition: 'background 0.5s ease', marginLeft: 'auto' }}>+${usageCost.toFixed(2)}</span></div>
<div style={rowStyle}><span style={labelStyle}>Free credits:</span> <span style={{ background: flash ? '#81b300' : 'transparent', transition: 'background 0.5s ease', marginLeft: 'auto' }}>-${includedUsageCredits.toFixed(2)}</span></div>
<div style={rowStyle}><span style={labelStyle}>Total cost:</span> <span style={{ background: flash ? '#81b300' : 'transparent', transition: 'background 0.5s ease', marginLeft: 'auto' }}>${price.toFixed(2)}</span></div>
<div style={rowStyle}><span style={labelStyle}>Base plan:</span> <span style={{ background: flash ? '#CAB168' : 'transparent', transition: 'background 0.5s ease', marginLeft: 'auto' }}>${planPrices[plan].toFixed(2)}</span></div>
<div style={rowStyle}><span style={labelStyle}>Usage:</span> <span style={{ background: flash ? '#CAB168' : 'transparent', transition: 'background 0.5s ease', marginLeft: 'auto' }}>+${usageCost.toFixed(2)}</span></div>
<div style={rowStyle}><span style={labelStyle}>Free credits:</span> <span style={{ background: flash ? '#CAB168' : 'transparent', transition: 'background 0.5s ease', marginLeft: 'auto' }}>-${includedUsageCredits.toFixed(2)}</span></div>
<div style={rowStyle}><span style={labelStyle}>Total cost:</span> <span style={{ background: flash ? '#CAB168' : 'transparent', transition: 'background 0.5s ease', marginLeft: 'auto' }}>${price.toFixed(2)}</span></div>
</Card>
</Columns>
);
Expand Down
Loading