Log in once. Never again.

Your AI agent gets a real Chrome browser — already authenticated, private, running whether you're there or not.

brew install pagerunner Star on GitHub
Works with Claude Code · Cursor · Windsurf · Any MCP client
See it in action
Dev loop
Morning standup
From your phone
# Agent edits CSS → verifies the change → ships open_session --profile work Chrome launched · work profile · 8 tabs restored github.com ✓ localhost:3000 ✓ figma.com ✓ navigate localhost:3000/components/button screenshot() compare_to_design("figma://button-primary") Color #E8C871 — off by 1. Editing tokens.css… navigate localhost:3000/components/button Matches design spec. Pushing to main.
# 8am cron · agent reads Jira · posts standup to Slack open_session --profile agent-jira Chrome launched · agent-jira profile · authenticated navigate jira.company.com/boards/sprint-42 get_content() → anonymize: true PII stripped: 3 PERSON tokens, 1 EMAIL token kv_set("standup", summary) Blockers: AUTH-847, INFRA-203. Posted to #standup.
# WhatsApp → Dispatch → Pagerunner → Chrome → back to you [WhatsApp] "book cheapest flight Berlin → London, next Friday" open_session --profile agent --stealth true Chrome launched · stealth mode · Cloudflare bypassed navigate skyscanner.com fill("#from", "BER") → fill("#to", "LHR") screenshot() → send to Dispatch [WhatsApp] "Lufthansa 06:55 · £94. Confirm?" Booking confirmed. Ref: LH4829-XK.
38
MCP Tools
232
Tests passing
AES-256
Encrypted state
1–2s
Action latency
MIT
Open source
Four things no other browser MCP does
Built for agents.
Not bolted on.
Every design decision starts from the same question: what does an AI agent actually need from a browser?
01
Named profiles & snapshots
Each agent gets its own Chrome profile with encrypted session state. Log into GitHub, Jira, your staging environment once — that's it, forever.
open_session("work")
# Chrome launches authenticated
# github ✓ jira ✓ staging ✓
02
PII never leaves your machine
A local ONNX model strips emails, phone numbers, SSNs, and credit cards before get_content() returns. Your data stays yours.
open_session("work", {
  anonymize: true,
  allowed_domains: ["jira.co"]
})
03
Daemon + shared encrypted state
One daemon, multiple agents, one shared KV store. Claude Code, Cursor, and your cron job all coordinate through the same browser — no conflicts.
# Start once, use everywhere
$ pagerunner daemon &
# All MCP clients auto-connect
04
Full CLI parity
Every one of the 38 MCP tools is also a CLI subcommand. Shell scripts, CI pipelines, cron jobs — Pagerunner runs wherever you do.
# Same tool, terminal or agent
$ pagerunner navigate "jira/board"
$ pagerunner screenshot --out ui.png
How it stacks up
The honest comparison.
Capability Pagerunner Computer Use Playwright MCP agent-browser
Action latency 1–2s 30–60s 1–3s 1–2s
Tokens per action 50–200 ~2,000 50–200 50–200
Persistent auth ✓ Encrypted snapshots ✗ Re-login every run ~ Session only ✓ Auth vault
PII anonymization ✓ Local ONNX
Daemon mode ✓ Shared KV store
CLI parity ✓ All 38 tools
macOS menu bar
Bot detection bypass ✓ Stealth mode ✗ Blocked frequently ~ Headless tells ~ Basic
Get started in 60 seconds
Your agent is waiting.
Pick your IDE and install. Works with any MCP-compatible client.
Claude Code
Cursor
Windsurf
bash
brew install enreign/tap/pagerunner
claude mcp add pagerunner -- pagerunner mcp
# Create a profile and snapshot your auth:
pagerunner init --profile work
# Chrome opens — log into your sites, then:
pagerunner snapshot --profile work
.cursor/mcp.json
{
  "mcpServers": {
    "pagerunner": {
      "command": "pagerunner",
      "args": ["mcp"]
    }
  }
}
.windsurf/mcp.json
{
  "mcpServers": {
    "pagerunner": {
      "command": "pagerunner",
      "args": ["mcp"]
    }
  }
}

The browser your
agent owns.

Free forever. Open source. No cloud, no subscription, no surveillance.

brew install pagerunner View on GitHub →