Thanks for your interest! This is a vendor-neutral browser-control layer — the core is a documented protocol and a CDP engine; backends are pluggable. We're building an open, self-hosted browser-control layer for AI agents — a Manifest V3 extension that drives the user's real browser, embeddable in your own product — and contributions of every size are welcome: new tools, transports, auth modes, docs, examples, and bug reports.
Good first contributions: add a tool, a computer action, a transport, or an
auth mode using the existing extension points (see Extending below) —
each is self-contained. Docs and example backends in other languages are just as
valuable. Found a bug or have an idea?
Open an issue, and
a ⭐ helps others discover the project.
This is a single pnpm workspace (Node.js 22+). One install at the repo root
covers the extension, the MCP server, and the
reference backend — there are no per-directory installs and one
pnpm-lock.yaml.
pnpm install
pnpm build # bundles src/ -> dist/ (load unpacked in chrome://extensions)pnpm format # prettier --write (or pnpm format:check to verify only)
pnpm lint
pnpm typecheck
pnpm test
pnpm buildOr run them all at once with pnpm check (format:check → lint →
typecheck → test → build). Every gate must pass — the
CI workflow runs the exact same sequence on Node 22
and 24, plus a build-output check and a CodeQL security scan.
- Bugs / features: open an issue — the repo ships issue forms for both. PRs use the pull-request template (a checklist tied to the gates above).
- Security vulnerabilities: please don't open a public issue — report them privately via GitHub Security advisories.
Use Conventional Commits — e.g.
feat: add scroll-by-selector action, fix: …, docs: …, chore: …. It keeps
history readable and lets release notes be generated automatically.
src/
├── shared/ # protocol types, brand, errors, logger, constants, utils
├── config/ # ConnectionConfig + ConfigStore (runtime backend settings)
├── background/
│ ├── transport/ # Transport interface + SSE/HTTP + WebSocket + factory
│ ├── auth/ # AuthProvider + TokenAuth
│ ├── cdp/ input/ screenshot/ tabs/ content-bridge/
│ └── tools/ # one class per tool (Command); computer/ = action strategies
├── content/ # in-page DOM introspection (a11y tree, find, forms)
├── options/ # settings page controller
└── popup/ # status + connect/disconnect
examples/ # reference backend + CLI (implements PROTOCOL.md)
- A new tool: add a
Toolclass undersrc/background/tools/, register it inall-tools.ts, and document it inPROTOCOL.md. Nothing else changes (Open/Closed via the registry). - A new
computeraction: add aComputerActionundertools/computer/actions/and register it incomputer-tool.ts. - A new transport: implement
Transport, add an arm totransport/factory.ts, and document its framing inPROTOCOL.md. - A new auth mode: implement
AuthProvider, add an arm tobuildAuth.
Keep pure logic free of chrome.* so it stays unit-testable (see tests/).
TypeScript strict mode; match the surrounding code's naming and comment density. Prefer small single-responsibility classes over growing a switch.