Pagerunner

The browser runtime whereAI agents actually work.

Site adapters replace fragile DOM guessing. Checkpoints let agents recover from failures. State persists across sessions.

Pagerunner — 4 agents · 18 sessions active
Claude Code
Cursor
Cline
OpenClaw
The problem

Two problems kill every agent workflow.

First, the login wall — headless browsers launch blank, hit MFA and CAPTCHAs, and break before the task starts. But the bigger problem? Mid-task failure with no recovery. Your agent completes 7 of 10 steps, hits an error, and restarts from scratch.

Standard approach Pagerunner
The login wall
SessionsLaunches blank, no cookiesOpens your real Chrome profile via CDP
Auth stateNo cookies, passwords, or historyInherits all saved credentials
Bot detectionMFA / CAPTCHA blocks itGenuine human browser fingerprint
ResultTask fails before it startsExecutes immediately, already authenticated
Mid-task failure
Step 7 failsRestart from step 1Resume from checkpoint at step 5
Browser stateLost — no saved stateTabs, cookies, localStorage preserved
Site changesCSS selectors break on redesignAdapters bridge to internal logic
ResultFragile, unreliable, can't recoverStable across redesigns, recoverable
How it works

Your agent. Three real workflows.

Not a mock. These are actual Pagerunner MCP calls with real Chrome, real auth, real results.

Dev loop
Morning standup
From your phone
Claude Code — Pagerunner MCP
chrome://newtab
profilework · 8 tabs screenshots2 taken re-logins0 tokens~180 vs ~2,000 (Computer Use) resultfix committed ✓
8:00am cron → Pagerunner MCP
chrome://newtab
trigger8:00am cron PII tokens4 replaced re-logins0 resultstandup posted to Slack ✓
WhatsApp → OpenClaw → Pagerunner
9:41●●●
skyscanner.com
triggerWhatsApp message stealthbot signals masked emailnever in LLM context resultLH4829-XK booked ✓
Engineered for every stage of adoption
⚙️
The AI Builder
Rapid prototyping.
  • Cares about Claude Code integration
  • Requires the full suite of 44 MCP tools
  • Relies on Site Intelligence adapters to bridge internal site logic
🛡️
Enterprise SecOps
Risk mitigation.
  • Mandates SSRF protection and prompt injection sanitization
  • Requires immutable audit logs for compliance review
  • Enforces strict domain allowlisting per agent session
The Local Power User
Daily workflow friction.
  • Uses the native macOS menu bar app
  • Relies on persistent Daemon mode — no terminal required
  • Leverages existing personal Chrome profiles effortlessly
01 / 05

Site Intelligence: beyond the DOM

Browser automation that relies only on clicking UI elements breaks every time a site ships a redesign. Site Intelligence lets agents bridge directly to the site's internal logic — bypassing clunky UI entirely or tracking which selectors are stable over time.

  • JS Adapters — use register_adapter and generate_adapter to bridge the agent directly to internal site logic
  • Direct API Invocation — bypass clunky UI with call_site_api for rapid, API-style execution inside the authenticated session
  • Resilience Tracking — built-in selector stability tracking so agents aren't broken by minor frontend UI updates
  • Auth token detection — automatically extracts tokens from the live DOM for authenticated API calls
site intelligence
# Generate an adapter from live page
generate_adapter({
  session: "work",
  url: "jira.company.com/issues"
})
# → adapter.js with stable selectors + API map
 
# Call internal site API directly
call_site_api({
  method: "GET",
  path: "/api/v2/users/data",
  session: "work"
})
Response: authenticated · 143ms
 
# Selector stability report
get_site_knowledge("jira.company.com")
14 selectors · 12 stable · 2 fragile
02 / 05

Checkpoints & state recovery

When your agent fails mid-task, it doesn't start over. Checkpoints save complete browser state — tabs, cookies, localStorage, scroll position — so agents resume from where they left off. Not from step one.

  • Auto-checkpoints — state saved continuously, no manual trigger needed
  • Named checkpoints — save at critical milestones with save_session_checkpoint
  • Full state capture — tabs, cookies, localStorage, scroll position, form data
  • Instant resumerestore_session_checkpoint picks up exactly where it stopped
  • No other browser MCP does this
checkpoint recovery flow
# Agent completes steps 1–5
save_session_checkpoint("after-step-5")
Checkpoint saved · 3 tabs · 12 cookies
 
# Step 6 fails — network timeout
navigate("app.company.com/submit")
Timeout after 30s
 
# Resume from checkpoint, not from scratch
restore_session_checkpoint("after-step-5")
Restored · 3 tabs · cookies · localStorage
 
# Retry step 6 only
navigate("app.company.com/submit")
Page loaded · 1.2s
03 / 05

Named profiles & encrypted snapshots

You log into GitHub, Jira, your staging environment once. Pagerunner saves the authenticated state — cookies, localStorage, session tokens — encrypted with AES-256-GCM, key stored in your macOS Keychain. Every agent call that follows starts already logged in.

  • Personal vs. agent profiles — keep your own browsing separate from automation
  • pagerunner init — auto-detects your Chrome profiles, creates config in 30 seconds
  • Snapshots on demand — save state at any point, restore to any previous checkpoint
  • Shared across tools — Claude Code, Cursor, and cron jobs all use the same profile
~/.pagerunner/config.toml
# Created by pagerunner init
 
[profiles.work]
kind = "personal"
chrome_profile = "Default"
 
[profiles.agent-jira]
kind = "agent"
allowed_domains = ["jira.company.com"]
anonymize = true
snapshot workflow
# One-time setup
pagerunner init --profile work
pagerunner snapshot --profile work
State saved · encrypted · 14 sites
 
# Every agent call after this:
open_session("work")
Chrome launched · all 14 sites authenticated
04 / 05

PII never reaches the LLM

A local ONNX NER model runs on your machine before get_content() returns anything to the agent. Emails, names, phone numbers, SSNs, credit cards, and IBANs are replaced with reversible tokens. The LLM works with tokens. Your data never leaves.

  • Tokenize modejohn@co.com[EMAIL:a3f9], reversible via vault
  • Redact mode — one-way, john@co.com[EMAIL]
  • ONNX NER — local model detects PERSON and ORG names, never calls an API
  • Form fill de-tokenizes — pass [EMAIL:a3f9] to fill(), real value written to DOM
  • No other browser MCP does this
PII anonymization flow
# Enable for a session
open_session("agent-hr", {
  anonymize: true,
  anonymization_mode: "tokenize"
})
 
# Page contains: "Contact: alice@acme.com, +1 555 0100"
 
get_content()
# Agent receives:
# "Contact: [EMAIL:a3f9], [PHONE:b2c1]"
 
# Agent can write tokens back:
fill("#email", "[EMAIL:a3f9]")
alice@acme.com written to DOM
05 / 05

Daemon + persistent agent memory

One daemon process, multiple AI clients, persistent memory outside the LLM context window. Agents remember what they learned across sessions — login patterns, site behavior, task history — without re-discovering it every run.

  • Unix socket IPC — all MCP clients auto-discover the running daemon
  • Agent memory — persistent key-value store survives across sessions, agents, and restarts
  • AES-256-GCM encryption — key stored in macOS Keychain, persists across restarts
  • macOS menu bar — see active sessions, browse KV store, view audit log
  • Runs unattended — start in the morning, agents run all day
multi-agent coordination
# Start once
pagerunner daemon &
Daemon started · socket: ~/.pagerunner/daemon.sock
 
# Claude Code agent stores a result
kv_set("standup", "2026-03-21", data)
 
# Cursor agent reads it
kv_get("standup", "2026-03-21")
Data retrieved across MCP clients
 
# Cron job uses the same session
pagerunner kv-get standup 2026-03-21
Same store, CLI or MCP
0
MCP Tools
0
CLI subcommands
AES-256-GCM
Encrypted state
1–2s
Action latency
Free
Open source
Daemon mode

The "Always-On" persistence loop.

Start once. Run all day. Sessions survive restarts, context survives across Claude windows.

STEP 01
Daemon Mode

A background service initializes, sharing one browser state across multiple Claude Code windows and MCP clients simultaneously.

STEP 02
Auto-Checkpoints

Pagerunner continuously saves the complete browser state — tabs, cookies, localStorage — so nothing is lost between agent interactions.

STEP 03
TCP Auto-Reattach

If the daemon restarts, the system automatically reattaches to the active session via TCP without losing context or requiring manual reconnection.

STEP 04
Native Menu Bar

Manage sessions, control checkpoints, and monitor the daemon entirely from a native Swift companion app — no terminal window required.

Who uses it

Every team has a browser problem.

Pagerunner is how they solve it — without writing scrapers, managing auth, or babysitting headless Chrome.

Engineer
Frontend verification loop

Edit CSS, navigate, screenshot, compare to design spec — without touching the browser yourself. Agent closes the loop.

navigate("localhost:3000") → screenshot()
Product Manager
Competitive intelligence

Track competitor pricing, feature pages, and changelog on a schedule. Morning briefing, automatically compiled.

navigate(competitor) → get_content() → kv_set()
Designer
Visual regression on every PR

Screenshot feature branches at 375px, 768px, 1440px. Pixel-diff against baseline. Flag regressions before merge.

screenshot() · --viewport 375x812
Growth
SEO rank monitoring

Track your rankings and competitors'. Surface ranking drops before they hurt traffic. No third-party SaaS required.

navigate(serp) → get_content()
Security Team
PII-safe web automation

Legal, HR, finance workflows where PII can't reach an external LLM. Local ONNX NER + token vault makes it possible.

get_content({ anonymize: true, mode: "tokenize" })
DevOps / SRE
Admin console runbooks

Queue depths, error counts, certificate expiry — read from dashboards that have no API. Screenshot for audit trail.

navigate(admin) → get_content() → screenshot()
Sales
Pre-call account research

Website, LinkedIn, Crunchbase, press in 2 minutes before every call. Agent reads, synthesizes, CRM field updated.

navigate(prospect) → get_content() → fill(crm)
Founder
Morning intelligence brief

Revenue, support queue, competitor mentions, PR status — all pulled, summarized, waiting in Slack at 8am.

open_session("agent") → kv_set("brief", data)
Security

The zero-trust security shield.

Three layers of protection around your Chrome profile and credentials. Browser automation without guardrails is dangerous — Pagerunner ships with controls most tools never considered.

SSRF protection

Blocks navigation to private IPs (RFC1918), loopback, file://, javascript:, and embedded-credential URLs. An agent can't be tricked into leaking internal resources.

file://, 127.0.0.1, 192.168.x.x → blocked
🧹
Prompt injection sanitization

Strips hidden elements (display:none, visibility:hidden), HTML tags, and zero-width Unicode characters from page content before it reaches the agent.

Hidden text injection → removed before LLM sees it
🔒
AES-256-GCM encrypted state

All session snapshots and KV store data encrypted at rest. Encryption key stored in macOS Keychain. On Linux, set PAGERUNNER_DB_KEY env var.

Key in Keychain · AES-256-GCM · ReDB storage
📋
Append-only audit log

Every tool call logged to ~/.pagerunner/audit.log with timestamp, tool name, session, and result. File permissions 0600. Cannot be modified retroactively.

~/.pagerunner/audit.log · 0600 · append-only
🏔️
Domain allowlisting

Restrict any session to an explicit list of domains. An agent running a Jira automation can't navigate to Stripe or your internal admin console, even if instructed to.

allowed_domains: ["jira.company.com"]
Snapshot integrity verification

Before restoring a saved snapshot, Pagerunner verifies the origin matches. A snapshot saved for github.com cannot be injected into a different origin.

Origin checked before cookies injected

For Enterprise SecOps: enforceable guardrails.

Responsible Automation: The anonymize: true flag ensures workflows processing third-party data never leak PII to external LLM providers. GDPR/CCPA compliance without re-engineering your agent.

Blast Radius Containment: Domain allowlisting and SSRF protections prevent autonomous agents from pivoting into internal corporate networks or unauthorized applications — even if the agent is given malicious instructions.

config.toml — SecOps profile
[profiles.agent-finance]
kind = "agent"
 
[profiles.agent-finance.security]
allowed_domains = [
  "internal.corp",
  "api.partner.com"
]
ssrf_protection = true
anonymize_pii = true
audit_log = true
 
# Blocks RFC1918, loopback, file://, javascript:
# PII stripped before LLM · every call logged
How it stacks up

The honest comparison.

Most browser tools were built for testing. Pagerunner was built for agents.

Capability Pagerunner Computer Use Playwright MCP agent-browser Browserbase
Action latency1–2s30–60s1–3s1–2s2–5s
Tokens per action50–200~2,00050–20050–20050–200
Persistent auth✓ Encrypted snapshots✗ Re-login every run~ Session only✓ Auth vault~ Managed sessions
Checkpoint / recovery✓ Resume from checkpoint
Site adapters✓ Stable across redesigns
PII anonymization✓ Local ONNX NER
Daemon + KV store✓ Shared across clients✓ Basic
CLI parity✓ All 44 tools
Bot detection bypass✓ Stealth mode✗ Blocked frequently~ Headless tells~ Basic~ Cloud IP
SSRF protection✓ RFC1918 blocked~ Network isolation
Audit log✓ Append-only~ Cloud logs
Data locality✓ Never leaves machine✗ To Anthropic cloud✓ Local✓ Local✗ Cloud execution
CostFree · Open sourceUsage-basedFreeFree$20–$99/mo

agent-browser has recently added auth vault and basic daemon support. It still doesn't strip PII or protect against SSRF.  ·  Browserbase is the right choice for 100+ parallel sessions. For developer-scale work, local + free wins.

Get started in 60 seconds

Your agent is waiting.

Pick your client. Copy. Paste. Done.

Claude Code
Cursor
Windsurf
bash
# 1. Install
brew install enreign/tap/pagerunner
 
# 2. Register with Claude Code
claude mcp add pagerunner -- pagerunner mcp
 
# 3. Create a profile (Chrome opens — log in to your sites)
pagerunner init --profile work
 
# 4. Snapshot your auth state
pagerunner snapshot --profile work
 
# 5. Tell Claude to use it
echo "Use pagerunner MCP for browser tasks" >> CLAUDE.md
.cursor/mcp.json
# First: brew install enreign/tap/pagerunner
 
{
  "mcpServers": {
    "pagerunner": {
      "command": "pagerunner",
      "args": ["mcp"]
    }
  }
}
~/.codeium/windsurf/mcp_config.json
# First: brew install enreign/tap/pagerunner
 
{
  "mcpServers": {
    "pagerunner": {
      "command": "pagerunner",
      "args": ["mcp"]
    }
  }
}

The browser runtime where AI agents actually work.

Free forever. Open source. No cloud, no subscription, no surveillance.
Your sessions stay on your machine.

Responsible Use: You are responsible for complying with the Terms of Service of any website you automate and applicable data protection laws. Run your browser responsibly.