BrowserSkill
Audited from github.com/Tencent/BrowserSkill
BrowserSkill, from Tencent, lets AI agents work inside the user's real, logged-in Chrome or Edge browser. A Rust bsk CLI/daemon and a TypeScript extension read pages, fill forms, capture screenshots and debug network requests in a visible Agent Window.
- Language
- TypeScript
- License
- MIT
- Running for
- 3 months
- Team
- 6-20 people
Why this architecture
The agent keeps the browser's real login state and the user can watch and take over, because the design pairs a small native Rust daemon (callable from any agent's shell) with a WXT extension, instead of running a separate headless browser. A shared protocol crate keeps both sides in sync.
Tech stack by layer
9 technologies · audited Sep 25, 2026- ReactReact 19 UI for the Chrome/Edge extension popup and task views in apps/extension
- WXTWeb-extension framework that builds, zips and runs the Chromium extension in dev
- Tailwind CSSStyling for the extension and the shared packages/ui component library (Tailwind 4)
- TypeScriptLanguage for the extension, the VOM page model, i18n and the DeepSeek Harness plugin
- pnpmWorkspace manager for apps/* and packages/* alongside the Cargo workspace
- VitestUnit tests for the extension, VOM, i18n and the DSH plugin
- GitHub ActionsCI plus separate release workflows for the CLI, the extension and the DSH plugin
- DeepSeek Harness pluginpackages/dsh-plugin-browserskill exposes browser_* tools natively to DeepSeek Harness agents
BrowserSkill architecture diagram
Open SVGDiagram as text
- Coding agents (shell · skill bundles) → bsk CLI & daemon (Rust · Tokio): bsk commands
- DeepSeek Harness (browser_* tools) → bsk CLI & daemon (Rust · Tokio): tools
- bsk CLI & daemon (Rust · Tokio) → bsk-protocol (JSON-RPC · JSON Schemas): typed messages
- bsk CLI & daemon (Rust · Tokio) → Browser extension (React · WXT): WebSocket
- Browser extension (React · WXT) → Agent Window (real Chrome / Edge tab): automate
Key architectural decisions
5 decisions- 01
A native Rust daemon plus a browser extension, not a headless browser
crates/bsk-cli ships a single bsk binary that runs a background daemon; the WXT extension in apps/extension connects to it over WebSocket and acts inside the user's real, logged-in Chrome or Edge profile, so agents reuse existing sessions instead of launching Playwright or Puppeteer.
- 02
Protocol types live in their own crate with generated JSON Schemas
crates/bsk-protocol defines the JSON-RPC frames and tool payloads with serde and schemars; the root cli:build script runs its dump-schema binary first so the TypeScript side is built against the same schema.
- 03
Agent-agnostic via a shell CLI plus installable skill bundles
Any shell-capable agent drives the browser through bsk commands, and bsk install-skill writes the matching skill for each harness; scripts/check-skill-bundles.mjs and check-crate-skill.mjs keep the bundled skill text in sync with the crate.
- 04
Tasks run in a separate visible Agent Window
Per the README, tasks open in their own visible window and only borrow an existing tab when told to, so the user can keep working and step in for logins or verification. Recoverable session starts and browser profiles are covered in docs/.
- 05
Polyglot monorepo with one version across Cargo and npm
Cargo.toml pins workspace version 0.3.1, which the extension and DSH plugin package.json files also use. scripts/release.mjs and render-version-json.mjs drive the three release workflows (release-cli, release-extension, release-dsh-plugin).
How BrowserSkill is built
How BrowserSkill is structured
BrowserSkill is a polyglot monorepo with two workspaces side by side:
- Cargo workspace (
Cargo.toml, memberscrates/bsk-cliandcrates/bsk-protocol, Rust edition 2024,rust-version = "1.85"). - pnpm workspace (
pnpm-workspace.yaml, coveringapps/*andpackages/*).
The main pieces:
| Path | Role |
|---|---|
crates/bsk-cli |
The bsk binary: CLI commands, background daemon, skill installer |
crates/bsk-protocol |
JSON-RPC frames, tool payloads and JSON Schemas (dump-schema binary) |
apps/extension |
Chrome/Edge extension built with WXT and React 19 |
packages/vom |
TypeScript page-model package used by the extension |
packages/ui |
Shared React components (class-variance-authority, tailwind-merge) |
packages/i18n |
i18next setup shared across UIs |
packages/dsh-plugin-browserskill |
DeepSeek Harness plugin exposing browser_* tools |
evals/browser |
Browser task evaluations run with node --test |
docs/architecture.md describes the design. Focused docs cover browser profiles, long screenshots, operation audit, remote extension connection, sandboxed agents and website debugging.
Frontend
The extension in apps/extension uses WXT (opens in a new tab) for building, zipping and dev reload, with React 19, @remixicon/react icons and Tailwind CSS 4 through @tailwindcss/vite. Shared primitives come from @browser-skill/ui, which exports TypeScript source directly ("exports": { ".": "./src/index.ts" }) so no separate build step is needed inside the workspace. Tests run on Vitest with happy-dom and Testing Library.
Backend & APIs
There is no hosted backend. The "server" is the local bsk daemon in crates/bsk-cli, built on Tokio:
tokio-tungsteniteholds the WebSocket connection to the extension.hyperandhyper-utilprovide a small local HTTP server, withtokio-rustlsfor TLS.clap,dialoguerandconsolepower the interactive CLI (for examplebsk install-skill).reqwest(rustls),flate2,tar,zipandsha2handle self-update and bundle downloads.tracingwithtracing-appenderwrites structured logs.- Platform-specific process control uses
nixandlibcon Unix andwindows-sysjob objects and pipes on Windows.
crates/bsk-protocol depends only on serde, schemars, semver and thiserror, which keeps the wire contract small and publishable to crates.io on its own.
Data & persistence
BrowserSkill keeps no database. State lives in the browser (login sessions, the extension's local debugging history, which can be exported as JSON) and in local files written by the daemon (logs, and an optional operation audit described in docs/operation-audit.md).
Build, test & deploy
pnpm cli:buildrunscargo run -p bsk-protocol --bin dump-schema --lockedand thenpnpm -r build, so schema generation always happens before the TypeScript builds.- Linting uses Biome (
biome.json) plus Stylelint for CSS. Rust formatting and lints are configured inrustfmt.tomlandclippy.toml, and the toolchain is pinned inrust-toolchain.toml. - GitHub Actions:
ci.ymlplusrelease-cli.yml,release-extension.ymlandrelease-dsh-plugin.yml. install.shandinstall.ps1install the prebuilt binary to~/.local/bin.scripts/test-windows-daemon.ps1covers Windows daemon behaviour.- The release profile strips symbols and uses thin LTO with a single codegen unit.
Self-hosting notes
Local use needs three things: the bsk CLI (macOS, Linux x64/ARM64, Windows x64), the extension from the Chrome Web Store or Edge Add-ons (Chromium 125+), and a skill installed for the agent. AGENT_INSTALL.md is written so the agent itself can follow it. Agents running in sandboxes or on remote servers are covered in docs/sandboxed-agents.md and docs/remote-extension-connection.md.
What to copy (and what not to)
What to copy
- Putting the wire protocol in its own dependency-light crate and generating JSON Schemas from it before building the TypeScript side.
- Exposing a capability to every agent through a plain CLI plus installable skill text, instead of writing one integration per agent framework.
- Workspace packages that export
.tssource directly, which removes internal build steps in a pnpm monorepo.
What not to copy
- Keeping versions in sync by hand across Cargo and several npm packages needs custom release scripts (
scripts/release.mjs). Smaller projects can release components on their own version tracks. - The
packageExtensionspatch inpnpm-workspace.yamlcovers for an upstream package's missing dependencies. That kind of workaround needs a comment and an exit plan.
Sources & repo audit
- Cargo.toml (Rust workspace, Tokio, tungstenite, release profile)
- apps/extension/package.json (WXT, React 19, Tailwind 4, Vitest)
- docs/architecture.md
- README (quick start and capabilities)
Independent analysis of repository at github.com/Tencent/BrowserSkill. Spotted an inaccuracy? Use the claim form to request a correction.
Maintainer? Add the architecture badge to your README
[](https://stackitfast.com/project/browserskill) Scaffold it with your agent
Paste this prompt into Claude Code, Cursor, Windsurf or AGY to start a project with BrowserSkill's architecture.
- 1Copy the promptThe full markdown spec, with every layer and decision.
- 2Open your AI toolClaude Code, Cursor, Windsurf or Copilot, in a new repo.
- 3Paste and scaffoldUse it as the first instruction; review before you ship.
# MISSION: Scaffold "BrowserSkill" Production Architecture
You are an expert Senior Staff Software Architect and Full-Stack Engineer. Your mission is to scaffold and implement a production-grade, highly reliable, and modular codebase following the proven architecture of **BrowserSkill**.
---
## 1. PROJECT SPECIFICATIONS & BENCHMARK
- **Reference Architecture**: BrowserSkill
- **What It Does**: BrowserSkill, from Tencent, lets AI agents work inside the user's real, logged-in Chrome or Edge browser. A Rust bsk CLI/daemon and a TypeScript extension read pages, fill forms, capture screenshots and debug network requests in a visible Agent Window.
- **Domain & Category**: Browser Automation Bridge for AI Agents
- **Production Scale**: 6-20 people
- **Development Mode**: CLASSIC
- **Architectural Rationale**: The agent keeps the browser's real login state and the user can watch and take over, because the design pairs a small native Rust daemon (callable from any agent's shell) with a WXT extension, instead of running a separate headless browser. A shared protocol crate keeps both sides in sync.
- **Live Website Reference**: https://github.com/Tencent/BrowserSkill
- **Source Repository**: https://github.com/Tencent/BrowserSkill
---
## 2. PRODUCTION TECH STACK
- **Full Stack Array**: Rust, TypeScript, Tokio, React, Tailwind CSS, WXT, Vitest, pnpm, GitHub Actions
- **Primary Language(s)**: TypeScript, Rust, JavaScript, PowerShell
- **License of the reference repo**: MIT
- **Frontend**: React — React 19 UI for the Chrome/Edge extension popup and task views in apps/extension; WXT — Web-extension framework that builds, zips and runs the Chromium extension in dev; Tailwind CSS — Styling for the extension and the shared packages/ui component library (Tailwind 4); TypeScript — Language for the extension, the VOM page model, i18n and the DeepSeek Harness plugin
- **Backend & APIs**: Rust — The bsk CLI and background daemon (crates/bsk-cli) that agents call from the shell; Tokio — Async runtime for the daemon's WebSocket link to the extension and its local HTTP server; JSON-RPC — Wire protocol between CLI and extension, typed in crates/bsk-protocol with generated JSON Schemas
- **Infrastructure & deploy**: pnpm — Workspace manager for apps/* and packages/* alongside the Cargo workspace; Vitest — Unit tests for the extension, VOM, i18n and the DSH plugin; GitHub Actions — CI plus separate release workflows for the CLI, the extension and the DSH plugin
- **Tooling, testing & ops**: DeepSeek Harness plugin — packages/dsh-plugin-browserskill exposes browser_* tools natively to DeepSeek Harness agents
---
## 3. KEY ARCHITECTURAL DECISIONS (audited from https://github.com/Tencent/BrowserSkill @ 147727a)
1. **A native Rust daemon plus a browser extension, not a headless browser**: crates/bsk-cli ships a single bsk binary that runs a background daemon; the WXT extension in apps/extension connects to it over WebSocket and acts inside the user's real, logged-in Chrome or Edge profile, so agents reuse existing sessions instead of launching Playwright or Puppeteer.
2. **Protocol types live in their own crate with generated JSON Schemas**: crates/bsk-protocol defines the JSON-RPC frames and tool payloads with serde and schemars; the root cli:build script runs its dump-schema binary first so the TypeScript side is built against the same schema.
3. **Agent-agnostic via a shell CLI plus installable skill bundles**: Any shell-capable agent drives the browser through bsk commands, and bsk install-skill writes the matching skill for each harness; scripts/check-skill-bundles.mjs and check-crate-skill.mjs keep the bundled skill text in sync with the crate.
4. **Tasks run in a separate visible Agent Window**: Per the README, tasks open in their own visible window and only borrow an existing tab when told to, so the user can keep working and step in for logins or verification. Recoverable session starts and browser profiles are covered in docs/.
5. **Polyglot monorepo with one version across Cargo and npm**: Cargo.toml pins workspace version 0.3.1, which the extension and DSH plugin package.json files also use. scripts/release.mjs and render-version-json.mjs drive the three release workflows (release-cli, release-extension, release-dsh-plugin).
---
## 4. NON-NEGOTIABLE ARCHITECTURAL GUARDRAILS
1. **Monorepo & Modular Separation**:
- Structure as a Turborepo monorepo with strict package boundaries:
- `apps/web`: Application UI, routing, layouts, and server endpoints.
- `packages/ui`: Shared design tokens, CSS variables, and Radix UI primitive components.
- `packages/db`: Database schemas, client singleton, declarative migrations, and seed scripts.
- `packages/config`: Shared TypeScript, ESLint, and build configurations.
2. **Strict Type Safety & Zero `any` Policy**:
- Enable `strict: true`, `noImplicitAny: true`, and `strictNullChecks: true`.
- Validate ALL external inputs, API request bodies, and query parameters with **Zod** schemas before execution.
3. **Frontend & Rendering Guidelines**:
- Utilize Vite 6 with TanStack Router for fully type-safe routing. Manage server state and caching via TanStack Query v5 with optimistic UI updates.
4. **Design System & Aesthetics**:
- Keep every color, radius, shadow and font in a single token file (CSS variables) and consume tokens everywhere; never hardcode hex values in components.
- Prefer crisp 1px borders and one subtle shadow scale over blurry default shadows. Pair one sans-serif for body/headings with one monospace for tags, badges, metrics, and code.
5. **Data Layer & Reliability**:
- Write declarative schema definitions with foreign keys, composite indexes on queried filters, and automated timestamp triggers.
- Use connection pooling and prepared statements for serverless database execution.
---
## 5. STEP-BY-STEP SCAFFOLDING ROADMAP
- **Phase 1: Workspace & Root Config**: Initialize package manager, monorepo configuration (`turbo.json`, `tsconfig.base.json`, `package.json`).
- **Phase 2: Database Schema & Client**: Set up the data layer: client, connection pool, models, and migration scripts.
- **Phase 3: Design Tokens & UI Primitives**: Build accessible `Button`, `Input`, `Card`, `Badge`, and layout wrappers inside `packages/ui`.
- **Phase 4: Core Application Routes & Handlers**: Implement primary authentication, user session handling, and application routes.
- **Phase 5: Quality Assurance & Build Verification**: Run `tsc --noEmit`, ESLint, Prettier, and smoke test suites to ensure zero compilation or runtime errors.
---
## 6. EXECUTION INSTRUCTIONS
1. Review all specifications, architectural guardrails, and stack choices above.
2. Present the full monorepo directory tree structure.
3. Systematically generate the complete, production-ready codebase according to the 5-phase roadmap above — starting with the root workspace setup, followed by the database schema, UI design system package, and full-stack application routes until the repository is fully scaffolded and ready to run.Frequently asked about BrowserSkill
What is BrowserSkill built with?
BrowserSkill combines a Rust CLI and daemon (bsk, built on Tokio) with a Chromium extension written in TypeScript and React 19 using the WXT framework and Tailwind CSS 4. The two sides talk JSON-RPC over WebSocket, with types defined in the bsk-protocol crate.
How is BrowserSkill different from Playwright or Puppeteer automation?
Instead of launching a separate headless browser, BrowserSkill drives the user's existing Chrome or Edge profile through an extension, so the agent can use sites the user is already signed into. Tasks run in a visible Agent Window.
Which AI agents can use BrowserSkill?
Any shell-capable agent that can run the bsk CLI, such as Cursor, Claude Code or Codex, after installing the matching skill with bsk install-skill. DeepSeek Harness has a dedicated plugin with native browser tools.
Does BrowserSkill need a server?
No hosted server is required. The bsk daemon runs locally next to the browser. For agents running on a remote server, a documented remote-extension connection pairs them with the browser on the user's computer.
One email a month: new deep dives and stack trends
New source-audited architectures, head-to-head comparisons and the monthly stack report. No spam, unsubscribe anytime.
Similar architectures
- SurrealDBClassicMulti-Model Real-Time Database · 20+ PeopleShares Rust · Tokio
- VectorClassicObservability Data Router & Telemetry Pipeline · 21-100 peopleShares Rust · Tokio
- DenoClassicSecure JavaScript & TypeScript Runtime · 20+ peopleShares Rust · TypeScript · Tokio
- Tailwind CSSClassicUtility-First CSS Engine & Framework · 1M+ MAUShares TypeScript · Rust · Tailwind CSS
- Actix WebClassicRust Web Framework · 1M+ MAUShares Rust · Tokio · GitHub Actions
- AxumClassicRust Web Framework · 1M+ MAUShares Rust · Tokio · GitHub Actions