# Technical Documentation: browseros-ai/BrowserOS

> ℹ️ **Provenance:** Multi-Tier Ingestion · [CodeWiki Reference](https://codewiki.google/github.com/browseros-ai/BrowserOS)

### Overview (README.md)

<div align="center">
<img width="693" height="415" alt="BrowserOS neo: the missing browser for your AI agents" src="https://github.com/user-attachments/assets/8129f9c8-e8f4-4afe-834a-91397121d833" />

<br></br>
<a href="https://discord.gg/YKwjt5vuKr"><img src="https://img.shields.io/badge/Discord-555?logo=discord" alt="Discord" /></a>
<a href="https://dub.sh/browserOS-slack"><img src="https://img.shields.io/badge/Slack-555?logo=slack" alt="Slack" /></a>
<a href="https://x.com/browserOS_ai"><img src="https://img.shields.io/badge/@browserOS__ai-555?logo=x" alt="X / Twitter" /></a>
<a href="https://github.com/browseros-ai/BrowserOS"><img src="https://img.shields.io/github/stars/browseros-ai/BrowserOS?style=flat&logo=github&label=stars&color=4c71f2" alt="GitHub stars" /></a>
<a href="LICENSE"><img src="https://img.shields.io/badge/license-AGPL--3.0-555" alt="AGPL-3.0" /></a>
<br></br>

<a href="https://www.producthunt.com/products/browseros_ai?embed=true&amp;utm_source=badge-featured&amp;utm_medium=badge&amp;utm_campaign=badge-browseros-neo" target="_blank" rel="noopener noreferrer"><picture><source media="(prefers-color-scheme: dark)" srcset="https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=1031913&amp;theme=dark&amp;t=1786088428884" /><img alt="BrowserOS neo - The Missing Browser for Claude, Cowork &amp; Codex | Product Hunt" width="250" height="54" src="https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=1031913&amp;theme=light&amp;t=1786088428884" /></picture></a>
<a href="https://trendshift.io/repositories/16468?utm_source=trendshift-badge&amp;utm_medium=badge&amp;utm_campaign=badge-trendshift-16468" target="_blank" rel="noopener noreferrer"><img src="https://trendshift.io/api/badge/trendshift/repositories/16468/daily?language=TypeScript" alt="browseros-ai%2FBrowserOS | Trendshift" width="250" height="55"/></a>
<br></br>

<a href="https://cdn.browseros.com/download/BrowserOS_neo.dmg"><img src="https://img.shields.io/badge/Download-macOS-black?style=for-the-badge&logo=apple&logoColor=white" alt="Download for macOS" /></a>
<a href="https://cdn.browseros.com/download/BrowserOS_neo_installer.exe"><img src="https://img.shields.io/badge/Download-Windows-0078D4?style=for-the-badge&logo=windows&logoColor=white" alt="Download for Windows" /></a>
<a href="https://cdn.browseros.com/download/BrowserOS_neo.AppImage"><img src="https://img.shields.io/badge/Download-Linux_AppImage-FCC624?style=for-the-badge&logo=linux&logoColor=black" alt="Download for Linux (x64 AppImage)" /></a>
<a href="https://cdn.browseros.com/download/BrowserOS_neo.deb"><img src="https://img.shields.io/badge/Download-Linux_DEB-D70A53?style=for-the-badge&logo=debian&logoColor=white" alt="Download for Linux (amd64 DEB)" /></a>

**[Website](https://www.browseros.com)** · **[Docs](https://docs.browseros.com)** · **[Enterprise](mailto:founders@browseros.com?subject=Enterprise%3A%20BrowserOS%20neo&body=Hi%2C%0A%0AWe%27re%20looking%20at%20BrowserOS%20neo%20for%20our%20team.%0A%0ACompany%3A%0ATeam%20size%3A%0AWhat%20we%20want%20to%20automate%3A)**

Free · Open source · Everything runs on your machine

</div>

A second browser, just for your AI agents. Import your logins from Chrome in one click, connect Claude Code, Codex, or any MCP agent, and hand off your web tasks. Agents run in parallel in their own tabs. You watch live, or replay any session like a video.

BrowserOS neo is not a Chrome replacement. It is a secondary browser that sits next to Chrome, made friendly to agents.

## Get started

### 1. Install BrowserOS neo

```sh
brew tap browseros-ai/tap
brew install --cask browseros-neo
```

Prefer a direct download? Grab it for [macOS](https://cdn.browseros.com/download/BrowserOS_neo.dmg), [Windows](https://cdn.browseros.com/download/BrowserOS_neo_installer.exe), or Linux x64 ([AppImage](https://cdn.browseros.com/download/BrowserOS_neo.AppImage) · [DEB](https://cdn.browseros.com/download/BrowserOS_neo.deb)).

### 2. Import from Chrome

One click brings over your logins, bookmarks and extensions. Your agents work with your real accounts from the first task.

### 3. Connect your agent

BrowserOS neo finds Claude Code, Codex, Cursor, VS Code, OpenClaw and Hermes on your machine. Connect any of them with one click.

### 4. Give it a task

From your agent, not from the browser:

> Book me the cheapest flight to London.

Watch it happen live in your new tab, or replay it later.

## What can your agents do?

Anything that needs a logged-in browser:

- Post content to your social media (LinkedIn, Twitter/X), queue posts, pull engagement numbers
- Clear your inbox, unsubscribe from junk email
- Update your CRM, file expenses, pull reports from internal tools

## Key features

<table>
<tr>
<td width="40%" valign="middle">
<h4>Live dashboard</h4>
Your new tab shows every agent working right now: which site it's on, what it's doing, how far along. <a href="https://docs.browseros.com/neo/cockpit">Docs</a>
</td>
<td width="60%">
<img src="docs/images/browserclaw--dashboard-populated.png" alt="BrowserOS neo dashboard showing agent sessions and recent activity" width="100%" />
</td>
</tr>
<tr>
<td width="40%" valign="middle">
<h4>One-click connect</h4>
Automatically connects to every harness. We built tools optimized for web use! <a href="https://docs.browseros.com/neo/mcp">Docs</a>
</td>
<td width="60%">
<img src="docs/images/browserclaw--mcp-install-board.png" alt="BrowserOS neo MCP connect board with one-click install for supported AI tools" width="100%" />
</td>
</tr>
<tr>
<td width="40%" valign="middle">
<h4>Replay every session</h4>
Every session is saved as a scrubbable video on your disk with a step-by-step action timeline. Rewind and see exactly what happened. <a href="https://docs.browseros.com/neo/audit-and-replay">Docs</a>
</td>
<td width="60%">
<img src="docs/images/browserclaw--replay-scrubber.png" alt="BrowserOS neo replay view with video scrubber and action timeline" width="100%" />
</td>
</tr>
</table>

- **Your logins.** Agents automate your real work using your logged-in accounts, not a blank sandbox. [How it works](https://docs.browseros.com/neo/how-it-works)
- **Parallel agents.** Fire off several tasks at once. Each agent works in its own tab while you keep browsing.
- **Fewer tokens.** For the same task, BrowserOS neo uses fewer tokens than the alternatives, such as Claude's Chrome extension or the Codex browser.
- **Local-only, privacy-first.** Sessions, screenshots, and history live under `~/.browserclaw/` and never leave your machine. [Privacy](https://docs.browseros.com/neo/privacy)

## Why BrowserOS neo over the alternatives?

- **Not a headless driver.** Playwright and agent-browser spin up a fresh Chrome subprocess with no logins. Great for CI, useless for real work which requires your logged-in state like "read my inbox." BrowserOS neo imports your logins with one click and persists them across sessions.
- **Not a cloud browser.** Cloud browsers (like browser-use, browserbase) run in a datacenter, so logging into your accounts is a pain, and sites like Twitter and LinkedIn block you because you are on a datacenter IP. BrowserOS neo runs on your machine, on `127.0.0.1`.
- **Not a locked-in AI browser.** Atlas, Comet, and Dia only work with their own AI. BrowserOS neo works with the agents you already use and pay for: Claude Code, Cowork, Codex, Cursor, and others.

## Also in this repo: BrowserOS

<table>
<tr>
<td width="110" align="center" valign="middle">
<img src="packages/browseros/resources/browseros/icons/product_logo_192.png" alt="" width="72" />
</td>
<td valign="middle">
<h3>BrowserOS, the AI browser for humans</h3>
A Chromium fork with an AI agent built into every new tab, for when <b>you</b> are the one browsing. Bring your own AI keys or run everything locally with Ollama.
<br><br>
<b><a href="README.BrowserOS.md">Read about BrowserOS</a></b> &nbsp;·&nbsp; <a href="https://www.browseros.com/browseros/">Website</a> &nbsp;·&nbsp; <a href="https://docs.browseros.com/browseros">Docs</a>
</td>
</tr>
</table>

## FAQ

**What's the difference between BrowserOS neo and BrowserOS?**
BrowserOS neo is a browser your AI drives. BrowserOS is a browser you drive, with an AI agent built in. Both ship from this repo and run side by side. Keep your daily browser, and let agents work in neo.

**Which AI tools work with BrowserOS neo?**
Any AI that speaks MCP. Claude Code, Codex, Cursor, VS Code, Zed, OpenCode, Hermes, OpenClaw and Antigravity connect with one click.

**Does anything leave my machine?**
Your sessions, screenshots, history, and settings live under `~/.browserclaw/` and never upload. BrowserOS neo sends anonymous product-usage events (agent connect/disconnect, version, OS) to help us improve the app; it never sends URLs, page content, prompts, tool results, or screenshots. Off with one toggle in Settings. [Full policy](https://docs.browseros.com/neo/privacy).

**Do my Chrome extensions and bookmarks work?**
Yes. Both browsers are Chromium forks, so Chrome extensions work and your bookmarks, passwords, and settings import in one click.

**What platforms are supported?**
BrowserOS neo and BrowserOS run on macOS, Windows, and Linux. Neo's Linux builds are x64. System requirements match Google Chrome.

## Get help

- [Discord](https://discord.gg/YKwjt5vuKr) · [Slack](https://dub.sh/browserOS-slack)
- [Report a bug](https://github.com/browseros-ai/BrowserOS/issues)
- [BrowserOS neo docs](https://docs.browseros.com) · [BrowserOS docs](https://docs.browseros.com/browseros)
- Enterprise deployment: [founders@browseros.com](mailto:founders@browseros.com?subject=Enterprise%3A%20BrowserOS%20neo&body=Hi%2C%0A%0AWe%27re%20looking%20at%20BrowserOS%20neo%20for%20our%20team.%0A%0ACompany%3A%0ATeam%20size%3A%0AWhat%20we%20want%20to%20automate%3A)

## For developers

Both browsers ship from this monorepo. Two main subsystems: the **browser** (Chromium fork, C++ and Python) and the **agent platform** (TypeScript and Rust).

### Architecture

```
/* Detailed source-code truncated for AI context efficiency. */
```

| Package | What it does |
|---------|-------------|
| [`packages/browseros`](packages/browseros/) | Chromium fork: patches, build system, signing |
| [`apps/claw-server`](packages/browseros-agent/apps/claw-server/) | BrowserOS neo backend: MCP endpoint agents connect to, plus the API behind the dashboard |
| [`apps/claw-app`](packages/browseros-agent/apps/claw-app/) | BrowserOS neo new-tab dashboard: watch, replay, and manage agent sessions |
| [`apps/claw-onboard`](packages/browseros-agent/apps/claw-onboard/) | BrowserOS neo first-run onboarding |
| [`apps/server`](packages/browseros-agent/apps/server/) | Bun server exposing the browser MCP tools and running the BrowserOS AI agent loop |
| [`apps/app`](packages/browseros-agent/apps/app/) | BrowserOS extension: new tab, side panel chat, onboarding, settings |
| [`apps/app-onboard`](packages/browseros-agent/apps/app-onboard/) | BrowserOS first-run onboarding |

### Contributing

We'd love your help making BrowserOS neo and BrowserOS better. Start with the [Contributing Guide](CONTRIBUTING.md), which routes you to the right path.

- **BrowserOS neo** (TypeScript, React, Rust): [setup guide](packages/browseros-agent/CONTRIBUTING.md). Around 15 minutes.
- **BrowserOS** (TypeScript, React, Bun): [setup guide](packages/browseros-agent/CONTRIBUTING.BrowserOS.md). Around 15 minutes.
- **Browser** (C++, Python): requires ~100GB of disk. See the [root guide](CONTRIBUTING.md#browser-development).

## Credits

- [ungoogled-chromium](https://github.com/ungoogled-software/ungoogled-chromium): we use some of its patches for enhanced privacy. Thanks to everyone behind this project.
- [The Chromium Project](https://www.chromium.org/): at the core of both browsers, making it possible for them to exist in the first place.

## Citation

If you use BrowserOS or BrowserOS neo in your research or project, please cite:

```bibtex
@software{browseros2025,
  author = {Nithin Sonti and Nikhil Sonti and {BrowserOS-team}},
  title = {BrowserOS: The open-source Agentic browser},
  url = {https://github.com/browseros-ai/BrowserOS},
  year = {2025},
  publisher = {GitHub},
  license = {AGPL-3.0},
}
```

## License

BrowserOS neo and BrowserOS are open source under the [AGPL-3.0 license](LICENSE).

Copyright &copy; 2026 Felafax, Inc.

Watch the repo if you want to hear when agents can do something new.

## Stargazers

Thank you to all our supporters.

<table>
<tr>
<td align="center">Nikhil</td>
<td align="center">Nithin</td>
<td align="center">Dani</td>
</tr>
<tr>
<td align="center"><a href="https://x.com/intent/user?screen_name=nv_sonti"><img src="https://img.shields.io/twitter/follow/nv_sonti?style=social" alt="Follow Nikhil on X" /></a></td>
<td align="center"><a href="https://x.com/intent/user?screen_name=ThatNithin"><img src="https://img.shields.io/twitter/follow/ThatNithin?style=social" alt="Follow Nithin on X" /></a></td>
<td align="center"><a href="https://x.com/intent/user?screen_name=dani_akash_"><img src="https://img.shields.io/twitter/follow/dani_akash_?style=social" alt="Follow Dani on X" /></a></td>
</tr>
</table>

<p align="center">
Built with ❤️ from San Francisco
</p>

---

### Index (`docs/index.mdx`)

---
title: "BrowserOS neo"
description: "The browser your AI can actually use. It's your browser, your logins, your control."
keywords: ["BrowserOS neo", "browser for AI agents", "AI browser", "Claude Code browser", "MCP browser"]
---

<video
  controls
  className="w-full aspect-video rounded-xl"
  src="https://github.com/browseros-ai/BrowserOS/releases/download/onboarding-video/v0.1.0/first-run-demo.mp4"
  poster="https://github.com/browseros-ai/BrowserOS/releases/download/onboarding-video/v0.1.0/first-run-demo-poster.png"
></video>

BrowserOS neo is a browser your AI can actually use. You install it and use it like any browser. Once you're signed in to the sites you use every day, your AI can use those same logins to get real work done. You watch every step on your new tab page, and replay anything it did like a video.

## The problem

Your AI is smart. But it can't press the buttons.

Ask it to book a flight, download an invoice, or send a message from your inbox. It stops at the login screen. Today's tools open a blank browser where nothing is signed in, or a browser running on some remote cloud. Neither one can do your real work.

## The idea

BrowserOS neo is a real browser you install and use. Because it's your browser, your logins are already there. Your email, your calendar, your bank, your work tools: all signed in.

When your AI drives BrowserOS neo, it can actually do things. Book a meeting on your calendar. Reply to an email from your inbox. Get the numbers from a Notion doc. File an expense. The 15-minute chores you keep meaning to get to just get done.

## Three things you get

<CardGroup cols={3}>
  <Card title="Your logins" icon="key">
    Your Gmail, your calendar, your bank, your work tools. Already signed in. Your AI uses the logins you already have.
  </Card>
  <Card title="A dashboard that watches" icon="binoculars">
    A dashboard on your new tab shows every AI working right now. Which site it's on, what it's doing, how far along.
  </Card>
  <Card title="Replay every session" icon="rotate-ccw">
    Every session becomes a video you can replay. If your AI got something wrong, hit rewind and see where. If it went right, you know the recipe.
  </Card>
</CardGroup>

## See it in action

Three steps from asking your AI to replaying what it did.

<Steps>
  <Step title="Connect BrowserOS neo to your AI">
    One click connects BrowserOS neo to Claude Code, Cursor, Codex, and other AI tools. Nothing to set up.
  </Step>
  <Step title="Give it a real task">
    In your AI chat, ask it to do something you actually need done. Something like: `Book me the cheapest morning flight from SFO to NYC next Friday.`
  </Step>
  <Step title="Watch it work, replay it later">
    Open a new tab. Your AI's session shows up on your dashboard, live, with a preview of what it's doing. When it's done, you can replay the whole run like a video.
  </Step>
</Steps>

## Your stuff stays yours

Everything that happens in BrowserOS neo stays on your computer. Your sessions, your screenshots, your history: none of it goes anywhere. We don't have servers to store it, and no dashboard to peek at what you're doing.

<Card title="Privacy and data" icon="lock" href="/neo/privacy">
  The full breakdown of what stays on your machine.
</Card>

## Get started

<CardGroup cols={3}>
  <Card title="Download BrowserOS neo" icon="download" href="https://browseros.com/agents">
    macOS, Windows, and Linux. Free and open source.
  </Card>
  <Card title="Connect your AI" icon="plug" href="/neo/mcp">
    One-click setup for Claude Code, Cursor, Codex, VS Code, Zed, and more.
  </Card>
  <Card title="Your first run" icon="play" href="/neo/how-it-works">
    A guided walkthrough from install to your first task.
  </Card>
</CardGroup>

---

### Browseros Index (`docs/browseros/index.mdx`)

---
title: "BrowserOS"
description: "The open-source AI browser that turns your words into actions"
---

<Frame>
  <img src="/images/hero-dark.png" alt="BrowserOS in action" />
</Frame>

BrowserOS is an AI-native browser that lets you automate any web task by describing it in plain English. Built on Chromium, it runs AI agents locally on your machine—keeping your data private while giving you superpowers for browsing.

**Open source. Privacy-first. The browser for the AI era.**

## Three Ways to Use AI

<Columns cols={3}>
  <Card title="Chat Mode" icon="message">
    Ask questions about the page you're viewing. Summarize articles, extract data, translate content—without leaving the page.
  </Card>
  <Card title="Agent Mode" icon="robot">
    Describe a task and watch AI execute it: clicking, typing, navigating. Automate form filling, data extraction, and multi-step workflows.
  </Card>
  <Card title="Graph Mode" icon="sitemap">
    Build reliable, repeatable workflows as visual graphs. Edit steps, save, and run anytime. *Coming soon.*
  </Card>
</Columns>

## Quick Start

<Steps>
  <Step title="Install BrowserOS">
    On macOS, install with Homebrew. BrowserOS is in Homebrew's own cask repository, so there is no tap to add:

    ```sh
    brew install --cask browseros
    ```

    Requires macOS 13 (Ventura) or later. Upgrade with `brew upgrade --cask browseros`, though the browser also updates itself.

    On Windows and Linux, or on macOS without Homebrew, get the latest release from [browseros.com](https://browseros.com).
  </Step>
  <Step title="Import from Chrome">
    Navigate to `chrome://settings/importData` and import your bookmarks, passwords, and settings in one click.
  </Step>
  <Step title="Configure your AI">
    BrowserOS includes a default AI model with limited daily usage for testing. For the full experience, bring your own API keys.

    <Card title="Set up your LLM provider" icon="key" href="/browseros/features/bring-your-own-llm">
      Configure Gemini, Claude, OpenAI, or run models locally with Ollama
    </Card>
  </Step>
  <Step title="Try it out">
    Open any webpage and press the **Assistant** button in the toolbar. Ask a question about the page, or describe a task to automate.
  </Step>
</Steps>

## Which AI Model Should I Use?

<Tabs>
  <Tab title="For Chat Mode">
    **Any model works great**, including local LLMs.

    - **Ollama** or **LM Studio** — Free, runs locally, great for quick questions
    - **Gemini Flash** — Fast and affordable
    - **Claude or GPT-4** — Best quality responses

    Chat Mode just needs to understand the page and answer questions—local models handle this well.
  </Tab>
  <Tab title="For Agent Mode">
    **Use Claude Opus 4.5 for best results.**

    | Model | Speed | Quality |
    |-------|-------|---------|
    | Claude Opus 4.5 | Slower | Best |
    | Claude Sonnet 4.5 | Medium | Great |
    | Claude Haiku 4.5 | Fast | Good |
    | Gemini Flash | Fast | Good |

    <Warning>
    Local LLMs are not yet powerful enough for Agent Mode. The model needs strong reasoning to click the right elements and handle multi-step tasks.
    </Warning>
  </Tab>
</Tabs>

## Why BrowserOS?

<Columns cols={2}>
  <Card title="Privacy-First" icon="shield-check">
    Run AI locally with Ollama, or bring your own API keys. Your browsing data never leaves your machine unless you choose.
  </Card>
  <Card title="Open Source" icon="code-branch">
    100% open source under AGPL-3.0. Inspect the code, contribute features, or fork it for your needs.
  </Card>
  <Card title="Works with Your Tools" icon="plug">
    Built-in MCP servers for Gmail, Calendar, Docs, Sheets, Notion. Connect to Claude Code or Gemini CLI for developer workflows.
  </Card>
  <Card title="Chrome Compatible" icon="chrome">
    All your Chrome extensions work. Import bookmarks, passwords, and settings in one click.
  </Card>
</Columns>

## Community

<Columns cols={3}>
  <Card title="Discord" icon="discord" href="https://discord.gg/YKwjt5vuKr">
    Get help and share feedback
  </Card>
  <Card title="GitHub" icon="github" href="https://github.com/BrowserOS-ai/BrowserOS">
    Star us and contribute
  </Card>
  <Card title="Twitter" icon="x-twitter" href="https://x.com/browserOS_ai">
    Follow for updates
  </Card>
</Columns>

---

### Browseros Update Index (`docs/browseros/update/index.mdx`)

---
title: "Update BrowserOS"
description: "How to update to the latest version of BrowserOS"
---

Select your platform for step-by-step update instructions:

<CardGroup cols={3}>
  <Card title="macOS" icon="apple" href="/browseros/update/macos">
    Auto-updates with manual option
  </Card>
  <Card title="Windows" icon="windows" href="/browseros/update/windows">
    Download and install the latest version
  </Card>
  <Card title="Linux" icon="linux" href="/browseros/update/linux">
    Download and replace the binary
  </Card>
</CardGroup>

---

### Neo Mcp Index (`docs/neo/mcp/index.mdx`)

---
title: "Connect your agent"
description: "One-click setup for the AI tools we support. A Claude Desktop extension. A copyable endpoint URL for everything else."
keywords: ["connect agent to BrowserOS neo", "BrowserOS neo MCP", "browser MCP server", "Streamable HTTP MCP", "Claude Desktop MCP"]
---

BrowserOS neo is one MCP server, at one URL, on your own machine. Any AI tool that supports MCP can use it. This page covers the one-click board for the tools we support today. For anything else, [set it up manually](/neo/mcp/manual) with the endpoint URL below.

## The endpoint URL

Open a new tab in BrowserOS neo and click **MCP** in the sidebar. The top of the page shows the endpoint URL:

```text
http://127.0.0.1:9200/mcp
```

That address is local to your computer. Nothing crosses the network. Click **Copy** at the top of the page to grab it.

## One-click setup

Under the endpoint URL you'll see the list of AI tools we support out of the box. Find yours, click **Connect**, and restart the AI tool.

<Frame caption="One endpoint, one click per supported AI tool.">
  <img src="/images/browserclaw--mcp-install-board.png" alt="BrowserOS neo connect page showing an endpoint URL at the top and the supported AI tools listed underneath, each with a Connect button on the right." />
</Frame>

Today the supported AI tools are **Claude Code**, **Codex**, **Cursor**, **OpenCode**, **Antigravity**, **VS Code**, and **Zed**. Behind the scenes, BrowserOS neo writes a single entry named `browseros-neo` into the AI tool's own MCP config file, pointing at the endpoint URL above. Existing managed `BrowserOS neo` and `BrowserClaw` entries are recognized and migrated automatically.

<Tip>
The board updates as soon as your AI tool actually loads the config. If you don't see the row flip to **Connected**, restart the AI tool once and come back.
</Tip>

## Don't see your AI tool?

If your AI tool supports MCP but isn't on the one-click board, we'd love to add it. Head to [BrowserOS Discussions](https://github.com/orgs/browseros-ai/discussions) and open a new discussion. A short template that helps us move fast:

```text
Title: Add one-click support for <AI tool name>

- Name and link to the AI tool
- Which config file it uses for MCP servers (path + format)
- A link to that AI tool's MCP setup docs
- Whether you're already using BrowserOS neo with it via the manual setup
```

While you're waiting for one-click support, two other paths work with almost every AI tool.

<CardGroup cols={2}>
  <Card title="Claude Desktop and Cowork" icon="messages" href="/neo/mcp/claude-desktop">
    Install the BrowserOS neo extension into Claude Desktop with a single file.
  </Card>
  <Card title="Manual URL setup" icon="wrench" href="/neo/mcp/manual">
    Guided setup for Hermes Agent, Vercel AI SDK, OpenClaw, and other MCP-compatible AI tools.
  </Card>
</CardGroup>

## Where to next

<CardGroup cols={2}>
  <Card title="How BrowserOS neo works" icon="play" href="/neo/how-it-works">
    A guided walkthrough from install to your first AI-driven session.
  </Card>
  <Card title="Your dashboard" icon="binoculars" href="/neo/cockpit">
    Every part of the new-tab dashboard and what it tells you.
  </Card>
</CardGroup>

---

### Changelog (`docs/changelog.mdx`)

---
title: "Changelog"
description: "What's new in BrowserOS"
---

import Shared from '/snippets/changelog.mdx'

<Shared />

---

### Contributing (`docs/contributing.mdx`)

---
title: "Contributing to BrowserOS"
description: "Guide to contributing to BrowserOS"
---

import Shared from '/snippets/contributing.mdx'

<Shared />

---

### Robots (`docs/robots.txt`)

User-agent: *
Content-Signal: ai-train=yes, search=yes, ai-input=yes
Disallow: /cdn-cgi/
Allow: /_next/image
Disallow: /_next/
Disallow: /mintlify-assets/_next/static/
Sitemap: https://docs.browseros.com/sitemap.xml

---

### Browseros Changelog (`docs/browseros/changelog.mdx`)

---
title: "Changelog"
description: "What's new in BrowserOS"
---

import Shared from '/snippets/changelog.mdx'

<Shared />

---

### Browseros Contributing (`docs/browseros/contributing.mdx`)

---
title: "Contributing to BrowserOS"
description: "Guide to contributing to BrowserOS"
---

import Shared from '/snippets/contributing.mdx'

<Shared />

---

### Browseros Onboarding (`docs/browseros/onboarding.mdx`)

---
title: "Getting Started"
description: "Set up BrowserOS in 2 minutes"
---

Welcome to BrowserOS! Let's get you set up.

<Steps>
  <Step title="Import from Chrome">
    Bring your bookmarks, history, and passwords from Chrome.

    1. Go to `chrome://settings/importData`
    2. Select **Google Chrome** and click **Import**
    3. Choose **Always allow** when prompted

    <Tip>
    This imports everything in one click — bookmarks, passwords, history, and extensions.
    </Tip>
  </Step>

  <Step title="Set up your AI">
    BrowserOS includes a default AI model with limited daily usage. For the best experience, add your own.

    **Quick option:** Get a free Gemini API key from [aistudio.google.com](https://aistudio.google.com) — 20 requests per minute at no cost.

    <Card title="Configure your LLM" icon="key" href="/browseros/features/bring-your-own-llm">
      Set up Gemini, Claude, OpenAI, or run models locally with Ollama
    </Card>
  </Step>

  <Step title="Try it out">
    Open any webpage and click the **Assistant** button in the toolbar.

    - **Chat Mode:** Ask questions about the page
    - **Agent Mode:** Describe a task and watch it execute

    <Note>
    For Agent Mode, use Claude Opus 4.5 or Sonnet 4.5. Local models work great for Chat but aren't powerful enough for agents yet.
    </Note>
  </Step>
</Steps>

## You're all set!

<Tip>
**Block ads with uBlock Origin** — Chrome dropped support for the full uBlock Origin extension, but BrowserOS brought it back. [Install it from the Chrome Web Store](https://chromewebstore.google.com/detail/ublock-origin/cjpalhdlnbpafiamejdnhcphjbkeiagm) and browse ad-free. [Learn more →](/browseros/features/ad-blocking)
</Tip>

Explore what BrowserOS can do:

<Columns cols={2}>
  <Card title="Cowork" icon="user-group" href="/browseros/features/cowork">
    Hand off a multi-step task and combine browser automation with local files
  </Card>
  <Card title="Use with Claude Code" icon="terminal" href="/browseros/features/use-with-claude-code">
    Control BrowserOS from Claude Code or Gemini CLI
  </Card>
</Columns>

---

### Neo Audit And Replay (`docs/neo/audit-and-replay.mdx`)

---
title: "Audit and replay"
description: "Every agent step is on your disk. Search, click through, and replay any session like a video. Nothing leaves your machine."
keywords: ["BrowserOS neo audit", "AI agent replay", "browser session recording", "local audit trail"]
---

BrowserOS neo records everything your AI does in the browser so you can go back and see exactly what happened. All of it lives on your computer. Nothing goes to any server we control.

## The audit trail

Every session your AI runs shows up on the audit page. Search across all of them, filter by agent, status, or site, and click any row to open its full story.

<Frame caption="Every agent session, searchable and filterable.">
  <img src="/images/browserclaw--audit-list.png" alt="BrowserOS neo audit page showing a searchable list of agent sessions grouped by day. Columns visible: agent, title, tools used, action count, duration, and when it happened. Filter dropdowns at the top: Agent, Status, Site." />
</Frame>

Sessions land in one of three states:

- **Live**: the AI is still working.
- **Done**: it finished cleanly.
- **Failed**: something errored during the run.

## What each session shows you

Click any session and you get its full story: agent, timestamps, and every step the AI took, in order.

<Frame caption="A single session, with every action laid out.">
  <img src="/images/browserclaw--task-detail.png" alt="BrowserOS neo task detail page showing a header with the agent name, status, and started time, followed by a tab strip listing every page the agent used. Below, a timeline of tool calls with arguments, results, and screenshots for each step." />
</Frame>

If the session used more than one tab, a tab strip lets you jump between them. Each tab has its own timeline of actions. Most steps include a screenshot of what the AI was looking at when it ran. Click one to open it full-size.

Sessions also carry a **View Session Replay** button that unlocks as soon as replay data lands.

## Replay like a video

Click **View Session Replay** to watch the whole session play back. The replay is the actual page the AI saw, not just a screenshot: DOM changes, scrolls, clicks, everything as it happened.

<Frame caption="Scrub through the recording. Jump to any moment.">
  <img src="/images/browserclaw--replay-scrubber.png" alt="BrowserOS neo replay screen showing a full-fidelity playback of a page the AI browsed. A play, pause, and seek scrubber sits at the bottom. On the right, an action timeline lists every step the AI took, synced to the current moment in the video." />
</Frame>

Use the scrubber to jump to any moment. Click any step on the right timeline to skip the replay straight to that action. If the session touched multiple tabs, switch between them at the top; each tab is its own recording with its own time origin.

## Where all of this lives

Everything you see on these pages sits in one folder on your computer: **`~/.browserclaw/`** in your home directory.

- `~/.browserclaw/browserclaw.sqlite` is the shared database for audit history, tasks, sessions, recording indexes, tab claims, and tab ownership.
- `~/.browserclaw/screenshots/` is a JPEG per screenshotted step.
- `~/.browserclaw/replays/` is the recording data per session.

<Note>
That folder is spelled `.browserclaw`, not `.neo`. It keeps the product's old name so the rename doesn't orphan the history you already have. Type it exactly as written above.
</Note>

The BrowserOS neo server that reads and writes these files only accepts requests from your own machine. It binds `127.0.0.1`, the local loopback, so nothing on your network can reach it. No account. No telemetry. No cloud sync.

If you want to delete a session or wipe everything, delete the files. That's it.

## What isn't recorded

- **Your personal tabs.** The recorder is only loaded into tabs your AI opened. Tabs you opened for your own work never get it. This isn't a policy on top of a general recorder; the recorder script is never even loaded there.
- **Passwords.** Any input marked as a password field is masked before it hits the recording.
- **Canvas and mouse jitter.** Canvas contents are not recorded. Cursor movements are not recorded either.

If you want the full picture, keep reading:

<CardGroup cols={2}>
  <Card title="Your stuff stays yours" icon="lock" href="/neo/privacy">
    The full breakdown of what stays on your machine.
  </Card>
  <Card title="How BrowserOS neo works" icon="play" href="/neo/how-it-works">
    A guided walkthrough from install to your first AI-driven session.
  </Card>
</CardGroup>

---

### Neo Cockpit (`docs/neo/cockpit.mdx`)

---
title: "Your dashboard"
description: "The new-tab dashboard that shows what your AI is doing now and what it did before."
keywords: ["BrowserOS neo dashboard", "AI agent activity", "watch AI agent live", "session history"]
---

Open a new tab in BrowserOS neo and you land on your dashboard. It shows what your AI is working on right now and what it did before, so you always know what happened without pinging your AI to check.

## What you see

<Frame caption="The dashboard: live activity on top, recent sessions below.">
  <img src="/images/browserclaw--dashboard-populated.png" alt="BrowserOS neo new-tab dashboard with a large italic headline that reads 'What are your agents working on right now?' Below it, a Recent activity section shows a large lead tile with a screenshot of a browsed page and four supporting tiles next to it, plus a typographic list of older sessions." />
</Frame>

Two regions stack on the page:

- **Running now** shows a live card for every AI that is actively working. It only appears when at least one AI is running.
- **Recent activity** shows the sessions your AIs already finished, newest first. Click any of them to open the full story.

## Running now

Every live agent gets its own card at the top of the dashboard.

Each card carries:

- A live preview of the browser tab your AI is looking at right now, updating as it works.
- A **LIVE** chip and a pulsing dot so you can tell at a glance which agents are actually doing something.
- The site title, the AI's name, and a short trail of the last few actions it took (like `tabs → read → navigate`).
- A tab-count chip in the corner so you know how many tabs this AI has open.
- Two buttons at the bottom of the card:
  - **Watch** switches your active tab to the one the AI is working in, so you can look over its shoulder.
  - **Stop** ends the session. If your AI went off the rails, one click cancels the run.

## Recent activity

Once a session finishes, it moves down into Recent activity. The most recent (or any still-live) session takes the big lead tile on the left. Four supporting tiles show what's after that. Anything older stacks in a compact typographic list below.

Each tile is clickable and takes you straight to the full session view, where you can read every action step by step or hit **View Session Replay** to watch the whole run like a video.

The home page holds the twelve most recent sessions. To see everything, click **View all activity** at the bottom of the section and you'll land on the full audit list.

## Where to next

<CardGroup cols={2}>
  <Card title="How BrowserOS neo works" icon="play" href="/neo/how-it-works">
    A guided walkthrough from install to your first AI-driven session.
  </Card>
  <Card title="Your stuff stays yours" icon="lock" href="/neo/privacy">
    What BrowserOS neo records, what it doesn't, and where everything lives.
  </Card>
</CardGroup>

---

### Neo How It Works (`docs/neo/how-it-works.mdx`)

---
title: "How BrowserOS neo works"
description: "A step-by-step walkthrough from download to your first AI-driven browsing session."
keywords: ["BrowserOS neo setup", "connect AI to browser", "how BrowserOS neo works", "AI browser walkthrough"]
---

This page walks you from a fresh download to your first AI-driven session. Six steps. About five minutes.

<Steps>
  <Step title="Install BrowserOS neo">
    Head over to [browseros.com/agents](https://browseros.com/agents) and download BrowserOS neo for your operating system. Install it the way you'd install any other browser.

    Once it's open, it works like Chrome or any other browser you've used. Bookmarks, extensions, keyboard shortcuts, all in the same places.
  </Step>
  <Step title="Sign in like you normally would">
    Use BrowserOS neo as your browser for a bit. Sign in to Gmail. Sign in to your calendar. Sign in to Notion, Linear, your CRM, your accounting tool, whatever you use for actual work.

    There is nothing special about this step. You are just using a browser. But it matters, because every account you sign in to here becomes something your AI can use later.

    <Note>
    Your AI cannot see your personal tabs unless you ask it to. It works in its own tabs, side by side with yours. Signing in to Gmail here means your AI can use Gmail when you ask it to. It does not mean your AI is reading your inbox while you're not looking.
    </Note>
  </Step>
  <Step title="Connect BrowserOS neo to your AI">
    Open a new tab in BrowserOS neo and click **MCP** in the sidebar. You'll see a list of AI tools you can connect with one click.

    <Frame caption="The connect page: one endpoint, one click per AI tool.">
      <img src="/images/browserclaw--mcp-install-board.png" alt="BrowserOS neo connect page showing an endpoint URL at the top and six AI tools listed underneath: Claude Code, Codex, Cursor, Antigravity, VS Code, and Zed. Each has a Connect button on the right." />
    </Frame>

    Find the AI tool you use: Claude Code, Cursor, Codex, Antigravity, VS Code, Zed, or another. Click **Connect** on its row. BrowserOS neo sets everything up for you.

    Restart your AI tool once, and it now has a browser.

    <Tip>
    Using an AI tool that isn't listed? Copy the endpoint URL at the top of the page and paste it into your AI's own settings. See the [Connect page](/neo/mcp) for the manual setup.
    </Tip>
  </Step>
  <Step title="Give your AI a task">
    Open your AI tool and give it a real task. Something you'd actually want done. To start, try this:

    ```text
    Find a good time next week for a 30-minute team meeting and send the invite.
    ```

    Or something closer to your own work:

    ```text
    Summarize my important unread emails from the last two days.
    ```

    ```text
    Pull the numbers from the Q3 dashboard in Notion and put them in a summary at the top.
    ```

    Whichever you pick, hit send.
  </Step>
  <Step title="Watch it work">
    Open a new tab in BrowserOS neo. Your AI's session shows up on the dashboard.

    <Frame caption="Every running AI and every finished session, at a glance.">
      <img src="/images/browserclaw--dashboard-populated.png" alt="BrowserOS neo new-tab dashboard with a large italic headline reading 'What are your agents working on right now?' A row of Running now cards shows a live agent session with a live browser preview. Below it, a grid of Recent activity tiles shows five completed sessions with the sites they visited." />
    </Frame>

    Two things to look at:

    - **Running now**: the AI working on your task right now. You'll see the site it's on, how long it's been at it, and a live preview of what it's looking at.
    - **Recent activity**: sessions that already finished. Click any tile to open the full story of what happened.

    You don't have to sit and stare. Come back whenever you want; the dashboard shows you what's been going on.
  </Step>
  <Step title="Replay what your AI did">
    When a session finishes, click its tile. Then click **View Session Replay**.

    <Frame caption="Replay any session like a video. Scrub through, see exactly what your AI saw at every moment.">
      <img src="/images/browserclaw--replay-scrubber.png" alt="BrowserOS neo replay screen showing a full-fidelity playback of a page the AI browsed. A play/pause scrubber sits at the bottom. On the right, an action timeline lists every step the AI took, synced to the current moment in the video." />
    </Frame>

    The replay plays back like a video. Hit rewind to see the exact moment things went off, or the exact moment something went well. On the right, every step your AI took is listed in order, and you can click any one to jump the replay to that moment.

    Now you know what worked. Tell your AI, and it'll do the next task better.
  </Step>
</Steps>

## Where to next

<CardGroup cols={2}>
  <Card title="Your dashboard" icon="binoculars" href="/neo/cockpit">
    Every part of the new-tab dashboard and what it tells you.
  </Card>
  <Card title="Your stuff stays yours" icon="lock" href="/neo/privacy">
    What BrowserOS neo records, what it doesn't, and where everything lives.
  </Card>
</CardGroup>

---

### Neo Install (`docs/neo/install.mdx`)

---
title: "Install BrowserOS neo"
description: "Download and install BrowserOS neo on macOS or Windows."
keywords: ["install BrowserOS neo", "download BrowserOS neo", "BrowserOS neo macOS", "BrowserOS neo Windows"]
---

BrowserOS neo is a full browser, so installing it works like installing Chrome or Firefox. Download it, drag it across or run the installer, and open it.

<Columns cols={2}>
  <Card title="macOS" icon="apple" href="https://cdn.browseros.com/download/BrowserOS_neo.dmg">
    Universal build for Apple Silicon and Intel. Requires macOS 12 (Monterey) or later.
  </Card>
  <Card title="Windows" icon="windows" href="https://cdn.browseros.com/download/BrowserOS_neo_installer.exe">
    Installer for Windows on x64.
  </Card>
</Columns>

## macOS

<Tabs>
  <Tab title="Homebrew">
    ```sh
    brew tap browseros-ai/tap
    brew install --cask browseros-neo
    ```

    The tap is needed because BrowserOS neo is not in Homebrew's own cask repository yet. Once it is, the same `brew install --cask browseros-neo` keeps working and the tap becomes optional.

    Upgrade with `brew upgrade --cask browseros-neo`, though the browser also updates itself.
  </Tab>
  <Tab title="Direct download">
    <Steps>
      <Step title="Open the disk image">
        Double-click the downloaded `BrowserOS_neo.dmg`.
      </Step>
      <Step title="Drag it to Applications">
        Drag **BrowserOS neo** onto the Applications folder in the same window, then eject the disk image.
      </Step>
      <Step title="Open it">
        Launch BrowserOS neo from Applications or Spotlight. On first launch it will offer to import bookmarks and passwords from your existing browser.
      </Step>
    </Steps>
  </Tab>
</Tabs>

## Windows

<Steps>
  <Step title="Run the installer">
    Double-click the downloaded `BrowserOS_neo_installer.exe` and follow the prompts.
  </Step>
  <Step title="Open it">
    Launch BrowserOS neo from the Start menu.
  </Step>
</Steps>

## Keeping it up to date

BrowserOS neo updates itself. It checks for new versions in the background and installs them on the next restart, so there is nothing to do after the first install.

<Note>
There is no Linux build of BrowserOS neo yet. BrowserOS, the browser for humans, does ship for Linux. See [Install BrowserOS](/browseros) if that is what you are after.
</Note>

## Next

<Card title="How BrowserOS neo works" icon="arrow-right" href="/neo/how-it-works">
  Sign in to your accounts, connect your agent, and give it a first task.
</Card>

---

### Neo Privacy (`docs/neo/privacy.mdx`)

---
title: "Privacy and data"
description: "Everything BrowserOS neo records about your work stays on your computer. Anonymous product events help us improve the app, and they're opt-out. This page walks through both."
keywords: ["BrowserOS neo privacy", "AI browser privacy", "local-first browser", "no telemetry AI browser"]
---

Everything BrowserOS neo records about your work stays on your computer. No cloud sync, no account, no server-side history of what your agents did. This page walks through exactly what stays local, what leaves as anonymous product events, and what your AI's own provider handles.

## What stays on your machine

Your history, cookies, logged-in sessions, downloads, and every recording of what your agents did live in BrowserOS neo's local browser profile on your disk. Sessions and screenshots the [audit and replay](/neo/audit-and-replay) pages show you all live under `~/.browserclaw/`.

None of it uploads. There is no cloud sync, no server-side account, no shared history.

If you want to wipe any of it, delete the files.

## What we never see

The following never leaves your machine, not in any stream, not in any log:

- URLs your agents visit
- Page titles and page content
- Prompts you send your AI
- Tool arguments and tool results
- Screenshots
- File paths
- Passwords
- API keys
- Your email

## Anonymous product events

BrowserOS neo sends a small amount of anonymous usage data so we can see how the product is used and fix rough edges. It's on by default and off with one toggle in Settings.

Here's every field that goes out:

- Startup and shutdown
- Which AI tools connect and disconnect (the tool's name from a fixed list, plus session end times)
- BrowserOS neo version and your operating system

None of the fields in the "never leaves" list above are in this stream. There is no user identifier. There is no page content.

These events go to [PostHog](https://posthog.com), a product analytics service. They're subject to PostHog's own privacy policy. If you'd rather send nothing at all, open Settings and switch the toggle off.

## Your AI's own provider

When your AI works in BrowserOS neo, the AI itself (Claude Code, Cursor, Codex, and so on) talks to its own vendor with your prompts. What that vendor does with the data is governed by their privacy policy, not ours. BrowserOS neo does not intermediate that leg.

## The Claude Desktop extension

The [Claude Desktop extension](/neo/mcp/claude-desktop) (the `.mcpb` file you drop onto Settings) collects zero data. No analytics, no telemetry, no error reporting, no user identifiers.

The extension is a small forwarder: Claude Desktop asks it something, it hands the call to BrowserOS neo on your own machine, and passes the result back to Claude Desktop. It talks to no service on the internet on its own. Nothing kept, nothing sent.

## Read the full policies

<CardGroup cols={2}>
  <Card title="BrowserOS neo privacy policy" icon="scroll" href="https://browseros.com/privacy/browserclaw/">
    Every field, every promise, in legal-clean wording.
  </Card>
  <Card title="Claude Desktop extension privacy" icon="scroll" href="https://browseros.com/privacy/browserclaw-extension/">
    The zero-data extension policy in full.
  </Card>
</CardGroup>

## Where to next

<CardGroup cols={2}>
  <Card title="Audit and replay" icon="play" href="/neo/audit-and-replay">
    Every step your agents take, on your disk.
  </Card>
  <Card title="Your tabs and agent tabs" icon="grid-2" href="/neo/tabs-and-isolation">
    How BrowserOS neo sorts your tabs and your AI's tabs.
  </Card>
</CardGroup>

---

### Neo Tabs And Isolation (`docs/neo/tabs-and-isolation.mdx`)

---
title: "Your tabs and agent tabs"
description: "How BrowserOS neo groups your tabs and your AI's tabs so you always know what's what."
keywords: ["BrowserOS neo tabs", "agent tabs", "personal tabs", "AI browser"]
---

You use your browser for your own work. When an AI drives BrowserOS neo, it works in tabs of its own, right next to yours.

## Two kinds of tabs, one browser

- **Your tabs.** Pages you opened yourself.
- **The AI's tabs.** Pages your AI opened for the task you gave it.

Each AI's tabs land in their own colored tab group at the top of your tab strip, titled with the AI's name. Your tabs stay outside any group. One glance tells you what belongs to whom.

## Your AI knows the difference

BrowserOS neo tells your AI which tabs belong to you and which it opened itself. Your AI uses that to stay out of your workflow by default. It knows your tabs are there and can read their titles and URLs, so it has context, but it doesn't jump in.

If you want your AI to help with something you have open, reply to the email you're reading, extract the numbers from the doc on your screen, just ask. Your AI can work on the tab. That's your call.

## When an AI's session ends

Close an AI's session and its tab group closes with it. The tabs it opened go away in one step. Your tabs are never touched.

If you close one of an AI's tabs while it's still running, the AI notices right away. Nothing gets stuck.

## Where to next

<CardGroup cols={2}>
  <Card title="Your stuff stays yours" icon="lock" href="/neo/privacy">
    What BrowserOS neo records, what it doesn't, and where everything lives.
  </Card>
  <Card title="How BrowserOS neo works" icon="play" href="/neo/how-it-works">
    A guided walkthrough from install to your first AI-driven session.
  </Card>
</CardGroup>

---

### Snippets Changelog (`docs/snippets/changelog.mdx`)

All notable changes to BrowserOS are documented here. For the full release history with download links, see our [GitHub Releases](https://github.com/browseros-ai/BrowserOS/releases).

---

## v0.46.0
<sub>June 17, 2026</sub>

- **Claude Code & Codex in your browser** — The agent harness now bundles full coding agents. Claude Code and Codex plug straight into the assistant, so you can drive your browser with the agent — and the subscription — you already use.
- **A brand new experience** — A redesigned new tab, a calmer composer, and a rebuilt command center for switching between agents. The whole assistant is cleaner, faster to reach, and easier to live in.
- **New MCP tools** — A tighter, more reliable browser tool surface for agents, rebuilt from the ground up. Plus one-click install of BrowserOS as an MCP server into the agents you already run, with automatic URL sync.
- **Chromium 148** — Updated to the latest Chromium base with all recent upstream fixes and security patches
- **Streamlined** — We've pulled back a few features that weren't getting much use — Skills, Soul, and Memory — so we can focus and ship better versions soon.

---

## v0.44.0
<sub>March 20, 2026</sub>

- **ChatGPT Pro & GitHub Copilot** — Already paying for ChatGPT Pro, Plus, or GitHub Copilot? Use that subscription to automate browser tasks in BrowserOS at no extra cost — just log in with your existing account.
- **Voice input** — Talk to your agent instead of typing. The chat bar now accepts voice input for any query.
- **Smarter agent** — Overhauled agent grounding for more reliable and precise browser actions.
- **Bug fixes & reliability** — Improved memory tools, fixed fill tool issues, new tab layout fixes, and numerous stability improvements across the board.

---

## v0.43.0
<sub>March 12, 2026</sub>

- **Skills** — Reusable instructions that teach your agent how to handle specific tasks. Ships with 12 built-in skills like deep research, price comparison, and form filling — and you can create your own.
- **Memory** — Your assistant now remembers you across conversations. Core memory stores permanent facts like your name and projects, while daily notes capture session context and auto-expire after 30 days. Everything stays local on your machine.
- **Kimi K2.5** — In partnership with Moonshot AI, Kimi K2.5 is now the default model in BrowserOS — open-source, multimodal, and great for browser automation. Bring your own key from [platform.moonshot.ai](https://platform.moonshot.ai/) anytime.
- **SOUL.md** — Shape your assistant's personality, tone, and boundaries. It evolves on its own as you interact — the more you use it, the more it feels like yours.

---

## v0.42.0
<sub>March 9, 2026</sub>

- **SOUL.md** — Your assistant now has a soul. Tell it how you like to communicate, set boundaries, shape its personality — and it adapts on its own over time. The more you use it, the more it feels like *your* assistant.
- **Vertical tabs** — One of the most requested features is here. BrowserOS now ships with vertical tabs by default. More screen space, better tab management, and a cleaner layout out of the box. Prefer horizontal? You can switch back anytime in settings. [Read more →](/browseros/features/vertical-tabs)
- **Long-term memory** — Your assistant finally remembers you. Your name, your projects, what you talked about last week — it carries context across every conversation so you never have to repeat yourself. All stored locally on your machine.
- **Chromium 146** — Updated to the latest Chromium release with all recent upstream fixes and security patches

<Frame>
  <img src="/images/changelog/0.42.0/soul-memory.png" alt="BrowserOS v0.42.0 SOUL.md feature for agent personalization" />
</Frame>

<Frame>
  <img src="/images/changelog/0.42.0/vertical-tabs.png" alt="BrowserOS v0.42.0 vertical tabs toggle in settings" />
</Frame>

---

## v0.41.0
<sub>March 4, 2026</sub>

- **New agent (v3)** — Completely redone from scratch. 2x faster, 2–3x better performance
- **Tools — major upgrade** — Agent tools and MCP server both got a big overhaul. ~20 new tools (54 total) including file upload, save as PDF, background windows, and more. Connection with third-party coding agents (Claude Code, Codex, etc.) is much better now
- **General fixes** — Better agent installation, bug fixes, and smoother experience overall
- **Linux Debian packaging** — Fixed the remaining Debian packaging issues

---

## v0.40.1
<sub>February 16, 2026</sub>

- **Chromium 145** — Upgraded to the latest Chromium base with all recent upstream fixes and security patches
- **Login session import improvements** — Importing login sessions is now more reliable
- **Stability & reliability** — General improvements across the board

---

## v0.39.0
<sub>February 3, 2026</sub>

- **Sync** — Save your browser configuration, agent history, and scheduled tasks across machines. Your setup now follows you wherever you go
- **App Connector redesign** — Connecting MCP apps is now easier. The new App Connector UI makes it simpler to discover, install, and manage your connected apps
- **MCP port stability** — Additional fixes for users still experiencing port issues. More reliable connections across restarts
- **Keyboard shortcuts** — Updated shortcuts to avoid conflicts with European keyboards

<Frame>
  <img src="/images/changelog/0.39.0-sync-mcp.png" alt="BrowserOS v0.39.0 featuring Sync and improved MCP connectors" />
</Frame>

---

## v0.38.0
<sub>January 28, 2026</sub>

Bug fix and stability release.

- **MCP port fix on Windows & Linux** — Fixed an issue with MCP port. Port now stays consistent across restarts and made it more reliable
- **Settings fix** — Fixed `chrome.browser.settings` not working correctly. Settings should now persist and apply as expected
- **Improved agent** — Made the agent more reliable and performant. General stability fixes across the agent loop

---

## v0.37.0
<sub>January 21, 2026</sub>

- **Workflows** — Build reliable, repeatable browser automations with a visual graph builder. Chat with the workflow agent to define step-by-step automation—ideal for complex tasks where ad-hoc prompts aren't enough.

<img src="/browseros/features/workflow/sample-workflow.png" alt="Workflows visual graph builder showing a data entry automation" />

- **Cowork** — Describe an outcome, step away, and come back to finished work. Combine browser automation with local file operations—research on the web and save reports, scrape data and export to files, all in one task. [Read more →](/browseros/features/cowork)

<img src="/browseros/features/cowork/cowork-research-example.png" alt="Agent researching Hacker News and generating an HTML report" />

---

## v0.36.3
<sub>January 15, 2026</sub>

- **Agent history** — Agent conversations are now saved automatically. View and resume them anytime from the Assistant panel

<img src="/images/changelog/0.36.3/agent-history-highlight.png" alt="Agent history button in the Assistant panel" />

<img src="/images/changelog/0.36.3/agent-history-example.png" alt="Agent history showing past conversations" />

---

## v0.36.2
<sub>January 10, 2026</sub>

Bug fix release focused on MCP stability.

- **MCP server disconnect fix** — Fixed port handling issue causing MCP connections to drop unexpectedly

---

## v0.36.0
<sub>January 8, 2026</sub>

- **Agent personalization** — Add your own prompts to personalize the agent. Tweak its behavior, adjust how it responds, set your preferred formatting, and more
- **Toolbar customization** — Hide the Hub chat and labels from the settings page to declutter your toolbar
- **MCP server port stability** — The port now stays consistent through browser restarts, so you don't have to keep updating your MCP clients
- **Fixed agent install/update issues** — The agent now handles installs and updates more proactively

---

## v0.35.0
<sub>December 25, 2025</sub>

- **Agent stability fixes** — Fixed bugs to make the agent loop much more reliable
- **Gemini 3 support** — Gemini 3 now supported through OpenRouter and Google adapters
- **Better error surfacing** — Error messages are now clearer

---

## v0.34.0
<sub>December 20, 2025</sub>

- **Third-party MCP server support** — Connect external MCP servers like Google Calendar, Notion, Google Docs, Gmail, and more. You can also connect your own custom MCP servers
- **Gemini 3 support** — Gemini 3 Pro and Flash models now work with BrowserOS
- **Windows icon fix** — The Windows icon now displays BrowserOS logo correctly
- **Agent & UI improvements** — Various agent loop fixes and UI polish

---

## v0.33.0
<sub>December 18, 2025</sub>

- **OpenAI-compatible provider support** — Connect any OpenAI-compatible API endpoint
- **Multi-window & multi-profile agent support** — Agent now works across multiple windows and browser profiles
- **MCP server reliability** — Fixed connection drops and improved stability
- **Agent reliability improvements** — General stability fixes

---

## v0.32.0
<sub>December 12, 2025</sub>

A complete revamp of BrowserOS.

**New features:**
- **New Agent** — Completely rebuilt agent: faster, smarter, and more reliable
- **Agent Per Tab** — Run multiple agents in different tabs simultaneously
- **Polished UI** — Fresh, cleaner interface design
- **Manifest V2 Support** — Ad blockers like uBlock Origin work again
- **Native Split View** — Work on two things side by side
- **Chromium 142** — Updated to Chromium 142.0.7444.49
- **Azure & AWS Bedrock** — Native support for Azure OpenAI and AWS Bedrock models

**Breaking changes:**
- Old agent will stop working — update required
- LLM provider settings won't carry over — reconfiguration needed

---

## v0.30.0
<sub>November 14, 2025</sub>

- **Better text extraction** — Improved copy button in LLM Chat
- **MCP server stability** — Improved connection reliability
- **UI cleanup** — Unpinned extensions for cleaner look
- **Third-party MCP fixes** — Fixed support for third-party MCP servers

---

<Note>
For older releases, see the [full release history on GitHub](https://github.com/browseros-ai/BrowserOS/releases).
</Note>

---

### Snippets Contributing (`docs/snippets/contributing.mdx`)

BrowserOS has two main parts you can contribute to:

- **Agent** — The AI features, UI, and browser automation (TypeScript/React)
- **Browser** — The custom Chromium build (C++/Python)

Most contributors work on the Agent since it's much easier to set up.

## Quick Links

- [GitHub Repository](https://github.com/BrowserOS-ai/BrowserOS)
- [Discord Community](https://discord.gg/YKwjt5vuKr)
- [Report Issues](https://github.com/BrowserOS-ai/BrowserOS/issues)

## Ways to Contribute

**Report bugs** — [Open an issue](https://github.com/browseros-ai/BrowserOS/issues/new) with steps to reproduce, expected vs actual behavior, and screenshots.

**Suggest features** — Share ideas on [GitHub](https://github.com/browseros-ai/BrowserOS/issues/99) or [Discord](https://discord.gg/YKwjt5vuKr).

**Improve docs** — Docs live in `docs/` and use Mintlify. Edit pages and update `docs/docs.json` for navigation.

---

## Path 1: Agent Development

The Agent is a monorepo with 3 components:

| Component | Path | What it does |
|-----------|------|--------------|
| **Agent UI** | `apps/app` | Chrome extension — chat interface, settings, side panel |
| **Server** | `apps/server` | Bun server — agent loop, MCP tools, API endpoints |
| **Controller** | `apps/controller-ext` | Chrome extension — bridges `chrome.*` APIs to the server |

### Architecture

<img src="/images/contributing--architecture.png" alt="BrowserOS Agent architecture diagram" />

### Setup

```bash
# Clone the repo
git clone https://github.com/YOUR-USERNAME/BrowserOS.git
cd BrowserOS/packages/browseros-agent

# Install dependencies
bun install

# Copy environment files
cp apps/server/.env.example apps/server/.env.development
cp apps/app/.env.example apps/app/.env.development
```

### Running Locally

```bash
# Terminal 1: Start the server
bun run start:server

# Terminal 2: Start the agent extension (dev mode)
bun run start:agent
```

Then load the extension in BrowserOS:
1. Go to `chrome://extensions/`
2. Enable **Developer mode**
3. Click **Load unpacked** and select the `apps/app/dist/` folder

### Commands

| Command | Description |
|---------|-------------|
| `bun run start:server` | Start the server |
| `bun run start:agent` | Start agent extension (dev mode) |
| `bun run build:server` | Build server for production |
| `bun run build:agent` | Build agent extension |
| `bun run build:ext` | Build controller extension |
| `bun run test` | Run tests |
| `bun run lint` | Check with Biome |
| `bun run typecheck` | TypeScript check |

---

## Path 2: Browser Development

Only go down this path if you're working on Chromium-level features like patches to the browser itself.

**Requirements:**
- ~100GB disk space
- 16GB+ RAM recommended
- 3+ hours for first build

### Prerequisites

<Tabs>
  <Tab title="macOS">
    - macOS with Xcode and Command Line Tools
    - Python 3.12+
    - [UV](https://docs.astral.sh/uv/) (Python package manager)
    - Git
  </Tab>
  <Tab title="Linux">
    - Ubuntu 20.04+ or similar
    - build-essential package
    - Python 3.12+
    - [UV](https://docs.astral.sh/uv/)
    - Git
  </Tab>
  <Tab title="Windows">
    - Windows 10/11
    - Visual Studio 2022 with C++ workload
    - Python 3.12+
    - [UV](https://docs.astral.sh/uv/)
    - Git
  </Tab>
</Tabs>

### Build Instructions

**1. Clone Chromium source**

Follow the official [Chromium: Get the Code](https://www.chromium.org/developers/how-tos/get-the-code/) guide. This sets up `depot_tools` and fetches ~100GB of source code.

Note the path where you clone it (e.g., `~/chromium/src`).

**2. Install UV and dependencies**

```bash
# Install UV
curl -LsSf https://astral.sh/uv/install.sh | sh

# Navigate to build system
cd packages/browseros

# Install dependencies
uv sync
```

**3. Build debug version**

```bash
uv run browseros build \
  --chromium-src <your-chromium-src-path> \
  --setup \
  --prep \
  --build \
  --build-type debug
```

The `--setup` and `--prep` flags are only needed for the first build. After that, just use `--build` for incremental builds:

```bash
uv run browseros build --chromium-src <path> --build --build-type debug
```

**4. Run BrowserOS**

<Tabs>
  <Tab title="macOS (ARM64)">
    ```bash
    <chromium-src>/out/Default_arm64/BrowserOS\ Dev.app/Contents/MacOS/BrowserOS\ Dev \
      --enable-logging=stderr \
      --use-mock-keychain \
      --user-data-dir=/tmp/test-profile
    ```
  </Tab>
  <Tab title="macOS (x64)">
    ```bash
    <chromium-src>/out/Default_x64/BrowserOS\ Dev.app/Contents/MacOS/BrowserOS\ Dev \
      --enable-logging=stderr \
      --use-mock-keychain \
      --user-data-dir=/tmp/test-profile
    ```
  </Tab>
  <Tab title="Windows">
    ```bash
    <chromium-src>\out\Default_x64\BrowserOS Dev.exe \
      --enable-logging=stderr \
      --user-data-dir=%TEMP%\test-profile
    ```
  </Tab>
  <Tab title="Linux">
    ```bash
    <chromium-src>/out/Default_x64/browseros \
      --enable-logging=stderr \
      --user-data-dir=/tmp/test-profile
    ```
  </Tab>
</Tabs>

### Build Flags

| Flag | Description |
|------|-------------|
| `--chromium-src` | Path to Chromium source directory |
| `--setup` | Run setup phase (first build only) |
| `--prep` | Run prep phase (first build only) |
| `--build` | Run the compile phase |
| `--build-type` | `debug` or `release` |
| `--sign` | Sign the build |
| `--package` | Package for distribution |

### Troubleshooting

**Build fails with missing dependencies** — Make sure you followed all steps from the Chromium build guide for your platform.

**Out of disk space** — Chromium needs ~100GB. Check with `df -h`.

**Build takes too long** — Use ccache, more CPU cores, or stick to debug builds.

**UV command not found** — Restart your terminal after installing UV.

---

## Making Your First PR

1. **Fork** the repository on GitHub
2. **Clone** your fork locally
3. **Create a branch**: `git checkout -b feature/your-feature`
4. **Make changes** and test them
5. **Commit**: `git commit -m "feat: add your feature"`
6. **Push**: `git push origin feature/your-feature`
7. **Open a PR** with a clear description

### Sign the CLA

On your first PR, our bot will ask you to sign the Contributor License Agreement. Just comment:

```
I have read the CLA Document and I hereby sign the CLA
```

---

## Code Standards

**TypeScript:**
- Use strict typing, avoid `any`
- Use Zod schemas instead of TypeScript interfaces
- Use path aliases (`@/lib`) not relative paths (`../`)
- Naming: `PascalCase` for classes, `camelCase` for functions

**React:**
- Tailwind CSS only (no SCSS or CSS modules)
- Hooks at top level only
- Test with Vitest

**General:**
- Keep functions short (under 20 lines)
- Write tests for new features
- Handle errors gracefully

---

## Getting Help

- **Discord** — [discord.gg/YKwjt5vuKr](https://discord.gg/YKwjt5vuKr)
- **GitHub Issues** — [github.com/BrowserOS-ai/BrowserOS/issues](https://github.com/BrowserOS-ai/BrowserOS/issues)
- **GitHub Discussions** — [github.com/BrowserOS-ai/BrowserOS/discussions](https://github.com/BrowserOS-ai/BrowserOS/discussions)

---

By contributing, you agree that your contributions will be licensed under AGPL-3.0.

---

### Browseros Comparisons Chrome Devtools Mcp (`docs/browseros/comparisons/chrome-devtools-mcp.mdx`)

---
title: "Chrome DevTools MCP"
description: "A developer-focused comparison of BrowserOS MCP and Chrome DevTools MCP for browser automation"
---

Both BrowserOS MCP and [Chrome DevTools MCP](https://github.com/ChromeDevTools/chrome-devtools-mcp) give AI agents control over a browser via the Model Context Protocol. But they're built for different scopes. Chrome DevTools MCP focuses on debugging and inspection, while BrowserOS MCP is a complete browser automation and app integration platform.

This page breaks down the differences for developers evaluating which to use with Claude Code, Gemini CLI, Cursor, or any MCP client.

---

## At a Glance

| | **BrowserOS MCP** | **Chrome DevTools MCP** |
|---|---|---|
| **Total MCP tools** | 53 | 29 |
| **External app integrations** | 40+ (Gmail, Slack, GitHub, etc.) | None |
| **Setup** | Copy URL from settings, works instantly | Requires `--remote-debugging-port` flag and separate server process |
| **Browser session** | Your real browser with cookies, logins, extensions | Attached debug session (some sites block WebDriver-controlled browsers) |
| **Architecture** | Built into the browser | External Node.js process connecting via CDP |

---

## Feature Comparison

### Navigation & Tab Management

| Feature | BrowserOS MCP | Chrome DevTools MCP |
|---------|:---:|:---:|
| Navigate to URL / back / forward / reload | `navigate_page` | `navigate_page` |
| Open new tab | `new_page` | `new_page` |
| Close tab | `close_page` | `close_page` |
| List open tabs | `list_pages` | `list_pages` |
| Switch to tab | `show_page` | `select_page` |
| Hidden/background tabs | `new_hidden_page` | - |
| Move tab between windows | `move_page` | - |
| Get active/focused tab | `get_active_page` | - |
| Wait for condition | - | `wait_for` |

### Content & Observation

| Feature | BrowserOS MCP | Chrome DevTools MCP |
|---------|:---:|:---:|
| Accessibility tree snapshot | `take_snapshot` | `take_snapshot` |
| Enhanced structural snapshot | `take_enhanced_snapshot` | - |
| Page content as Markdown | `get_page_content` | - |
| Extract all page links | `get_page_links` | - |
| Raw HTML / DOM access | `get_dom` | - |
| Search DOM (text / CSS / XPath) | `search_dom` | - |
| Screenshot | `take_screenshot` | `take_screenshot` |
| Execute JavaScript | `evaluate_script` | `evaluate_script` |

### Interaction & Input

| Feature | BrowserOS MCP | Chrome DevTools MCP |
|---------|:---:|:---:|
| Click element | `click` | `click` |
| Click at coordinates | `click_at` | - |
| Type / fill text | `fill` | `fill` |
| Fill entire form | - | `fill_form` |
| Type text (raw keystrokes) | - | `type_text` |
| Clear input | `clear` | - |
| Hover | `hover` | `hover` |
| Drag | `drag` | `drag` |
| Press key / key combo | `press_key` | `press_key` |
| Check / uncheck checkbox | `check` / `uncheck` | - |
| Select dropdown option | `select_option` | - |
| Focus element | `focus` | - |
| Scroll (directional) | `scroll` | - |
| Upload file | `upload_file` | `upload_file` |
| Handle dialog (alert/confirm) | `handle_dialog` | `handle_dialog` |

### File & Export

| Feature | BrowserOS MCP | Chrome DevTools MCP |
|---------|:---:|:---:|
| Save page as PDF | `save_pdf` | - |
| Save screenshot to disk | `save_screenshot` | - |
| Download file via click | `download_file` | - |

### Window Management

| Feature | BrowserOS MCP | Chrome DevTools MCP |
|---------|:---:|:---:|
| List windows | `list_windows` | - |
| Create window | `create_window` | - |
| Create hidden window | `create_hidden_window` | - |
| Close window | `close_window` | - |
| Activate / focus window | `activate_window` | - |

### Tab Groups

| Feature | BrowserOS MCP | Chrome DevTools MCP |
|---------|:---:|:---:|
| List tab groups | `list_tab_groups` | - |
| Create tab group | `group_tabs` | - |
| Update group (title/color) | `update_tab_group` | - |
| Ungroup tabs | `ungroup_tabs` | - |
| Close tab group | `close_tab_group` | - |

### Bookmarks

| Feature | BrowserOS MCP | Chrome DevTools MCP |
|---------|:---:|:---:|
| List bookmarks | `get_bookmarks` | - |
| Create bookmark / folder | `create_bookmark` | - |
| Remove bookmark | `remove_bookmark` | - |
| Update bookmark | `update_bookmark` | - |
| Move bookmark | `move_bookmark` | - |
| Search bookmarks | `search_bookmarks` | - |

### History

| Feature | BrowserOS MCP | Chrome DevTools MCP |
|---------|:---:|:---:|
| Search history | `search_history` | - |
| Get recent history | `get_recent_history` | - |
| Delete URL from history | `delete_history_url` | - |
| Delete history range | `delete_history_range` | - |

### Debugging & Performance

| Feature | BrowserOS MCP | Chrome DevTools MCP |
|---------|:---:|:---:|
| Console messages | Coming soon | `get_console_message` / `list_console_messages` |
| Network request inspection | Coming soon | `get_network_request` / `list_network_requests` |
| Performance tracing | Coming soon | `performance_start_trace` / `performance_stop_trace` |
| Performance analysis | Coming soon | `performance_analyze_insight` |
| Memory snapshot | Coming soon | `take_memory_snapshot` |
| Lighthouse audit | Coming soon | `lighthouse_audit` |
| Device / network emulation | Coming soon | `emulate` |
| Resize viewport | Coming soon | `resize_page` |

### External App Integrations

| Feature | BrowserOS MCP | Chrome DevTools MCP |
|---------|:---:|:---:|
| Gmail, Outlook | Yes | - |
| Google Calendar, Outlook Calendar | Yes | - |
| Slack, Discord, Teams, WhatsApp | Yes | - |
| GitHub, GitLab | Yes | - |
| Linear, Jira, Asana, Monday, ClickUp | Yes | - |
| Notion, Google Docs/Sheets/Drive | Yes | - |
| Figma, Canva | Yes | - |
| Salesforce, HubSpot | Yes | - |
| Shopify, Stripe | Yes | - |
| 20+ more services | Yes | - |

---

## Setup Comparison

<Tabs>
  <Tab title="BrowserOS MCP">
    BrowserOS MCP is built into the browser. No separate process, no debug flags.

    ```bash
    # One command, done
    claude mcp add --transport http browseros http://127.0.0.1:9239/mcp --scope user
    ```

    The server URL is available at `chrome://browseros/mcp`. Copy it and connect.
  </Tab>
  <Tab title="Chrome DevTools MCP">
    Chrome DevTools MCP requires launching Chrome with remote debugging enabled and running a separate Node.js server.

    ```bash
    # Step 1: Launch Chrome with debug port
    /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --remote-debugging-port=9222

    # Step 2: Install and run the MCP server
    npx @anthropic-ai/chrome-devtools-mcp@latest

    # Step 3: Connect your MCP client to the server
    ```

    Some sites may block sign-in when the browser is controlled via WebDriver (the default launch mechanism).
  </Tab>
</Tabs>

---

## Summary

| Dimension | BrowserOS MCP | Chrome DevTools MCP |
|-----------|:---:|:---:|
| Browser automation tools | **54** | **29** |
| External app integrations | **40+** | **0** |
| Window management | Yes | No |
| Tab groups | Yes | No |
| Bookmarks & history | Yes | No |
| File export (PDF, screenshots, downloads) | Yes | No |
| Content extraction (Markdown, links, DOM) | Yes | No |
| Console / network inspection | Coming soon | Yes |
| Performance tracing & Lighthouse | Coming soon | Yes |
| Memory snapshots | Coming soon | Yes |
| Device emulation | Coming soon | Yes |
| Setup complexity | Copy URL | Debug port + Node server |
| Browser session | Real (cookies, extensions) | Debug-attached (WebDriver flags) |

BrowserOS MCP gives you a broader automation surface: browser control, content extraction, file operations, and 40+ app integrations through a single connection. Debugging and performance tools are coming soon to BrowserOS MCP, which will close the remaining gap with Chrome DevTools MCP. For most AI agent workflows, BrowserOS MCP already covers more ground out of the box.

---

### Browseros Comparisons Claude Cowork (`docs/browseros/comparisons/claude-cowork.mdx`)

---
title: "Claude Cowork"
description: "How BrowserOS Cowork compares to Claude Cowork for getting real work done with AI"
---

Both BrowserOS Cowork and [Claude Cowork](https://claude.com/product/cowork) let an AI agent work with your local files autonomously. You describe a task, step away, and come back to completed work. They share a similar file toolkit under the hood. The key difference is what else each product can do. BrowserOS Cowork runs inside a real browser with full web access and 40+ app integrations. Claude Cowork runs inside an isolated VM with professional document generation.

This page compares both products so you can decide which fits your workflow.

---

## At a Glance

| | **BrowserOS Cowork** | **Claude Cowork** |
|---|---|---|
| **Runs in** | Your real browser | Claude Desktop app (VM) |
| **File tools** | Read, write, edit, search, organize | Read, write, edit, search, organize |
| **Browser automation** | Yes, 53 tools (click, type, screenshot, navigate, etc.) | No |
| **App integrations** | 40+ (Gmail, Slack, GitHub, Calendar, Notion, etc.) | ~4 connectors (Google Drive, Gmail, DocuSign) |
| **AI model** | Your choice (Claude, GPT, Gemini, Kimi, local models) | Claude only |
| **Internet access** | Full (through your real browser) | Restricted |
| **Document generation** | Basic (HTML, Markdown, CSV) | Advanced (Excel with formulas, PowerPoint, formatted docs) |
| **Pricing** | Free (bring your own AI key) | Requires paid Claude subscription |
| **Platform** | Any OS with BrowserOS | macOS, Windows x64 |

---

## Feature Comparison

### File Operations

Both products provide a comparable set of file tools. You can read, write, edit, search, and organize files in both. This is table-stakes for both products.

| What you can do | BrowserOS Cowork | Claude Cowork |
|-----------------|:---:|:---:|
| Read and view files | Yes | Yes |
| Create and save new files | Yes | Yes |
| Edit specific parts of a file | Yes | Yes |
| Search inside files for text | Yes | Yes |
| Find files by name or pattern | Yes | Yes |
| List and browse folders | Yes | Yes |
| Run commands/scripts | Yes | Yes |
| Break work into parallel subtasks | Coming soon | Built-in sub-agents |

<Note>
The file tools are largely equivalent. The real differentiator is what else each product can do beyond file operations.
</Note>

### Working with the Web

This is the biggest difference. BrowserOS Cowork runs inside a real browser with your existing logins and sessions.

| What you can do | BrowserOS Cowork | Claude Cowork |
|-----------------|:---:|:---:|
| Open and navigate websites | Yes | No |
| Click buttons, fill forms, type text | Yes | No |
| Take screenshots of web pages | Yes | No |
| Extract content from web pages | Yes | No |
| Save pages as PDF | Yes | No |
| Download files from the web | Yes | No |
| Access sites where you're logged in | Yes (your real browser session) | No |
| Manage tabs, windows, and bookmarks | Yes | No |
| Search your browsing history | Yes | No |

Claude Cowork has no browser access. If your task involves anything on the web, whether that's researching, filling out forms, grabbing content from a site, or checking on a web app, you need BrowserOS.

### Connected Apps

BrowserOS connects to 40+ services directly. Claude Cowork has a handful of connectors.

| Service | BrowserOS Cowork | Claude Cowork |
|---------|:---:|:---:|
| Gmail | Yes | Yes |
| Google Drive | Yes | Yes |
| Google Calendar | Yes | Limited |
| Slack | Yes | No |
| GitHub | Yes | No |
| Linear / Jira / Asana | Yes | No |
| Notion | Yes | No |
| Figma | Yes | No |
| Salesforce / HubSpot | Yes | No |
| Shopify / Stripe | Yes | No |
| 30+ more services | Yes | No |

### Document Generation

Claude Cowork has an edge when it comes to creating polished office documents.

| What you can do | BrowserOS Cowork | Claude Cowork |
|-----------------|:---:|:---:|
| HTML and Markdown files | Yes | Yes |
| CSV and data files | Yes | Yes |
| Excel with working formulas | No | Yes |
| PowerPoint presentations | No | Yes |
| Formatted Word documents | No | Yes |

---

## How They Work

<Tabs>
  <Tab title="BrowserOS Cowork">
    BrowserOS Cowork runs inside the browser. The agent has access to your real browser session (cookies, logins, extensions) and a sandboxed folder on your computer.

    - Works in your real browser with your existing logins
    - File access sandboxed to the folder you select
    - 40+ app integrations via OAuth
    - Connect from any AI tool (Claude Code, Gemini CLI, Cursor, etc.)
    - Uses whatever AI model you choose
  </Tab>
  <Tab title="Claude Cowork">
    Claude Cowork runs in an isolated virtual machine on your desktop via the Claude Desktop app.

    - Runs in a secure VM, isolated from your main system
    - File access to folders you grant permission to
    - ~4 connectors (Google Drive, Gmail, DocuSign, FactSet)
    - Only works in the Claude Desktop app
    - Uses Claude models only
    - Comes pre-loaded with Python, Node.js, Ruby, and common tools
  </Tab>
</Tabs>

---

## Where Claude Cowork Shines

- **Professional documents**: Create Excel spreadsheets with working formulas, PowerPoint presentations, and formatted Word documents
- **Parallel subtasks**: Automatically breaks complex work into smaller tasks that run at the same time
- **Stronger isolation**: Runs in a full virtual machine, giving you OS-level separation from your main system
- **Zero setup**: Works out of the box in the Claude Desktop app with pre-installed tools and languages

---

## Where BrowserOS Cowork Shines

- **Full browser access**: Navigate websites, fill forms, click buttons, take screenshots, and extract content from any page. Claude Cowork cannot touch the web.
- **Your real logins**: Because it runs in your actual browser, the agent can access sites where you're already logged in: dashboards, internal tools, social media, banking portals, anything.
- **40+ app integrations**: Gmail, Slack, GitHub, Calendar, Notion, Linear, Figma, Salesforce, and more. All accessible in the same session as your file work. Claude Cowork has about 4 connectors.
- **Pick your AI model**: Use Claude, GPT-5, Gemini, Kimi K2.5, or a local model. Claude Cowork only works with Claude.
- **Full internet access**: Your agent can visit any website. Claude Cowork's VM is restricted to a short list of allowed sites.
- **Free**: BrowserOS is free. Just bring your own AI API key. Claude Cowork requires a paid Claude subscription.

---

## Summary

| | BrowserOS Cowork | Claude Cowork |
|---|:---:|:---:|
| File tools (read, write, edit, search) | Yes | Yes |
| Browse the web | **Yes (53 tools)** | No |
| Connected apps | **40+** | ~4 |
| Internet access | Full | Restricted |
| Choose your AI model | Yes | Claude only |
| Works with other AI tools | Yes (Claude Code, Gemini CLI, Cursor, etc.) | Claude Desktop only |
| Excel, PowerPoint, Word | No | **Yes** |
| Parallel subtasks | Coming soon | **Built-in** |
| Security model | Folder-level sandbox | VM isolation |
| Platform | Any OS | macOS, Windows x64 |
| Pricing | Free + API key | Paid subscription |

Both products handle file operations equally well. The choice comes down to what else you need. If your work touches the web, connected apps, or you want to choose your own AI model, BrowserOS Cowork gives you that. If you need polished office documents and prefer a fully isolated desktop experience, Claude Cowork is a good fit.

---

### Browseros Comparisons Openclaw (`docs/browseros/comparisons/openclaw.mdx`)

---
title: "OpenClaw"
description: "How BrowserOS compares to OpenClaw for everyday AI assistance"
---

[OpenClaw](https://openclaw.ai/) is an open-source personal AI assistant that runs on your machine and connects through messaging apps like WhatsApp, Telegram, Slack, and Discord. It is a powerful tool for technical users who want a self-hosted, always-on AI agent.

BrowserOS takes a different approach. Instead of running a background server that you message through chat apps, BrowserOS puts the AI assistant directly inside your browser, where most of your work already happens. No terminal setup, no daemon management, no Node.js required.

This comparison is for users deciding which tool fits their needs.

## At a Glance

| | **BrowserOS** | **OpenClaw** |
|---|---|---|
| **What it is** | AI-powered browser with built-in assistant | Self-hosted AI agent you message through chat apps |
| **Setup** | Download and open | Install via npm, run onboarding wizard, configure daemon |
| **Technical skill needed** | None | Comfortable with terminal and Node.js |
| **Interface** | Built into your browser | WhatsApp, Telegram, Slack, Discord, iMessage, and 15+ more |
| **Browser automation** | 53 tools (clicks, forms, navigation, screenshots, tabs, bookmarks, history) | Chrome via CDP (snapshots and actions) |
| **App integrations** | 40+ built-in (OAuth or API key depending on the service) | Skills-based (community-built, self-installable) |
| **LLM support** | 11+ providers including local models (Ollama, LM Studio) | Multiple providers with failover routing |
| **Runs on** | macOS, Windows, Linux | macOS, Windows, Linux (+ iOS/Android companion apps) |
| **Authentication** | OAuth or API key depending on the service | API keys, OAuth, pairing codes per channel |
| **Open source** | Yes (AGPL-3.0) | Yes (MIT) |

## Where BrowserOS Shines

### No technical setup required

OpenClaw requires Node.js 22+, npm installation, a terminal-based onboarding wizard, daemon configuration (launchd or systemd), and channel pairing for each messaging platform. If something goes wrong, you need `openclaw doctor` to diagnose issues.

BrowserOS is a browser. Download it, open it, and start talking to the assistant. There is no daemon to manage, no services to keep running, and no terminal needed.

### Browser automation built in

BrowserOS gives the assistant full control of your browser with 53 tools: clicking buttons, filling forms, navigating between pages, taking screenshots, managing tabs, organizing bookmarks, searching history, and more. The assistant sees what you see and can interact with any website you are logged into.

OpenClaw has browser automation through a dedicated Chrome instance with CDP, but it runs as a separate process rather than being integrated into the browser you are already using. With BrowserOS, the assistant works directly in your browsing session with all your cookies, logins, and open tabs.

### 40+ app integrations built in

BrowserOS connects to Gmail, Google Calendar, Slack, Notion, GitHub, Linear, Jira, Figma, Salesforce, Stripe, and 30+ more services out of the box. Most services connect through OAuth (one-click sign-in), while some require an API key. Either way, the assistant detects when an app is not connected and walks you through the setup right in the conversation.

OpenClaw uses a skills system where integrations are community-built plugins. Some popular services have skills available, but connecting a new service often means finding the right skill, installing it, and configuring credentials manually.

### Works where you already are

Most of your work happens in a browser. BrowserOS puts the assistant right there, so it can see the page you are on, interact with web apps, and pull data from your open tabs. There is no context-switching between a chat app and your browser.

OpenClaw's approach of messaging through WhatsApp or Telegram is clever for mobile use, but when you are at your computer working in a browser, having the assistant inside that browser is more natural and more capable.

## Where OpenClaw Shines

### Messaging app access

OpenClaw connects to 20+ messaging platforms including WhatsApp, Telegram, Signal, iMessage, Discord, Slack, Microsoft Teams, and more. You can message your assistant from your phone or any chat app without opening a specific application. This is ideal if you want AI help on the go through apps you already have open.

BrowserOS is a desktop browser. To use the assistant, you need to be in BrowserOS.

### Always-on background agent

OpenClaw runs as a daemon on your machine, processing tasks even when you are not actively chatting. It supports cron jobs, webhooks, and Gmail Pub/Sub for automated triggers. It can wake up, do something, and report back through your messaging app.

BrowserOS has [scheduled tasks](/browseros/features/scheduled-tasks) that run automations on a schedule, but the browser needs to be running. OpenClaw's daemon approach is more suited for server-like always-on operation.

### Mobile companion apps

OpenClaw offers iOS and Android companion apps with camera access, voice input, screen recording, and device-level actions (notifications, contacts, calendar, SMS). This extends the assistant to your phone in a way that BrowserOS cannot currently match.

### Agent-to-agent communication

OpenClaw supports multi-session agent coordination where agents can discover each other, read transcripts, and send messages between sessions. This is useful for complex workflows where multiple specialized agents collaborate.

### Self-modifying skills

OpenClaw agents can write and install their own skills during a conversation. If the assistant does not have a capability, it can create one on the fly. This makes it extremely flexible for power users who want the agent to extend itself.

## Feature Comparison

### App Integrations

| Service | BrowserOS | OpenClaw |
|---------|-----------|----------|
| Gmail | Built-in (OAuth) | Skill + API setup |
| Google Calendar | Built-in (OAuth) | Skill + API setup |
| Slack | Built-in (OAuth) | Built-in channel |
| Discord | Built-in (OAuth) | Built-in channel |
| Notion | Built-in (OAuth) | Skill |
| GitHub | Built-in (OAuth) | Skill |
| Linear | Built-in (OAuth or API key) | Skill |
| Jira | Built-in (OAuth) | Skill |
| Figma | Built-in (OAuth) | Skill |
| Salesforce | Built-in (OAuth) | Skill |
| Stripe | Built-in (API key) | Skill |
| WhatsApp | Built-in (OAuth) | Built-in channel |
| Shopify | Built-in (OAuth or API key) | Community skill |
| Total integrations | 40+ built-in | 50+ via skills |

### Setup and Maintenance

| | BrowserOS | OpenClaw |
|---|-----------|----------|
| Installation | Download browser | `npm install openclaw`, run onboarding wizard |
| Runtime | Open the browser | Daemon process (launchd/systemd) |
| Updates | Auto-update | `openclaw update --channel stable` |
| Troubleshooting | Built-in | `openclaw doctor` CLI tool |
| Node.js required | No | Yes (v22+) |
| Terminal required | No | Yes |

## Who Should Use What

<CardGroup cols={2}>
  <Card title="Choose BrowserOS if you..." icon="browser">
    - Want an AI assistant without any technical setup
    - Do most of your work in a browser
    - Need browser automation (filling forms, clicking buttons, extracting data)
    - Want 40+ app integrations that connect with one click
    - Prefer a visual interface over terminal commands
  </Card>
  <Card title="Choose OpenClaw if you..." icon="terminal">
    - Want to message your AI from WhatsApp, Telegram, or Signal
    - Need an always-on agent that runs 24/7 as a background service
    - Are comfortable with Node.js and terminal-based setup
    - Want mobile companion apps for on-the-go access
    - Need agents that can write their own extensions
  </Card>
</CardGroup>

## Using Both Together

BrowserOS and OpenClaw are not mutually exclusive. Some users run OpenClaw as their always-on mobile assistant (accessible through WhatsApp or Telegram) while using BrowserOS as their desktop browser for work that involves web apps, browser automation, and visual tasks. The two tools complement each other rather than compete directly.

---

### Browseros Features Ad Blocking (`docs/browseros/features/ad-blocking.mdx`)

---
title: "Ad Blocking"
description: "BrowserOS supports full ad blocking with uBlock Origin"
---

BrowserOS supports full ad blocking through [uBlock Origin](https://ublockorigin.com/), the most powerful open-source ad blocker available — the full extension, not the watered-down "Lite" version.

## Why BrowserOS?

Chrome [killed support](https://developer.chrome.com/docs/extensions/develop/migrate/mv2-deprecation-timeline) for uBlock Origin by phasing out Manifest V2 extensions. The only option left on Chrome is "uBlock Origin Lite," a significantly weaker version that can't use advanced filtering rules.

**BrowserOS re-enabled full Manifest V2 support**, so you can install and run the original uBlock Origin at full power — the same extension Chrome no longer allows.

<Card title="Install uBlock Origin" icon="shield-check" href="https://chromewebstore.google.com/detail/ublock-origin/cjpalhdlnbpafiamejdnhcphjbkeiagm">
  Install the full uBlock Origin extension from the Chrome Web Store. Works on BrowserOS out of the box.
</Card>

## BrowserOS vs Chrome

We ran both browsers through [adblock.turtlecute.org](https://adblock.turtlecute.org/), a test that measures how effectively a browser blocks ads and tracking scripts.

<CardGroup cols={2}>
  <Card title="BrowserOS — 68%">
    <img src="/images/adblock-browseros.png" alt="BrowserOS blocking 68% of ads" />
  </Card>
  <Card title="Chrome — 7%">
    <img src="/images/adblock-chrome.png" alt="Chrome blocking only 7% of ads" />
  </Card>
</CardGroup>

Out of 133 ad-related requests:
- **BrowserOS** blocked 91 (68%)
- **Chrome** blocked 9 (7%)

That's roughly **10x more protection** with zero configuration.

## What This Means

Fewer ads means faster page loads, less bandwidth usage, and significantly reduced tracking. BrowserOS handles this natively so you can focus on browsing.

---

### Browseros Features Bring Your Own Llm (`docs/browseros/features/bring-your-own-llm.mdx`)

---
title: "Bring Your Own LLM"
description: "Connect your own AI models to BrowserOS"
---

BrowserOS includes a default AI model you can use right away, but it has strict rate limits. For the best experience, bring your own API keys or run models locally.

See how to connect your own LLM in under a minute:

<video
  controls
  className="w-full aspect-video rounded-xl"
  src="https://pub-80f8a01e6e8b4239ae53a7652ef85877.r2.dev/resources/feature-videos/1-bring-your-own-LLM.mov"
></video>

## Use Your Existing Subscription

Already paying for ChatGPT Pro or GitHub Copilot? Connect your existing account to BrowserOS with a single sign-in — no API keys, no extra cost.

<CardGroup cols={2}>
  <Card href="/browseros/features/chatgpt-pro-oauth">
    <svg fill="currentColor" fillRule="evenodd" height="24" width="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M9.205 8.658v-2.26c0-.19.072-.333.238-.428l4.543-2.616c.619-.357 1.356-.523 2.117-.523 2.854 0 4.662 2.212 4.662 4.566 0 .167 0 .357-.024.547l-4.71-2.759a.797.797 0 00-.856 0l-5.97 3.473zm10.609 8.8V12.06c0-.333-.143-.57-.429-.737l-5.97-3.473 1.95-1.118a.433.433 0 01.476 0l4.543 2.617c1.309.76 2.189 2.378 2.189 3.948 0 1.808-1.07 3.473-2.76 4.163zM7.802 12.703l-1.95-1.142c-.167-.095-.239-.238-.239-.428V5.899c0-2.545 1.95-4.472 4.591-4.472 1 0 1.927.333 2.712.928L8.23 5.067c-.285.166-.428.404-.428.737v6.898zM12 15.128l-2.795-1.57v-3.33L12 8.658l2.795 1.57v3.33L12 15.128zm1.796 7.23c-1 0-1.927-.332-2.712-.927l4.686-2.712c.285-.166.428-.404.428-.737v-6.898l1.974 1.142c.167.095.238.238.238.428v5.233c0 2.545-1.974 4.472-4.614 4.472zm-5.637-5.303l-4.544-2.617c-1.308-.761-2.188-2.378-2.188-3.948A4.482 4.482 0 014.21 6.327v5.423c0 .333.143.571.428.738l5.947 3.449-1.95 1.118a.432.432 0 01-.476 0zm-.262 3.9c-2.688 0-4.662-2.021-4.662-4.519 0-.19.024-.38.047-.57l4.686 2.71c.286.167.571.167.856 0l5.97-3.448v2.26c0 .19-.07.333-.237.428l-4.543 2.616c-.619.357-1.356.523-2.117.523zm5.899 2.83a5.947 5.947 0 005.827-4.756C22.287 18.339 24 15.84 24 13.296c0-1.665-.713-3.282-1.998-4.448.119-.5.19-.999.19-1.498 0-3.401-2.759-5.947-5.946-5.947-.642 0-1.26.095-1.88.31A5.962 5.962 0 0010.205 0a5.947 5.947 0 00-5.827 4.757C1.713 5.447 0 7.945 0 10.49c0 1.666.713 3.283 1.998 4.448-.119.5-.19 1-.19 1.499 0 3.401 2.759 5.946 5.946 5.946.642 0 1.26-.095 1.88-.309a5.96 5.96 0 004.162 1.713z"></path></svg>
    **ChatGPT Pro / Plus**

    Sign in with your OpenAI account. Access GPT-5 Codex, GPT-5.4, and the full Codex lineup with up to 400K context.
  </Card>
  <Card href="/browseros/features/github-copilot-oauth">
    <svg fill="currentColor" fillRule="evenodd" height="24" width="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M19.245 5.364c1.322 1.36 1.877 3.216 2.11 5.817.622 0 1.2.135 1.592.654l.73.964c.21.278.323.61.323.955v2.62c0 .339-.173.669-.453.868C20.239 19.602 16.157 21.5 12 21.5c-4.6 0-9.205-2.583-11.547-4.258-.28-.2-.452-.53-.453-.868v-2.62c0-.345.113-.679.321-.956l.73-.963c.392-.517.974-.654 1.593-.654l.029-.297c.25-2.446.81-4.213 2.082-5.52 2.461-2.54 5.71-2.851 7.146-2.864h.198c1.436.013 4.685.323 7.146 2.864zm-7.244 4.328c-.284 0-.613.016-.962.05-.123.447-.305.85-.57 1.108-1.05 1.023-2.316 1.18-2.994 1.18-.638 0-1.306-.13-1.851-.464-.516.165-1.012.403-1.044.996a65.882 65.882 0 00-.063 2.884l-.002.48c-.002.563-.005 1.126-.013 1.69.002.326.204.63.51.765 2.482 1.102 4.83 1.657 6.99 1.657 2.156 0 4.504-.555 6.985-1.657a.854.854 0 00.51-.766c.03-1.682.006-3.372-.076-5.053-.031-.596-.528-.83-1.046-.996-.546.333-1.212.464-1.85.464-.677 0-1.942-.157-2.993-1.18-.266-.258-.447-.661-.57-1.108-.32-.032-.64-.049-.96-.05zm-2.525 4.013c.539 0 .976.426.976.95v1.753c0 .525-.437.95-.976.95a.964.964 0 01-.976-.95v-1.752c0-.525.437-.951.976-.951zm5 0c.539 0 .976.426.976.95v1.753c0 .525-.437.95-.976.95a.964.964 0 01-.976-.95v-1.752c0-.525.437-.951.976-.951zM7.635 5.087c-1.05.102-1.935.438-2.385.906-.975 1.037-.765 3.668-.21 4.224.405.394 1.17.657 1.995.657h.09c.649-.013 1.785-.176 2.73-1.11.435-.41.705-1.433.675-2.47-.03-.834-.27-1.52-.63-1.813-.39-.336-1.275-.482-2.265-.394zm6.465.394c-.36.292-.6.98-.63 1.813-.03 1.037.24 2.06.675 2.47.968.957 2.136 1.104 2.776 1.11h.044c.825 0 1.59-.263 1.995-.657.555-.556.765-3.187-.21-4.224-.45-.468-1.335-.804-2.385-.906-.99-.088-1.875.058-2.265.394zM12 7.615c-.24 0-.525.015-.84.044.03.16.045.336.06.526l-.001.159a2.94 2.94 0 01-.014.25c.225-.022.425-.027.612-.028h.366c.187 0 .387.006.612.028-.015-.146-.015-.277-.015-.409.015-.19.03-.365.06-.526a9.29 9.29 0 00-.84-.044z"></path></svg>
    **GitHub Copilot**

    Sign in with your GitHub account. Access 19+ models including Claude, GPT-5, and Gemini through one subscription.
  </Card>
</CardGroup>

---

## Which Model Should I Use?

| Mode | What works | Recommendation |
|------|------------|----------------|
| **Chat Mode** | Any model, including local | Ollama or Gemini Flash |
| **Agent Mode** | Cloud models only | Claude Opus 4.5, GPT-5, or Kimi K2.5 (open source) |

<Warning>
**Local LLMs aren't powerful for most agentic tasks yet.** They're great for Chat — asking questions about a page, summarizing, etc. But agent tasks need strong reasoning to click the right elements and handle multi-step workflows. Use Claude Opus 4.5, GPT-5, or Kimi K2.5 for agents.
</Warning>

---

## Kimi K2.5 — In Partnership with Moonshot AI

{/* <img src="/images/moonshot-partnership-banner.png" alt="BrowserOS x Moonshot AI" className="rounded-xl" /> */}

BrowserOS has partnered with [Moonshot AI](https://www.kimi.com) to bring **Kimi K2.5** as a first-class provider. Kimi K2.5 is now the **recommended model** in BrowserOS and is set as the default provider.

For a limited time, BrowserOS users get **extended usage limits** powered by Kimi K2.5. This means you can use the AI agent, chat, and other AI-powered features with increased limits at no cost.

<CardGroup cols={2}>
  <Card title="Open Source" icon="code-branch">
    Fully open-source model you can inspect and trust.
  </Card>
  <Card title="Multimodal" icon="image">
    Supports images out of the box, including screenshots and visual context.
  </Card>
  <Card title="Great for Agents" icon="robot">
    Strong reasoning for browser automation, form filling, and multi-step workflows.
  </Card>
  <Card title="Affordable" icon="piggy-bank">
    Excellent agentic performance at a fraction of the cost of other frontier models.
  </Card>
</CardGroup>

<div id="moonshot" />

### Why Kimi K2.5?

Kimi K2.5 offers excellent performance for agentic tasks at a fraction of the cost of other frontier models. It supports images, has a 128,000 token context window, and delivers strong results on browser automation tasks. Combined with BrowserOS's open-source agent framework, this makes for a powerful and affordable AI browsing experience.

### Bring Your Own Kimi API Key

You can also bring your own Kimi API key if you want to use Kimi K2.5 beyond the extended usage period, or if you want your own dedicated limits.

**Get your API key:**
1. Go to [platform.moonshot.ai](https://platform.moonshot.ai) and create an account
2. Navigate to the **API keys** section in your dashboard
3. Click **Create new API key** and copy the key

**Add to BrowserOS:**
1. Go to `chrome://browseros/settings`
2. Click **USE** on the **Moonshot AI** card
3. Enter your API key (it will be encrypted and stored locally on your machine)
4. The model is pre-configured to `kimi-k2.5` with a 128,000 context window
5. Click **Save**

<Tip>
The base URL for the Kimi API (`https://api.moonshot.ai/v1`) is pre-filled automatically when you select the Moonshot AI provider template.
</Tip>

---

## Cloud Providers

Connect to powerful AI models using your API keys. Your keys stay on your machine — requests go directly to the provider.

<AccordionGroup>
  <div id="gemini" />
  <Accordion title="Gemini (Free)" icon="google">
    Gemini Flash is fast and free. Google gives you 20 requests per minute at no cost.

    **Get your API key:**
    1. Go to [aistudio.google.com](https://aistudio.google.com)
    2. Click **Get API key** in the sidebar
    3. Click **Create API key** and copy it

    

    **Add to BrowserOS:**
    1. Go to `chrome://browseros/settings`
    2. Click **USE** on the Gemini card
    3. Set **Model ID** to `gemini-2.5-flash` (or `gemini-2.5-pro`, `gemini-3-pro-preview`, `gemini-3-flash-preview`)
    4. Paste your API key
    5. Check **Supports Images**, set **Context Window** to `1000000`
    6. Click **Save**

    
  </Accordion>

  <div id="claude" />
  <Accordion title="Claude (Best for Agents)" icon="message-bot">
    Claude Opus 4.5 gives the best results for Agent Mode.

    **Get your API key:**
    1. Go to [console.anthropic.com](https://console.anthropic.com/dashboard)
    2. Click **API keys** in the sidebar
    3. Click **Create Key** and copy it

    

    **Add to BrowserOS:**
    1. Go to `chrome://browseros/settings`
    2. Click **USE** on the Anthropic card
    3. Set **Model ID** to `claude-opus-4-5-20251101` (or `claude-sonnet-4-5-20250929`, `claude-haiku-4-5-20251001`)
    4. Paste your API key
    5. Check **Supports Images**, set **Context Window** to `200000`
    6. Click **Save**

    
  </Accordion>

  <div id="openai" />
  <Accordion title="OpenAI" icon="brain">
    GPT-5 is OpenAI's most capable model for both chat and agent tasks.

    **Get your API key:**
    1. Go to [platform.openai.com](https://platform.openai.com)
    2. Click settings icon → **API keys**
    3. Click **Create new secret key** and copy it

    

    **Add to BrowserOS:**
    1. Go to `chrome://browseros/settings`
    2. Click **USE** on the OpenAI card
    3. Set **Model ID** to `gpt-5` (or `gpt-5.2`, `gpt-5-mini`, `gpt-4.1`, `o4-mini`)
    4. Paste your API key
    5. Check **Supports Images**, set **Context Window** to `200000`
    6. Click **Save**

    
  </Accordion>

  <div id="openrouter" />
  <Accordion title="OpenRouter" icon="shuffle">
    Access 500+ models through one API.

    **Get your API key:**
    1. Go to [openrouter.ai](https://openrouter.ai) and sign up
    2. Go to [openrouter.ai/keys](https://openrouter.ai/keys) and create a key

    **Pick a model:**
    Go to [openrouter.ai/models](https://openrouter.ai/models) and copy the model ID you want (e.g., `anthropic/claude-opus-4.5`, `google/gemini-2.5-flash`).

    

    **Add to BrowserOS:**
    1. Go to `chrome://browseros/settings`
    2. Click **USE** on the OpenRouter card
    3. Paste the model ID and your API key
    4. Set **Context Window** based on the model
    5. Click **Save**

    
  </Accordion>

  <div id="azure" />
  <Accordion title="Azure OpenAI" icon="microsoft">
    Use OpenAI models hosted on your own Azure subscription for enterprise compliance and data residency.

    **Prerequisites:**
    1. An Azure subscription with access to [Azure OpenAI Service](https://portal.azure.com/#view/Microsoft_Azure_ProjectOxford/CognitiveServicesHub/~/OpenAI)
    2. A deployed model (e.g., GPT-4o) in your Azure OpenAI resource

    **Get your credentials:**
    1. Go to [portal.azure.com](https://portal.azure.com) → **Azure OpenAI** resource
    2. Navigate to **Keys and Endpoint**
    3. Copy **Key 1** and your **Endpoint URL**

    **Add to BrowserOS:**
    1. Go to `chrome://browseros/settings`
    2. Click **USE** on the Azure card
    3. Set **Base URL** to your Azure endpoint (e.g., `https://your-resource.openai.azure.com/openai/deployments/your-deployment`)
    4. Set **Model ID** to your deployment name
    5. Paste your API key
    6. Check **Supports Images**, set **Context Window** to `128000`
    7. Click **Save**
  </Accordion>

  <div id="bedrock" />
  <Accordion title="AWS Bedrock" icon="aws">
    Access Claude, Llama, and other models through your AWS account with IAM-based authentication.

    **Prerequisites:**
    1. An AWS account with [Amazon Bedrock](https://docs.aws.amazon.com/bedrock/latest/userguide/getting-started.html) enabled
    2. Model access granted in the Bedrock console for your desired models

    **Get your credentials:**
    1. Go to the [AWS Console](https://console.aws.amazon.com) → **IAM**
    2. Create or use an existing access key with Bedrock permissions
    3. Note your **Access Key ID**, **Secret Access Key**, and **Region**

    **Add to BrowserOS:**
    1. Go to `chrome://browseros/settings`
    2. Click **USE** on the AWS Bedrock card
    3. Set **Base URL** to your Bedrock endpoint (region-specific)
    4. Set **Model ID** to the Bedrock model ID (e.g., `anthropic.claude-3-sonnet-20240229-v1:0`)
    5. Paste your credentials
    6. Check **Supports Images**, set **Context Window** to `200000`
    7. Click **Save**
  </Accordion>

  <div id="openai-compatible" />
  <Accordion title="OpenAI Compatible" icon="plug">
    Connect to any provider that implements the OpenAI-compatible API format (e.g., Together AI, Fireworks, Groq, Perplexity).

    **Add to BrowserOS:**
    1. Go to `chrome://browseros/settings`
    2. Click **USE** on the OpenAI Compatible card
    3. Set **Base URL** to the provider's API endpoint
    4. Set **Model ID** to the model you want to use
    5. Paste your API key
    6. Set **Supports Images** and **Context Window** based on the model
    7. Click **Save**

    <Tip>
    Most newer AI providers support the OpenAI-compatible API format. Check your provider's docs for the base URL and available model IDs.
    </Tip>
  </Accordion>
</AccordionGroup>

---

## Local Models

<Card title="Local Model Guide" icon="server" href="/browseros/features/local-models">
  Run AI completely offline with Ollama or LM Studio. Includes recommended models, context length setup, and configuration steps.
</Card>

---

## Switching Between Models

Use the model switcher in the Assistant panel to change providers anytime. The default provider is highlighted.



<Tip>
Use local models for sensitive work data. Switch to Claude for agent tasks that need complex reasoning.
</Tip>

---

### Browseros Features Chatgpt Pro Oauth (`docs/browseros/features/chatgpt-pro-oauth.mdx`)

---
title: "ChatGPT Pro / Plus"
description: "Use your ChatGPT subscription to power BrowserOS"
---

Connect your ChatGPT Pro or Plus subscription to BrowserOS and access GPT-5.5, GPT-5 Codex, GPT-5.4, and the full lineup of OpenAI's most advanced models — with up to 1.05M context. No API keys needed.

## Setup

**1.** Open BrowserOS and go to **Settings** (`chrome://browseros/settings`). You'll see the AI Providers section.



**2.** Click **USE** on the **ChatGPT Plus/Pro** card. You'll be prompted to sign in with your OpenAI account.



**3.** Sign in with the OpenAI account that has your ChatGPT Pro or Plus subscription active, and accept the authorization.



**4.** Once authorized, ChatGPT will appear as a provider in your settings. Select a model and start using it.

## Available Models

| Model | Context Window |
|-------|---------------|
| `gpt-5.5` | 1.05M |
| `gpt-5.4` | 400K |
| `gpt-5.4-mini` | 400K |
| `gpt-5.4-nano` | 400K |
| `gpt-5.3-codex` | 400K |
| `gpt-5.3-codex-spark` | 128K |
| `gpt-5.2-codex` | 400K |
| `gpt-5.2` | 200K |
| `gpt-5.1-codex` | 400K |
| `gpt-5.1-codex-max` | 400K |
| `gpt-5.1-codex-mini` | 400K |
| `gpt-5.1` | 200K |

<Info>
ChatGPT Pro subscribers have access to the full model lineup. ChatGPT Plus subscribers can access a subset of models depending on their plan. The available models will be shown automatically after you connect.
</Info>

<Tip>
The Codex models (e.g., `gpt-5.3-codex`) are optimized for code and reasoning tasks — ideal for complex browser automation workflows that involve form filling, data extraction, and multi-step navigation.
</Tip>

## Reasoning Settings

ChatGPT Pro includes additional settings for models that support reasoning:

- **Reasoning Effort** — Control how much the model "thinks" before responding. Options: none, low, medium, high.
- **Reasoning Summary** — Choose how reasoning is displayed. Options: auto, concise, detailed.

These settings are available in the provider configuration after connecting.

## Disconnecting

To disconnect your OpenAI account, go to **Settings**, find the ChatGPT Plus/Pro provider, and click **Disconnect**. Your OAuth tokens will be immediately deleted from your machine.

---

### Browseros Features Connect Mcps (`docs/browseros/features/connect-mcps.mdx`)

---
title: "Connect Apps"
description: "Connect 40+ apps to BrowserOS so the assistant can work with your email, calendar, projects, and more"
---

Connect your favorite apps to BrowserOS and let the assistant work across all of them. Read emails, check your calendar, create tasks, post messages, manage files, and more, all through natural conversation.

<video
  controls
  className="w-full aspect-video rounded-xl"
  src="https://pub-80f8a01e6e8b4239ae53a7652ef85877.r2.dev/resources/feature-videos/4-MCP.mp4"
></video>

## How It Works

BrowserOS uses the [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) to connect your apps. You do not need to install anything or manage API keys. Just sign in once and the assistant handles the rest.


## Smart App Connection

When you ask the assistant to do something that needs an app you have not connected yet, it shows an interactive card right in the conversation. You can connect the app with one click or choose to skip it. No need to set things up in advance.

<Steps>
  <Step title="You make a request">
    Ask the assistant something like "What's on my calendar today?" or "Send an email to Sarah."
  </Step>
  <Step title="A connection card appears">
    The assistant detects the app is not connected and shows a card explaining why connecting it would help. You get two choices: **Connect** or **Do it manually**.
  </Step>
  <Step title="You connect or skip">
    - **Connect**: Opens a sign-in page. Authorize the app and the assistant continues with full integration access.
    - **Do it manually**: The assistant skips the integration and navigates to the app's website directly using browser automation.
  </Step>
  <Step title="The assistant continues">
    Once connected, the app stays linked for all future conversations. If you chose to skip, the assistant remembers and will not ask again.
  </Step>
</Steps>

{/* <Frame caption="The assistant detects an unconnected app and shows a connection card">
  <img src="/images/connect-apps-smart-connection.png" alt="Smart app connection prompt in chat" />
</Frame> */}

See [Smart Nudges](/browseros/features/smart-nudges#app-connection) for more details on how connection suggestions work.

You can also connect apps ahead of time from the sidebar if you prefer.

## Connect from the Sidebar

<Steps>
  <Step title="Open Connect Apps">
    Click **Connect Apps** in the sidebar.
  </Step>
  <Step title="Add an app">
    Click **Add built-in app** and select the app you want
  </Step>
  <Step title="Sign in">
    Complete the OAuth sign-in when prompted
  </Step>
</Steps>

<Frame caption="Connected apps show a green 'Authenticated' badge">
  <img src="/images/connect-apps-settings.png" alt="Connected Apps settings page" />
</Frame>

## 40+ Supported Apps

BrowserOS connects to over 40 apps across every category you need.

<AccordionGroup>
  <Accordion title="Email" icon="envelope">
    | App | What you can do |
    |-----|----------------|
    | **Gmail** | Send, read, and search emails, manage drafts and labels |
    | **Outlook Mail** | Send, read, and manage emails |
    | **Resend** | Send transactional and marketing emails |
  </Accordion>

  <Accordion title="Calendar and Scheduling" icon="calendar">
    | App | What you can do |
    |-----|----------------|
    | **Google Calendar** | Create events, find free time, manage calendars |
    | **Outlook Calendar** | Schedule meetings, manage events |
    | **Cal.com** | Schedule meetings, manage availability |
  </Accordion>

  <Accordion title="Messaging" icon="comments">
    | App | What you can do |
    |-----|----------------|
    | **Slack** | Post messages, manage channels |
    | **Discord** | Send messages, manage servers |
    | **WhatsApp** | Send messages, manage conversations |
    | **Microsoft Teams** | Chat, meet, and collaborate |
  </Accordion>

  <Accordion title="Development" icon="code">
    | App | What you can do |
    |-----|----------------|
    | **GitHub** | Manage repos, issues, and pull requests |
    | **GitLab** | Manage repos, issues, and merge requests |
    | **Vercel** | Deploy and manage web applications |
    | **Postman** | Test and manage APIs |
    | **Cloudflare** | Manage domains, DNS, and security |
    | **Supabase** | Manage databases and backend services |
  </Accordion>

  <Accordion title="Project Management" icon="list-check">
    | App | What you can do |
    |-----|----------------|
    | **Linear** | Create issues, manage cycles and projects |
    | **Jira** | Create issues, manage sprints |
    | **Asana** | Organize and track team projects |
    | **Monday** | Manage work and team collaboration |
    | **ClickUp** | Manage tasks, projects, and workflows |
  </Accordion>

  <Accordion title="Documents and Productivity" icon="file-lines">
    | App | What you can do |
    |-----|----------------|
    | **Notion** | Create pages, manage databases |
    | **Google Docs** | Create and edit documents |
    | **Google Sheets** | Create and edit spreadsheets |
    | **Google Drive** | Upload, download, and manage files |
    | **Google Forms** | Create and manage forms and surveys |
    | **Confluence** | Create and manage documentation |
    | **Airtable** | Manage bases, tables, and records |
  </Accordion>

  <Accordion title="File Storage" icon="folder-open">
    | App | What you can do |
    |-----|----------------|
    | **Dropbox** | Store and share files |
    | **OneDrive** | Store and sync files with Microsoft |
    | **Box** | Manage and share enterprise files |
  </Accordion>

  <Accordion title="Design" icon="pen-ruler">
    | App | What you can do |
    |-----|----------------|
    | **Figma** | Access and manage design files |
    | **Canva** | Create and manage designs |
  </Accordion>

  <Accordion title="CRM and Marketing" icon="chart-line">
    | App | What you can do |
    |-----|----------------|
    | **Salesforce** | Manage leads, contacts, and opportunities |
    | **HubSpot** | Manage contacts, deals, and marketing |
  </Accordion>

  <Accordion title="E-commerce and Payments" icon="cart-shopping">
    | App | What you can do |
    |-----|----------------|
    | **Shopify** | Manage products, orders, and store |
    | **Stripe** | Manage payments and subscriptions |
  </Accordion>

  <Accordion title="Analytics" icon="chart-bar">
    | App | What you can do |
    |-----|----------------|
    | **PostHog** | Query analytics, manage feature flags |
    | **Mixpanel** | Analyze user behavior and metrics |
  </Accordion>

  <Accordion title="Support" icon="headset">
    | App | What you can do |
    |-----|----------------|
    | **Zendesk** | Manage support tickets and customers |
    | **Intercom** | Manage customer messaging and support |
  </Accordion>

  <Accordion title="Search and AI" icon="magnifying-glass">
    | App | What you can do |
    |-----|----------------|
    | **Brave Search** | Search the web privately |
    | **Exa** | AI-powered semantic web search |
    | **Mem0** | Store and retrieve AI memory |
  </Accordion>

  <Accordion title="Social and Content" icon="share-nodes">
    | App | What you can do |
    |-----|----------------|
    | **LinkedIn** | Post updates, manage connections |
    | **YouTube** | Access video info and transcripts |
    | **WordPress** | Manage websites and blog content |
  </Accordion>
</AccordionGroup>

## Example Prompts

The assistant figures out which apps to use based on what you ask. Just describe what you want in plain language.

<AccordionGroup>
  <Accordion title="Calendar" icon="calendar">
    - What's on my calendar today?
    - Schedule a meeting with Sarah tomorrow at 2pm
    - When is my next meeting with the marketing team?
    - Block off Friday afternoon for focus time
  </Accordion>
  <Accordion title="Email" icon="envelope">
    - Show me unread emails from my manager
    - Draft a reply to the last email from John thanking him for the update
    - Find emails about the Q4 budget from last week
    - Send an email to the team with the meeting notes
  </Accordion>
  <Accordion title="Messaging" icon="hashtag">
    - Post a message to #general saying I'll be out tomorrow
    - What's the latest message in #engineering?
    - Send a DM to Sarah asking if she's free for lunch
    - Summarize what was discussed in #product today
  </Accordion>
  <Accordion title="Project Management" icon="list-check">
    - Create a new Linear issue for the homepage redesign
    - What are my open tasks in Jira?
    - Move the "Launch campaign" task to complete in Asana
    - Add a comment to the latest ClickUp task
  </Accordion>
  <Accordion title="Documents" icon="cube">
    - Add "Review Q4 report" to my Notion tasks database
    - Create a new page in my Projects database for the website redesign
    - What are my open tasks in Notion?
    - Update the status of the "Launch campaign" task to complete
  </Accordion>
</AccordionGroup>

## Cross-App Workflows

The real power of connected apps is combining them in a single request. The assistant can pull data from one app and use it in another without you switching between tabs.

<CardGroup cols={2}>
  <Card title="Email to task" icon="envelope">
    "Find action items in my latest emails and add them to my Notion tasks"
  </Card>
  <Card title="Meeting prep" icon="calendar">
    "Check my calendar for tomorrow, then draft an email to John summarizing what we're meeting about"
  </Card>
  <Card title="Bug triage" icon="bug">
    "Test the checkout flow on our staging site, file a Linear issue if anything is broken, and post a summary to #engineering on Slack"
  </Card>
  <Card title="Sales pipeline" icon="chart-line">
    "Pull my open deals from Salesforce and create a summary spreadsheet in Google Sheets"
  </Card>
  <Card title="Content roundup" icon="newspaper">
    "Check the latest pull requests on our main repo and post a daily summary to #dev-updates on Slack"
  </Card>
  <Card title="Expense tracking" icon="receipt">
    "Find all receipts in my Gmail from this month and organize them in a Google Sheet"
  </Card>
</CardGroup>

## Add a Custom MCP Server

You can connect any MCP-compatible server that exposes an SSE endpoint.

1. Go to **Settings > Connected Apps**
2. Click **Add custom app**
3. Enter your server URL (e.g., `http://localhost:8000/sse`) and give it a name

Custom servers appear alongside built-in apps and work the same way.

<Tip>
MCP has a growing ecosystem of servers. Browse [MCP servers on GitHub](https://github.com/modelcontextprotocol/servers) to find integrations for databases, APIs, and more.
</Tip>

### Connect to OAuth-Protected Remote Servers

Some remote MCP servers (like Atlassian Jira, GitHub, etc.) require OAuth authentication. Use [mcp-remote](https://www.npmjs.com/package/mcp-remote) and [supergateway](https://github.com/supercorp-ai/supergateway) to handle the OAuth flow locally:

```bash
npx -y supergateway --stdio "npx -y mcp-remote https://mcp.atlassian.com/v1/sse" --port 8000
```

A browser window will open to sign in. Once authenticated, add `http://localhost:8000/sse` as a custom MCP in BrowserOS.

<Note>
Keep the terminal running while you use BrowserOS. The local server handles authentication and proxies requests to the remote MCP server.
</Note>

<AccordionGroup>
  <Accordion title="Example: Atlassian Jira" icon="jira" iconType="brands">
    ```bash
    npx -y supergateway --stdio "npx -y mcp-remote https://mcp.atlassian.com/v1/sse" --port 8000
    ```
    Then add `http://localhost:8000/sse` as a custom MCP.
  </Accordion>
  <Accordion title="Example: GitHub" icon="github" iconType="brands">
    ```bash
    npx -y supergateway --stdio "npx -y mcp-remote https://api.githubcopilot.com/mcp/sse" --port 8001
    ```
    Then add `http://localhost:8001/sse` as a custom MCP.
  </Accordion>
</AccordionGroup>

## Privacy and Security

<Columns cols={2}>
  <Card title="Secure OAuth" icon="shield-check">
    All apps use OAuth sign-in. BrowserOS never sees or stores your passwords.
  </Card>
  <Card title="On-demand only" icon="clock">
    Apps are only accessed when you ask. Nothing runs in the background.
  </Card>
  <Card title="You control access" icon="toggle-on">
    Connect or disconnect any app at any time from Settings.
  </Card>
  <Card title="Credentials stay local" icon="lock">
    Your authentication tokens are managed securely and stored locally on your machine.
  </Card>
</Columns>

---

### Browseros Features Cowork (`docs/browseros/features/cowork.mdx`)

---
title: "Cowork"
description: "Give the agent controlled access to local files and commands alongside browser automation"
---

Cowork lets you describe complex tasks and let the agent handle them end-to-end. It combines browser automation with local file operations: research on the web, then save reports directly to your folder. Read code, edit files, run shell commands, and search through your project, all in the same session as your browser tasks.

Here's what it looks like to give the agent access to your local files:

<video
  controls
  className="w-full aspect-video rounded-xl"
  src="https://pub-80f8a01e6e8b4239ae53a7652ef85877.r2.dev/resources/feature-videos/3-filesystem-access.mp4"
></video>

## Why Cowork?

Without Cowork, the agent can only interact with browser tabs. With Cowork enabled, it gains full access to a folder on your machine through 7 filesystem tools:

<CardGroup cols={3}>
  <Card title="Read & write files" icon="file-lines">
    Read documents and data files, write reports, markdown, HTML, and other outputs
  </Card>
  <Card title="Edit files" icon="pen-to-square">
    Make targeted edits to existing files with surgical string replacement
  </Card>
  <Card title="Run commands" icon="terminal">
    Execute shell commands within the sandboxed folder
  </Card>
  <Card title="Search content" icon="magnifying-glass">
    Search file contents with regex or literal patterns across your project
  </Card>
  <Card title="Find files" icon="folder-tree">
    Find files by glob pattern, with smart filtering of build directories
  </Card>
  <Card title="Browse directories" icon="list">
    List directory contents with file sizes, sorted and organized
  </Card>
</CardGroup>

The real power: do both browser automation AND file operations in a single task. Describe what you want, step away, and come back to finished work.

## Setting Up Cowork

<Steps>
  <Step title="Open the Cowork selector">
    Click the **Cowork** dropdown next to the prompt input
  </Step>
  <Step title="Choose a folder">
    Select a recent folder or click **Choose a different folder**
  </Step>
  <Step title="Grant access">
    Allow BrowserOS to access that folder when prompted
  </Step>
</Steps>

<Frame caption="Select a folder for the agent to operate in">
  <img src="/browseros/features/cowork/cowork-selector.png" alt="Select a folder for the agent to operate in" />
</Frame>

The agent is sandboxed to your selected folder. It cannot access files outside of it.

<Note>
Cowork is available in **Agent Mode** only. In Chat Mode, the agent works with browser tabs only.
</Note>

<Tip>
To disable file access, select **No folder** and the agent will work with browser tabs only.
</Tip>

## Filesystem Tools

Cowork provides 7 filesystem tools that the agent can use alongside browser automation:

<AccordionGroup>
  <Accordion title="filesystem_read" icon="file-import">
    Read a file from the filesystem. Returns text content with line numbers, or image data for image files (PNG, JPG, GIF, WEBP, BMP, SVG, ICO). Supports pagination through large files with `offset` and `limit` parameters.

    | Parameter | Type | Description |
    |-----------|------|-------------|
    | `path` | string (required) | File path relative to working directory |
    | `offset` | number (optional) | Starting line number (1-indexed) |
    | `limit` | number (optional) | Max lines to read |

    Responses are capped at 2000 lines or 50KB per request.
  </Accordion>

  <Accordion title="filesystem_write" icon="file-export">
    Create or overwrite a file. Automatically creates parent directories if they don't exist.

    | Parameter | Type | Description |
    |-----------|------|-------------|
    | `path` | string (required) | File path relative to working directory |
    | `content` | string (required) | Complete file content to write |
  </Accordion>

  <Accordion title="filesystem_edit" icon="pen-to-square">
    Make a targeted edit by replacing an exact string match. If the exact match fails, a whitespace-tolerant fuzzy match is attempted. Preserves original line endings (CRLF, CR, LF) and BOM.

    | Parameter | Type | Description |
    |-----------|------|-------------|
    | `path` | string (required) | File path relative to working directory |
    | `old_string` | string (required) | Exact text to find |
    | `new_string` | string (required) | Replacement text |

    Returns a side-by-side diff of the change.
  </Accordion>

  <Accordion title="filesystem_bash" icon="terminal">
    Execute a shell command and return its output. Commands run in `sh`/`bash` on Unix or `cmd` on Windows.

    | Parameter | Type | Description |
    |-----------|------|-------------|
    | `command` | string (required) | Shell command to execute |
    | `timeout` | number (optional) | Timeout in seconds (default: 120) |

    Output is truncated to the last 2000 lines if too large. Returns the exit code on failure.
  </Accordion>

  <Accordion title="filesystem_find" icon="folder-tree">
    Find files matching a glob pattern. Searches recursively while skipping common build directories (`node_modules`, `.git`, `dist`, `build`, `.next`, `coverage`, `__pycache__`, and more).

    | Parameter | Type | Description |
    |-----------|------|-------------|
    | `pattern` | string (required) | Glob pattern (e.g., `*.ts`, `**/*.json`) |
    | `path` | string (optional) | Directory to search (default: working directory) |
    | `limit` | number (optional) | Max results (default: 1000) |

    Returns relative file paths sorted alphabetically.
  </Accordion>

  <Accordion title="filesystem_grep" icon="magnifying-glass">
    Search file contents using regex or literal string matching. Skips binary files and files over 2MB.

    | Parameter | Type | Description |
    |-----------|------|-------------|
    | `pattern` | string (required) | Search pattern (regex by default) |
    | `path` | string (optional) | Directory or file to search |
    | `glob` | string (optional) | Filter files by glob (e.g., `*.ts`) |
    | `ignore_case` | boolean (optional) | Case-insensitive search |
    | `literal` | boolean (optional) | Treat pattern as literal string |
    | `context` | number (optional) | Lines of context around matches |
    | `limit` | number (optional) | Max matches (default: 100) |
  </Accordion>

  <Accordion title="filesystem_ls" icon="list">
    List directory contents. Shows directories first (with trailing `/`), then files with human-readable sizes.

    | Parameter | Type | Description |
    |-----------|------|-------------|
    | `path` | string (optional) | Directory path (default: working directory) |
    | `limit` | number (optional) | Max entries (default: 500) |

    Entries are sorted alphabetically, case-insensitive.
  </Accordion>
</AccordionGroup>

## Try It: Research and Create a Report

With Cowork enabled, try this prompt:

```
Read the top 3 stories on Hacker News, read the comments too, and write an HTML report.
```

The agent will:

<Steps>
  <Step title="Navigate to Hacker News">
    Opens the site and identifies top stories
  </Step>
  <Step title="Read stories and comments">
    Clicks into each story and reads discussion threads
  </Step>
  <Step title="Generate report">
    Creates an HTML report summarizing the findings
  </Step>
  <Step title="Save to folder">
    Writes the report to your selected folder
  </Step>
</Steps>

<Frame caption="Agent researching Hacker News and generating an HTML report">
  <img src="/browseros/features/cowork/cowork-research-example.png" alt="Agent researching Hacker News and generating an HTML report" />
</Frame>

## Example Use Cases

<AccordionGroup>
  <Accordion title="Organize your downloads" icon="folder-tree">
    > Go through my Downloads folder and organize files by type: documents, images, videos, archives.
  </Accordion>
  <Accordion title="Competitive research report" icon="magnifying-glass-chart">
    > Research key trends about [topic] on Reddit, Twitter, and LinkedIn. Create an HTML report with your findings.
  </Accordion>
  <Accordion title="Web scraping to files" icon="spider-web">
    > Visit these 10 product pages, extract the name, price, and description, and save the results as a markdown file.
  </Accordion>
  <Accordion title="Content aggregation" icon="newspaper">
    > Find the top posts from these 5 subreddits today and compile them into a daily digest document.
  </Accordion>
  <Accordion title="Codebase exploration" icon="code">
    > Search my project for all TODO comments, list them with file paths and line numbers, then create a summary markdown file.
  </Accordion>
  <Accordion title="Log analysis" icon="file-lines">
    > Grep through the log files in this folder for errors from the last 24 hours and write a summary of what went wrong.
  </Accordion>
</AccordionGroup>

## Security

<CardGroup cols={3}>
  <Card title="Sandboxed access" icon="box">
    The agent can only access the folder you select. No parent directories, no path traversal.
  </Card>
  <Card title="Revoke anytime" icon="ban">
    Select **No folder** to instantly disable file access
  </Card>
  <Card title="Local only" icon="house-laptop">
    All file operations happen locally on your machine
  </Card>
</CardGroup>

---

### Browseros Features Github Copilot Oauth (`docs/browseros/features/github-copilot-oauth.mdx`)

---
title: "GitHub Copilot"
description: "Use your GitHub Copilot subscription to power BrowserOS"
---

Connect your GitHub Copilot subscription to BrowserOS and access 19+ models — including Claude, GPT-5, and Gemini — through a single GitHub sign-in. No API keys needed.

<Info>
**Free tier** includes GPT-5 Mini, Claude Haiku 4.5, GPT-4o, and GPT-4.1. **Copilot Pro** ($10/month) unlocks Claude Sonnet 4.6, Claude Opus 4.6, Gemini 3 Pro, GPT-5.4, and more.
</Info>

## Setup

**1.** Open BrowserOS and go to **Settings** (`chrome://browseros/settings`). You'll see the AI Providers section.



**2.** Click **USE** on the **GitHub Copilot** card. A device code will appear — copy it, then click the link to open GitHub's device authorization page.



**3.** Select your GitHub account to authorize.



**4.** Paste the device code and authorize BrowserOS to access your Copilot subscription.



**5.** Once authorized, GitHub Copilot will appear as a provider in your settings. Select a model and start using it.

## Available Models

### Free Tier
| Model | Context Window |
|-------|---------------|
| `gpt-5-mini` | 128K |
| `claude-haiku-4.5` | 128K |
| `gpt-4o` | 64K |
| `gpt-4.1` | 64K |

### Copilot Pro / Pro+
| Model | Context Window |
|-------|---------------|
| `claude-sonnet-4.6` | 200K |
| `claude-opus-4.6` | 200K |
| `gemini-2.5-pro` | 1M |
| `gemini-3-pro-preview` | 1M |
| `gpt-5.4` | 400K |
| `gpt-5.3-codex` | 400K |
| `gpt-5.2-codex` | 400K |
| `grok-code-fast-1` | 128K |

<Tip>
GitHub Copilot is the most versatile provider — one subscription gives you access to models from OpenAI, Anthropic, Google, and xAI. Great if you want to switch between models for different tasks.
</Tip>

## Disconnecting

To disconnect your GitHub account, go to **Settings**, find the GitHub Copilot provider, and click **Disconnect**. Your OAuth tokens will be immediately deleted from your machine.

---

### Browseros Features Local Models (`docs/browseros/features/local-models.mdx`)

---
title: "Bring Your Local Model"
description: "Run AI models locally with Ollama or LM Studio for free, private, offline use"
---

BrowserOS works great with local models for Chat Mode. Run models completely offline — your data never leaves your machine.

## Context Length

<Warning>
**Ollama defaults to 4,096 tokens of context — this is too low for BrowserOS.** Below 15K tokens, the context overflows and the agent gets stuck in a loop constantly trying to recover. Only Chat Mode will work at low context lengths. Set at least **15,000–20,000 tokens** for local models to function properly.
</Warning>

Set context length when starting Ollama:

```bash
OLLAMA_CONTEXT_LENGTH=20000 ollama serve
```

<Info>
Increasing context length uses more VRAM. Run `ollama ps` to check your current allocation. See the [Ollama context length docs](https://docs.ollama.com/context-length) for more details.
</Info>

---

## Setup

<Tabs>
  <Tab title="Ollama" icon="terminal">
    The easiest way to run models locally.

    <Steps>
      <Step title="Install Ollama">
        Download from [ollama.com](https://ollama.com) and install it.
      </Step>
      <Step title="Pull a model">
        ```bash
        ollama pull qwen/qwen3-4b
        ```
      </Step>
      <Step title="Start Ollama with higher context">
        ```bash
        OLLAMA_CONTEXT_LENGTH=20000 ollama serve
        ```
      </Step>
      <Step title="Configure in BrowserOS">
        1. Go to `chrome://browseros/settings`
        2. Click **USE** on the Ollama card
        3. Set **Model ID** to `qwen/qwen3-4b`
        4. Set **Context Window** to `20000`
        5. Click **Save**

        
      </Step>
    </Steps>
  </Tab>
  <Tab title="LM Studio" icon="desktop">
    Nice GUI if you don't want to use the terminal.

    <Steps>
      <Step title="Install LM Studio">
        Download from [lmstudio.ai](https://lmstudio.ai) and install it.
      </Step>
      <Step title="Load a model">
        Open LM Studio → **Developer** tab → load a model. It runs a server at `http://localhost:1234/v1/`.

        
      </Step>
      <Step title="Configure in BrowserOS">
        1. Go to `chrome://browseros/settings`
        2. Click **USE** on the **OpenAI Compatible** card
        3. Set **Base URL** to `http://localhost:1234/v1/`
        4. Set **Model ID** to the model you loaded
        5. Set **Context Window** to at least `20000`
        6. Click **Save**

        
      </Step>
    </Steps>
  </Tab>
</Tabs>

---

## Recommended Models

Pick a model based on your available RAM/VRAM. Smaller models are faster but less capable.

### Lightweight (under 5 GB)

Good for machines with 8 GB RAM. Fast responses, suitable for simple chat tasks.

| Model | Publisher | Params | Quant | Size |
|-------|-----------|--------|-------|------|
| `qwen/qwen3-4b` | Qwen | 4B | 4bit | 2.28 GB |
| `mistralai/ministral-3-3b` | Mistral | 3B | Q4_K_M | 2.99 GB |
| `deepseek-r1-distill-qwen-7b` | lmstudio-community | 7B | Q4_K_M | 4.68 GB |
| `deepseek-r1-distill-llama-8b` | lmstudio-community | 8B | Q4_K_M | 4.92 GB |

### Mid-range (10–15 GB)

Needs 16+ GB RAM. Better reasoning, handles longer conversations well.

| Model | Publisher | Params | Quant | Size |
|-------|-----------|--------|-------|------|
| `openai/gpt-oss-20b` | OpenAI | 20B | MXFP4 | 12.11 GB |
| `mistralai/magistral-small` | Mistral | 23.6B | 4bit | 13.28 GB |
| `mistralai/devstral-small-2-2512` | Mistral | 24B | 4bit | 14.12 GB |

### Heavy (60+ GB)

For workstations with 64+ GB RAM. Closest to cloud model quality.

| Model | Publisher | Params | Quant | Size |
|-------|-----------|--------|-------|------|
| `openai/gpt-oss-120b` | OpenAI | 120B | MXFP4 | 63.39 GB |

<Tip>
Start with `qwen/qwen3-4b` if you're unsure — it's small, fast, and surprisingly capable for its size.
</Tip>

---

### Browseros Features Scheduled Tasks (`docs/browseros/features/scheduled-tasks.mdx`)

---
title: "Scheduled Tasks"
description: "Run the BrowserOS agent automatically on a schedule"
---

Scheduled Tasks let you run the BrowserOS agent automatically, whether it is daily, every few hours, or every few minutes. Write a prompt once, set a schedule, and let the agent handle it on autopilot.

Watch how to set up a scheduled task from scratch:

<video
  controls
  className="w-full aspect-video rounded-xl"
  src="https://pub-80f8a01e6e8b4239ae53a7652ef85877.r2.dev/resources/feature-videos/5-scheduled-tasks.mp4"
></video>

## Creating a Scheduled Task

There are two ways to create a scheduled task: from a conversation or from the settings page.

### From a conversation

After the agent completes a task that could run on a schedule, it will suggest scheduling it with an interactive card. You can also ask directly:

- "Schedule this to run every morning"
- "Can this run daily at 8am?"
- "Automate this task"

The agent fills in the task details for you. Just review and confirm. See [Smart Nudges](/browseros/features/smart-nudges#schedule-suggestion) for more details.

### From settings

<Steps>
  <Step title="Open Scheduled Tasks">
    Click **Scheduled Tasks** in the sidebar.
  </Step>
  <Step title="Click New Task">
    Click the **New Task** button to open the creation dialog.
  </Step>
  <Step title="Fill in the details">
    - **Name**: A friendly name for your task
    - **Prompt**: What you want the agent to do (any natural language instruction)
    - **Schedule type**: Daily at a specific time, every N hours, or every N minutes
    - **Enable**: Toggle on to start running immediately
  </Step>
  <Step title="Create and go">
    Click **Create**. The task will run at the next scheduled time automatically.
  </Step>
</Steps>

<img src="/images/features--scheduled-tasks-create.png" alt="Create scheduled task dialog" />

## Schedule Types

<CardGroup cols={3}>
  <Card title="Daily" icon="calendar-day">
    Runs once a day at a specific time you choose (e.g., every morning at 8:00 AM).
  </Card>
  <Card title="Hourly" icon="clock">
    Runs every N hours (e.g., every 2 hours, every 6 hours). Set an interval from 1 to 24 hours.
  </Card>
  <Card title="Minutes" icon="stopwatch">
    Runs every N minutes (e.g., every 15 minutes, every 30 minutes). Set an interval from 1 to 60 minutes.
  </Card>
</CardGroup>

## Example Use Cases

<AccordionGroup>
  <Accordion title="Morning briefing" icon="sun">
    > Every morning at 8am, check my Google Calendar and send me a summary of today's events. For each meeting, do a quick Google search on the attendees and include their LinkedIn summary.
  </Accordion>
  <Accordion title="LinkedIn automation" icon="linkedin" iconType="brands">
    > Every day, go to LinkedIn and accept up to 25 pending connection requests.
  </Accordion>
  <Accordion title="Price monitoring" icon="tag">
    > Check the price of this Amazon item every hour. If it drops below $50, place the order.
  </Accordion>
  <Accordion title="Competitor tracking" icon="chart-line">
    > Every morning at 9am, visit these 5 competitor websites and check for new product announcements or pricing changes. Summarize what is new.
  </Accordion>
  <Accordion title="Social media digest" icon="newspaper">
    > Every evening at 6pm, check the top posts on Hacker News and r/programming. Create a brief summary of the most interesting discussions.
  </Accordion>
  <Accordion title="Cross-app workflow" icon="arrows-rotate">
    > Check my Google Calendar for tomorrow's meetings, then post a summary to my Slack channel, and create a Notion page with prep notes for each meeting.
  </Accordion>
</AccordionGroup>

Your scheduled task prompts can be as complex as you want. If you have [connected apps](/browseros/features/connect-mcps) like Google Calendar, Slack, Notion, or Gmail, your scheduled tasks can work across all of them.

## Viewing Results

When a scheduled task runs, you can see the results in two places:

- **New Tab page**: Results show up right on your new tab
- **Scheduled Tasks page**: View the full run history for each task

<img src="/images/features--scheduled-tasks-results.png" alt="Scheduled task results" />

Each task keeps a history of its last 15 runs. Click on any run to see the full output, including what tools the agent used and what it found.

<img src="/images/features--scheduled-tasks-output.png" alt="Scheduled task output showing a daily news briefing" />

You can also:
- **Test** a task manually without waiting for the next scheduled run
- **Retry** a failed task
- **Cancel** a task that is currently running

## How It Works

<Steps>
  <Step title="Task triggers on schedule">
    BrowserOS uses your browser's built-in alarm system to trigger tasks at the right time. If your laptop was closed at the scheduled time, the task runs as soon as you open BrowserOS again.
  </Step>
  <Step title="Background window opens">
    A hidden browser window opens automatically. The task runs there so it never interrupts whatever you are working on. You will not see anything happen on screen.
  </Step>
  <Step title="Agent executes your prompt">
    The agent runs your prompt with full access to browser automation and any connected apps. It can navigate pages, fill forms, extract data, and interact with your services.
  </Step>
  <Step title="Results are saved">
    When the task finishes, the result is saved and appears on your New Tab page and in the task's run history. The hidden window closes automatically.
  </Step>
</Steps>

<Note>
BrowserOS needs to be open for scheduled tasks to run. Tasks have a 10-minute timeout. If a task takes longer than that, it will be marked as failed and you can retry it.
</Note>

## Cloud Sync

If you are signed in, your scheduled task configurations sync across devices. Create a task on your laptop and it appears on your desktop. Edits sync both ways, and conflicts are resolved automatically using timestamps.

Only the schedule setup syncs (name, prompt, schedule type, and timing). Task run results and output stay on the device where the task ran.

See [Sync to Cloud](/browseros/features/sync-to-cloud) for more details.

## Privacy

<Columns cols={2}>
  <Card title="Runs locally" icon="house-laptop">
    All tasks run on your machine in a hidden browser window. Nothing is sent to external servers.
  </Card>
  <Card title="Full control" icon="toggle-on">
    Enable, disable, edit, or delete any task at any time. You decide what runs and when.
  </Card>
</Columns>

---

### Browseros Features Smart Nudges (`docs/browseros/features/smart-nudges.mdx`)

---
title: "Smart Nudges"
description: "BrowserOS suggests app connections and task scheduling at the right moment"
---

Smart Nudges are context-aware suggestions that appear as interactive cards during a conversation. The agent detects opportunities to connect an app or schedule a task, and shows you a card at the right moment. You decide whether to act on it or skip it.

There are two types of nudges: **App Connection** and **Schedule Suggestion**.

## App Connection

When you ask the agent to do something that involves an external app (like sending an email or checking your calendar), it checks whether that app is connected. If it is not, the agent shows a connection card before starting the task.

<Steps>
  <Step title="You make a request">
    For example: "Send Sarah an email with the meeting notes."
  </Step>
  <Step title="The agent detects an unconnected app">
    Gmail is not connected yet, so the agent cannot send emails through the integration.
  </Step>
  <Step title="A connection card appears">
    The card explains why connecting the app would help and gives you two choices: **Connect** or **Do it manually**.
  </Step>
  <Step title="You choose">
    - **Connect**: Opens a sign-in page for the app. Once you authorize, the agent continues with full integration access.
    - **Do it manually**: The agent skips the integration and uses browser automation instead (navigates to the website directly).
  </Step>
</Steps>

### What happens after you choose

<CardGroup cols={2}>
  <Card title="Connected" icon="circle-check">
    The app is added to your connected list. The agent uses the integration for this and all future conversations. You can manage connected apps in [Connect Apps](/browseros/features/connect-mcps).
  </Card>
  <Card title="Declined" icon="forward">
    The agent remembers your choice and will not ask about this app again. It uses browser automation to complete the task instead.
  </Card>
</CardGroup>

<Tip>
If you declined an app but change your mind later, you can connect it anytime from the [Connect Apps](/browseros/features/connect-mcps) settings page.
</Tip>

### Supported apps

The agent can suggest connections for all 40+ built-in integrations, including Gmail, Google Calendar, Slack, Notion, GitHub, Linear, Jira, Figma, Salesforce, and many more. See [Connect Apps](/browseros/features/connect-mcps) for the full list.

## Schedule Suggestion

After the agent completes a task that could run on a recurring schedule, it shows a scheduling card. This helps you turn one-time tasks into automated routines without leaving the conversation.

<Steps>
  <Step title="The agent completes a task">
    For example: "Here are the top 5 tech headlines from today."
  </Step>
  <Step title="The agent recognizes a schedulable task">
    News gathering, price monitoring, report building, data tracking, and similar tasks that do not need your real-time input are good candidates.
  </Step>
  <Step title="A scheduling card appears">
    The card suggests a name and schedule. For example: "Run this automatically? 'Morning News Briefing' - daily at 09:00."
  </Step>
  <Step title="You choose">
    - **Schedule this task**: Opens the Scheduled Tasks page with the details pre-filled. Review and confirm to create the task.
    - **Maybe later**: Dismisses the card. You can always create the scheduled task manually later.
  </Step>
</Steps>

### You can also ask directly

You do not have to wait for the agent to suggest it. Just tell the agent you want to schedule the task:

<AccordionGroup>
  <Accordion title="Example prompts" icon="message">
    - "Schedule this to run every morning"
    - "Can this run daily at 8am?"
    - "Automate this task"
    - "Run this every hour"

    The agent will infer the task name, schedule type, and timing from your conversation and show the scheduling card immediately.
  </Accordion>
</AccordionGroup>

### What gets scheduled

The scheduling card pre-fills the [Scheduled Tasks](/browseros/features/scheduled-tasks) dialog with:

- **Task name**: A short description based on the conversation
- **Prompt**: The original query you asked the agent
- **Schedule type**: Daily or hourly, based on what makes sense for the task
- **Time**: A suggested time (for daily tasks)

You can adjust any of these before confirming.

## When Nudges Appear

Nudges are designed to appear at the right moment without interrupting your workflow:

| Nudge | When it appears | How often |
|---|---|---|
| App Connection | Before the agent starts working, when it detects an unconnected app | Once per app per conversation |
| Schedule Suggestion | After the agent finishes a task that could be automated | Once per conversation |

Nudges do not appear in:
- **Scheduled tasks** running in the background
- **Chat mode** (read-only, no browser automation)

## Privacy

<CardGroup cols={2}>
  <Card title="Nothing is sent without your approval" icon="shield-check">
    The agent only suggests a connection. No data is shared with the app until you explicitly authorize it.
  </Card>
  <Card title="Your choices are remembered locally" icon="hard-drive">
    Declined apps are stored on your device. The agent will not ask about them again unless you reconnect from settings.
  </Card>
</CardGroup>

---

### Browseros Features Sync To Cloud (`docs/browseros/features/sync-to-cloud.mdx`)

---
title: "Sync to Cloud"
description: "Sign in to sync your conversations, settings, and automations across all your devices"
---

Sign in to BrowserOS and your data follows you everywhere. Your conversations, AI model settings, and scheduled tasks sync automatically to the cloud so you never lose your setup.

## Why Sign In?

Without an account, everything stays on one device. Sign in and your data is backed up and available wherever you use BrowserOS.

<CardGroup cols={2}>
  <Card title="Access anywhere" icon="laptop-mobile">
    Open BrowserOS on a new device and your conversations, model settings, and scheduled tasks are already there.
  </Card>
  <Card title="Never lose your history" icon="clock-rotate-left">
    Chat history is saved to the cloud automatically. Clear your browser data or switch machines and everything is still available.
  </Card>
  <Card title="Settings follow you" icon="sliders">
    Set up your AI models once. Your provider configurations sync across devices so you never re-enter the same setup twice.
  </Card>
  <Card title="Automations stay in sync" icon="arrows-rotate">
    Create a scheduled task on your laptop and it appears on your desktop. Edits sync both ways.
  </Card>
</CardGroup>

## How to Sign In

<Steps>
  <Step title="Open a new tab">
    Open a new tab in BrowserOS to see the home page.
  </Step>
  <Step title="Click Sign In">
    Click **Sign In** in the sidebar to open the login page.
  </Step>
  <Step title="Choose your sign-in method">
    Enter your email for a magic link, or sign in with Google.
  </Step>
  <Step title="Verify and you're in">
    Click the link in your email (or complete Google sign-in). BrowserOS starts syncing your data immediately.
  </Step>
</Steps>

<Tip>
Magic link sign-in means you never need to create or remember a password. Just enter your email and click the link.
</Tip>

## What Gets Synced

<AccordionGroup>
  <Accordion title="Conversations" icon="messages">
    Your full chat history syncs to the cloud as you go. Every message is saved in real time so you can pick up any conversation on another device. Locally, BrowserOS keeps your 50 most recent conversations. In the cloud, there is no limit.
  </Accordion>

  <Accordion title="AI model settings" icon="microchip">
    Your configured LLM providers (OpenAI, Anthropic, Google, Moonshot, Azure, Bedrock, and others) sync across devices. This includes the model name, provider type, base URL, temperature, and context window settings.

    **Your API keys are never synced.** Sensitive credentials like API keys, access keys, and session tokens stay on the device where you entered them. You will need to re-enter API keys on each new device.
  </Accordion>

  <Accordion title="Scheduled tasks" icon="calendar-check">
    Your scheduled task configurations sync in both directions. Create a task on one device, edit it on another, and changes are merged automatically using timestamps to resolve conflicts. Only the schedule setup syncs (name, prompt, schedule type, and timing). Task run results and output stay on the device where the task ran.
  </Accordion>

  <Accordion title="Profile" icon="user">
    Your name, profile picture, and account preferences sync across devices. Information you provide during onboarding (role, company) is also saved to your profile.
  </Accordion>
</AccordionGroup>

## What Stays Local

Some settings are device-specific and do not sync to the cloud:

- **API keys and secrets** for LLM providers
- **Theme** (light/dark mode)
- **Workspace folder** selection
- **Connected MCP servers**
- **Scheduled task results** (run output stays on the device where the task ran)

This is intentional. Sensitive credentials never leave your device, and display preferences can differ between machines.

## How Sync Works

BrowserOS uses a local-first approach. Your data is always saved on your device first, then synced to the cloud in the background.

<Steps>
  <Step title="Local save">
    Every action (sending a message, adding a provider, creating a task) is saved locally first. BrowserOS works fully offline.
  </Step>
  <Step title="Background sync">
    When you are signed in, changes are automatically pushed to the cloud. New chat messages sync in real time. Provider and task changes sync whenever they are updated.
  </Step>
  <Step title="Restore on new devices">
    When you sign in on a new device, BrowserOS pulls your conversations, model settings, scheduled tasks, and profile from the cloud and merges them with any local data.
  </Step>
</Steps>

<Note>
If the same scheduled task is edited on two devices before they sync, BrowserOS keeps the version with the most recent timestamp.
</Note>

## Security

<Columns cols={2}>
  <Card title="API keys never leave your device" icon="key">
    Sensitive credentials like API keys, access keys, and tokens are excluded from cloud sync entirely.
  </Card>
  <Card title="Session-based authentication" icon="shield-check">
    Sign-in uses magic links or Google OAuth. No passwords are stored.
  </Card>
  <Card title="Scoped to your account" icon="lock">
    All synced data is tied to your user account and is not accessible to anyone else.
  </Card>
  <Card title="Sync failures are silent" icon="wifi-slash">
    If cloud sync fails (e.g., no internet), your local data is unaffected. Sync resumes automatically when connectivity is restored.
  </Card>
</Columns>

---

### Browseros Features Use With Claude Code (`docs/browseros/features/use-with-claude-code.mdx`)

---
title: "MCP Clients (Claude Code, OpenClaw)"
description: "Control your browser and 40+ apps from Claude Code, OpenClaw, Gemini CLI, or any MCP client"
---

BrowserOS is the best browser for AI coding agents. It comes with a built-in MCP server that gives your AI agent **full browser control** and **direct access to 40+ external services** — Gmail, Slack, GitHub, Google Calendar, Linear, Notion, and more — all through a single MCP connection.

<Note>
Unlike Chrome DevTools MCP which requires setting up debug profiles and running separate servers, BrowserOS MCP works out of the box. Just copy the URL from settings and connect.
</Note>

## Why Use BrowserOS with Claude Code?

<CardGroup cols={2}>
  <Card title="Agentic Coding" icon="code">
    Claude tests your web app, reads console errors, and fixes the code — all in one loop.
  </Card>
  <Card title="40+ App Integrations" icon="grid-2">
    Gmail, Slack, GitHub, Jira, Notion, Google Sheets, and more — accessible directly from your AI agent.
  </Card>
  <Card title="Data Extraction" icon="download">
    Extract your LinkedIn profile, tweets, or any authenticated page content.
  </Card>
  <Card title="Task Automation" icon="repeat">
    Fill forms, navigate multi-step workflows, and automate repetitive browser tasks.
  </Card>
  <Card title="53+ MCP Tools" icon="wrench">
    Full browser control: tabs, navigation, clicks, typing, screenshots, bookmarks, history, tab groups, and window management.
  </Card>
  <Card title="Zero Config Auth" icon="lock">
    Connect external services via OAuth — credentials are managed securely, never stored in BrowserOS.
  </Card>
</CardGroup>

<Tip>
Wondering how BrowserOS MCP compares to Chrome DevTools MCP or other browser automation tools? See our [detailed feature comparison](/browseros/comparisons/chrome-devtools-mcp) covering 53 browser tools, 40+ app integrations, and why BrowserOS MCP gives developers more out of the box.
</Tip>

## Getting Started

<Steps>
  <Step title="Open BrowserOS Settings">
    Navigate to `chrome://browseros/mcp` or click **Settings** → **BrowserOS as MCP** in the sidebar.
  </Step>
  <Step title="Copy the MCP URL">
    Copy the Server URL shown on the page (e.g., `http://127.0.0.1:9239/mcp`).

    <img src="/images/features--browseros-mcp-settings.png" alt="BrowserOS MCP settings page showing Server URL" />
  </Step>
  <Step title="Connect your MCP client">
    Use the tabs below to connect your preferred client.
  </Step>
</Steps>

<Tabs>
  <Tab title="Claude Code">
    Add BrowserOS to Claude Code:
    ```bash
    claude mcp add --transport http browseros <mcp_url> --scope user
    # Example: claude mcp add --transport http browseros http://127.0.0.1:9239/mcp --scope user
    ```

    Start Claude Code and try it:
    ```bash
    claude
    > Open amazon.com in BrowserOS
    ```

    <Tip>
    Run `claude --dangerously-skip-permissions` to skip confirmation prompts for each browser action.
    </Tip>

    To remove later:
    ```bash
    claude mcp remove browseros --scope user
    ```
  </Tab>
  <Tab title="Gemini CLI">
    Add BrowserOS to Gemini CLI:
    ```bash
    gemini mcp add local-server <mcp_url> --transport http --scope user
    # Example: gemini mcp add local-server http://127.0.0.1:9239/mcp --transport http --scope user
    ```
  </Tab>
  <Tab title="Codex">
    Add BrowserOS to OpenAI Codex CLI:
    ```bash
    codex mcp add browseros <mcp_url> --transport http
    # Example: codex mcp add browseros http://127.0.0.1:9239/mcp --transport http
    ```
  </Tab>
  <Tab title="OpenClaw">
    Add BrowserOS to [OpenClaw](https://openclaw.ai/) by adding it to the `mcpServers` section in your `openclaw.json` config file:
    ```json
    {
      "mcpServers": {
        "browseros": {
          "url": "http://127.0.0.1:9239/mcp"
        }
      }
    }
    ```

    Replace the URL with your BrowserOS MCP URL from settings.
  </Tab>
  <Tab title="Claude Desktop">
    Open your Claude Desktop config file:
    ```
    ~/Library/Application Support/Claude/claude_desktop_config.json
    ```

    Add BrowserOS:
    ```json
    {
      "mcpServers": {
        "browseros": {
          "command": "npx",
          "args": ["mcp-remote", "http://127.0.0.1:9239/mcp"]
        }
      }
    }
    ```

    <Warning>
    Do not add BrowserOS to `claude_desktop_config.json` as a raw `{ "url": "..." }` entry. Claude Desktop local config expects a command wrapper here, so use `npx mcp-remote <mcp_url>`.
    </Warning>

    Restart Claude Desktop to connect.
  </Tab>
</Tabs>

## Connect from a Remote Machine

The BrowserOS MCP server only listens on `127.0.0.1`, so by default only programs on the same computer can reach it. If your agent runs somewhere else — for example a [Hermes](https://github.com/NousResearch) or OpenClaw agent on a VPS controlling BrowserOS on your laptop — you need a reverse tunnel that forwards requests from the remote machine to the MCP server on your laptop.

<Warning>
Anyone who can reach this URL has full control of your browser, including every account you are signed into. Prefer a private tunnel like Tailscale over a public URL, and treat public tunnel URLs like passwords.
</Warning>

All commands below use port `9239` — replace it with the port shown on your `chrome://browseros/mcp` settings page.

<Tabs>
  <Tab title="Tailscale (recommended)">
    Tailscale puts your laptop and VPS on a private network, so the MCP server is never exposed to the public internet and the URL never changes.

    1. Install [Tailscale](https://tailscale.com/download) on both your laptop and the VPS, and sign in to the same tailnet on both.
    2. On the laptop, share the MCP port with your tailnet:
    ```bash
    tailscale serve --bg 9239
    ```
    3. Tailscale prints an HTTPS URL like `https://your-laptop.tailnet-name.ts.net`. On the VPS, point your agent at that URL with the `/mcp` path:
    ```bash
    claude mcp add --transport http browseros https://your-laptop.tailnet-name.ts.net/mcp --scope user
    ```

    Run `tailscale serve reset` on the laptop to stop sharing.
  </Tab>
  <Tab title="Cloudflare Tunnel">
    On the laptop, start a quick tunnel:
    ```bash
    cloudflared tunnel --url http://127.0.0.1:9239
    ```

    Cloudflare prints a URL like `https://random-words.trycloudflare.com`. On the VPS, connect your agent to `https://random-words.trycloudflare.com/mcp`.

    <Warning>
    Quick tunnels are public and unauthenticated — anyone who discovers the URL can control your browser. The URL also changes every time `cloudflared` restarts, so you must update your agent config after each restart. For anything long-running, use a [named tunnel](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/) with Cloudflare Access in front, or use Tailscale instead.
    </Warning>
  </Tab>
  <Tab title="ngrok">
    On the laptop, start a tunnel:
    ```bash
    ngrok http 9239
    ```

    ngrok prints a URL like `https://abc123.ngrok-free.app`. On the VPS, connect your agent to `https://abc123.ngrok-free.app/mcp`.

    <Warning>
    The URL is public — anyone who discovers it can control your browser — and it changes every time ngrok restarts unless you use a reserved domain. Use Tailscale instead for anything long-running.
    </Warning>
  </Tab>
</Tabs>

<Note>
The connection only works while your laptop is awake, BrowserOS is running, and the tunnel process is alive. If a remote agent that was working suddenly stops connecting, check those three first — and if you use ngrok or a Cloudflare quick tunnel, remember the URL rotates on every restart, so your agent may be pointing at a dead URL. Tailscale avoids this because its hostnames are stable.
</Note>

## Example Prompts

<Accordion title="Try these prompts once connected" icon="message">
  Extract structured data from any page you're logged into — no scraping setup needed.
  ```
  Open my LinkedIn profile in BrowserOS and extract my work experience as JSON
  ```

  Test your web app end-to-end without leaving the terminal — Claude navigates, interacts, and reports errors back.
  ```
  In BrowserOS, go to localhost:3000, click the login button, and check for console errors
  ```

  Capture visual snapshots of any page for debugging, documentation, or design review.
  ```
  Take a screenshot of the current page in BrowserOS and save it to screenshots/
  ```

  Search through your real browsing history to find pages you visited earlier.
  ```
  Search my BrowserOS history for "invoice" and list the recent matches
  ```

  Access your email directly from the agent — read, search, and summarize without switching windows.
  ```
  Read my latest Gmail messages and summarize them
  ```

  Chain multiple services together in a single prompt — file issues, notify your team, and stay in flow.
  ```
  Create a Linear issue for the bug I just found and post a summary to Slack
  ```
</Accordion>

---

## Browser Automation Tools

BrowserOS exposes **53 browser automation tools** to MCP clients, organized into the following categories:

<AccordionGroup>
  <Accordion title="Navigation & Tabs (8 tools)" icon="window-restore">
    | Tool | Description |
    |------|-------------|
    | `get_active_page` | Get the currently focused page/tab |
    | `list_pages` | List all open pages with title, URL, and tab ID |
    | `navigate_page` | Navigate to a URL, or go back/forward/reload |
    | `new_page` | Open a new tab (with optional background/hidden mode) |
    | `new_hidden_page` | Open a hidden tab for background automation |
    | `show_page` | Restore a hidden page to visible state |
    | `move_page` | Move a tab to a different window or position |
    | `close_page` | Close a tab |
  </Accordion>

  <Accordion title="Content & Observation (8 tools)" icon="eye">
    | Tool | Description |
    |------|-------------|
    | `take_snapshot` | Get accessibility tree with interactive element IDs |
    | `take_enhanced_snapshot` | Detailed accessibility tree with structural context |
    | `get_page_content` | Extract page as clean Markdown (headers, links, tables) |
    | `get_page_links` | Extract all links from a page with deduplication |
    | `get_dom` | Get raw HTML DOM with optional CSS selector scoping |
    | `search_dom` | Search DOM by text, CSS selector, or XPath |
    | `take_screenshot` | Capture page screenshot (PNG/JPEG/WebP, full-page option) |
    | `evaluate_script` | Execute JavaScript in the page context |
  </Accordion>

  <Accordion title="Interaction & Input (14 tools)" icon="hand-pointer">
    | Tool | Description |
    |------|-------------|
    | `click` | Click an element by ID from snapshot |
    | `click_at` | Click at specific X,Y coordinates |
    | `hover` | Hover over an element |
    | `focus` | Focus an element (scrolls into view) |
    | `fill` | Type text into an input (with optional clear) |
    | `clear` | Clear text from input/textarea |
    | `check` | Check a checkbox or radio button |
    | `uncheck` | Uncheck a checkbox |
    | `select_option` | Select a dropdown option by value or text |
    | `press_key` | Press a key or key combination (Enter, Ctrl+A, etc.) |
    | `drag` | Drag an element to another element or coordinates |
    | `scroll` | Scroll page or element (up/down/left/right) |
    | `upload_file` | Upload files to a file input element |
    | `handle_dialog` | Accept or dismiss JavaScript dialogs |
  </Accordion>

  <Accordion title="File & Export (3 tools)" icon="file-export">
    | Tool | Description |
    |------|-------------|
    | `save_pdf` | Print current page to a PDF file |
    | `save_screenshot` | Capture and save a screenshot to disk |
    | `download_file` | Click an element to trigger a download and save it |
  </Accordion>

  <Accordion title="Window Management (5 tools)" icon="window-maximize">
    | Tool | Description |
    |------|-------------|
    | `list_windows` | List all browser windows |
    | `create_window` | Create a new browser window |
    | `create_hidden_window` | Create a hidden window for background tasks |
    | `close_window` | Close a window by ID |
    | `activate_window` | Focus and activate a window |
  </Accordion>

  <Accordion title="Tab Groups (5 tools)" icon="layer-group">
    | Tool | Description |
    |------|-------------|
    | `list_tab_groups` | List all tab groups |
    | `group_tabs` | Create a tab group with optional title and color |
    | `update_tab_group` | Update group title, color, or collapsed state |
    | `ungroup_tabs` | Remove tabs from groups |
    | `close_tab_group` | Close a group and all its tabs |
  </Accordion>

  <Accordion title="Bookmarks (6 tools)" icon="bookmark">
    | Tool | Description |
    |------|-------------|
    | `get_bookmarks` | List all bookmarks |
    | `create_bookmark` | Create a bookmark or folder |
    | `remove_bookmark` | Delete a bookmark or folder |
    | `update_bookmark` | Update bookmark title or URL |
    | `move_bookmark` | Move a bookmark to a different folder |
    | `search_bookmarks` | Search bookmarks by title or URL |
  </Accordion>

  <Accordion title="History (4 tools)" icon="clock-rotate-left">
    | Tool | Description |
    |------|-------------|
    | `search_history` | Search browser history by text query |
    | `get_recent_history` | Get the most recent history items |
    | `delete_history_url` | Delete a specific URL from history |
    | `delete_history_range` | Delete history within a time range |
  </Accordion>
</AccordionGroup>

---

## 40+ External App Integrations

BrowserOS connects your AI agent directly to the tools you already use — no separate MCP servers to install or configure. Everything is accessible through the same BrowserOS MCP connection.

### How It Works

<Steps>
  <Step title="Agent calls an external service tool">
    Your AI agent calls a tool like `gmail_search_messages` through the BrowserOS MCP.
  </Step>
  <Step title="OAuth login (first time only)">
    If this is your first time using that service, BrowserOS opens an OAuth login page in the browser. Log in and authorize access.
  </Step>
  <Step title="Tool executes and returns results">
    Once authenticated, the tool runs and returns results to your agent. Future calls to the same service work automatically — no re-authentication needed.
  </Step>
</Steps>

<Note>
Your credentials are managed securely via OAuth and are **never stored in BrowserOS**. Tokens are refreshed transparently, and you can revoke access at any time from the service provider.
</Note>

### Supported Services

<AccordionGroup>
  <Accordion title="Email" icon="envelope">
    | Service | What you can do |
    |---------|----------------|
    | **Gmail** | Send, read, search emails, manage drafts and labels |
    | **Outlook Mail** | Send, read, and manage emails |
    | **Resend** | Send transactional and marketing emails |
  </Accordion>

  <Accordion title="Calendar & Scheduling" icon="calendar">
    | Service | What you can do |
    |---------|----------------|
    | **Google Calendar** | Create events, find free time, manage calendars |
    | **Outlook Calendar** | Schedule meetings, manage events |
    | **Cal.com** | Schedule meetings, manage availability |
  </Accordion>

  <Accordion title="Communication" icon="comments">
    | Service | What you can do |
    |---------|----------------|
    | **Slack** | Post messages, manage channels |
    | **Discord** | Send messages, manage servers |
    | **WhatsApp** | Send messages, manage conversations |
    | **Microsoft Teams** | Chat, meet, and collaborate |
  </Accordion>

  <Accordion title="Development" icon="code">
    | Service | What you can do |
    |---------|----------------|
    | **GitHub** | Manage repos, issues, and pull requests |
    | **GitLab** | Manage repos, issues, and merge requests |
    | **Vercel** | Deploy and manage web applications |
    | **Postman** | Test and manage APIs |
    | **Cloudflare** | Manage domains, DNS, and security |
    | **Supabase** | Manage databases and backend services |
  </Accordion>

  <Accordion title="Project Management" icon="list-check">
    | Service | What you can do |
    |---------|----------------|
    | **Linear** | Create issues, manage cycles and projects |
    | **Jira** | Create issues, manage sprints |
    | **Asana** | Organize and track team projects |
    | **Monday** | Manage work and team collaboration |
    | **ClickUp** | Manage tasks, projects, and workflows |
  </Accordion>

  <Accordion title="Productivity & Docs" icon="file-lines">
    | Service | What you can do |
    |---------|----------------|
    | **Notion** | Create pages, manage databases |
    | **Google Docs** | Create and edit documents |
    | **Google Sheets** | Create and edit spreadsheets |
    | **Google Drive** | Upload, download, and manage files |
    | **Google Forms** | Create and manage forms and surveys |
    | **Confluence** | Create and manage documentation |
    | **Airtable** | Manage bases, tables, and records |
  </Accordion>

  <Accordion title="File Storage" icon="folder-open">
    | Service | What you can do |
    |---------|----------------|
    | **Dropbox** | Store and share files |
    | **OneDrive** | Store and sync files with Microsoft |
    | **Box** | Manage and share enterprise files |
  </Accordion>

  <Accordion title="Design" icon="pen-ruler">
    | Service | What you can do |
    |---------|----------------|
    | **Figma** | Access and manage design files |
    | **Canva** | Create and manage designs |
  </Accordion>

  <Accordion title="CRM & Marketing" icon="chart-line">
    | Service | What you can do |
    |---------|----------------|
    | **Salesforce** | Manage leads, contacts, and opportunities |
    | **HubSpot** | Manage contacts, deals, and marketing |
  </Accordion>

  <Accordion title="E-commerce & Payments" icon="cart-shopping">
    | Service | What you can do |
    |---------|----------------|
    | **Shopify** | Manage products, orders, and store |
    | **Stripe** | Manage payments and subscriptions |
  </Accordion>

  <Accordion title="Analytics" icon="chart-bar">
    | Service | What you can do |
    |---------|----------------|
    | **PostHog** | Query analytics, manage feature flags |
    | **Mixpanel** | Analyze user behavior and metrics |
  </Accordion>

  <Accordion title="Support" icon="headset">
    | Service | What you can do |
    |---------|----------------|
    | **Zendesk** | Manage support tickets and customers |
    | **Intercom** | Manage customer messaging and support |
  </Accordion>

  <Accordion title="Search & AI" icon="magnifying-glass">
    | Service | What you can do |
    |---------|----------------|
    | **Brave Search** | Search the web privately |
    | **Exa** | AI-powered semantic web search |
    | **Mem0** | Store and retrieve AI memory |
  </Accordion>

  <Accordion title="Social" icon="share-nodes">
    | Service | What you can do |
    |---------|----------------|
    | **LinkedIn** | Post updates, manage connections |
    | **YouTube** | Access video info and transcripts |
    | **WordPress** | Manage websites and blog content |
  </Accordion>
</AccordionGroup>

---

## Demo Videos

### Agentic coding workflow
[](https://youtu.be/vcSxzIIkg_0)

### Browser automation with Claude Code
[](https://youtu.be/rPFx_Btajj0)

---

### Browseros Features Vertical Tabs (`docs/browseros/features/vertical-tabs.mdx`)

---
title: "Vertical Tabs"
description: "Move your tabs to the side for a cleaner, more organized browsing experience"
---

BrowserOS supports vertical tabs — a side panel that lists all your open tabs along the left edge of the browser window. Instead of shrinking tab titles into a cramped horizontal strip, vertical tabs give each tab its own full-width row so you can read titles at a glance, even with dozens of tabs open.

## Why Vertical Tabs?

Modern screens are wide, not tall. A horizontal tab bar wastes vertical space you could use for content, and tabs quickly become unreadable as they shrink. Vertical tabs solve both problems:

<CardGroup cols={2}>
  <Card title="Read every tab title" icon="text">
    Tabs stack vertically with full-width labels, so you always know what is open — no squinting at favicons.
  </Card>
  <Card title="Handle many tabs" icon="layer-group">
    Open 30, 50, or 100 tabs without the strip becoming unusable. The side panel scrolls naturally.
  </Card>
  <Card title="Reclaim vertical space" icon="arrows-left-right">
    The horizontal tab bar disappears, giving web pages more room on widescreen monitors.
  </Card>
  <Card title="Stay organized" icon="folder-tree">
    Combine vertical tabs with tab groups to visually separate work, research, and personal browsing.
  </Card>
</CardGroup>

## Enabling Vertical Tabs

Toggle vertical tabs on or off from the Customization settings page.

<Steps>
  <Step title="Open Settings">
    Go to `chrome://browseros/settings` in the address bar.
  </Step>
  <Step title="Go to Customization">
    In the left sidebar, select **Customization**.
  </Step>
  <Step title="Toggle Use Vertical Tabs">
    Flip the **Use Vertical Tabs** switch to on. The browser immediately moves your tabs to a side panel.
  </Step>
</Steps>

<Frame caption="Enable vertical tabs in Settings > Customization">
  <img src="/images/features--vertical-tabs-setting.png" alt="Vertical tabs toggle in BrowserOS Customization settings" />
</Frame>

To switch back, return to the same setting and turn the toggle off. Your tabs move back to the horizontal strip instantly.

## How It Works

When vertical tabs are enabled, the tab strip relocates from the top of the window to a collapsible side panel on the left. Each tab is displayed as a row showing the page favicon and full title.

- **Click** a tab row to switch to it.
- **Right-click** a tab for the standard context menu (pin, mute, close, move to group).
- **Drag** tabs up or down to reorder them, or drag them into and out of tab groups.
- The panel can be **collapsed** to show only favicons, freeing up even more horizontal space.

## Vertical Tabs + Tab Groups

Vertical tabs pair naturally with tab groups. Groups appear as collapsible sections in the side panel, making it easy to keep projects separate and fold away tabs you are not actively using.

---

### Browseros Integrations N8n (`docs/browseros/integrations/n8n.mdx`)

---
title: "n8n Integration"
description: "Build AI workflows that control your browser"
---

Connect BrowserOS to n8n to build automated workflows. Your n8n AI agents can control the browser—open pages, click buttons, extract data, and fill forms.

## What You Can Build

- **Lead enrichment** — Pull a list of LinkedIn URLs from a spreadsheet and scrape each profile
- **Price monitoring** — Check product prices hourly and send a Slack alert when they drop
- **Form automation** — Auto-fill job applications using data from your CRM
- **Data extraction** — Scrape authenticated pages that require login

## Prerequisites

Before you start:
- BrowserOS running with MCP server enabled (Settings → BrowserOS as MCP)
- n8n running locally (`npx n8n` or install globally with `npm install n8n`)

## Setup

### 1. Install the MCP community node

In n8n, go to **Settings → Community Nodes** and install `n8n-nodes-mcp`:

<img src="/images/n8n-node.png" alt="Installing n8n-nodes-mcp community node" />

### 2. Create a workflow

Build a workflow with these nodes:

1. Add a **Chat Trigger** node (receives your messages)
2. Add an **AI Agent** node and connect it to the trigger
3. Add a **Chat Model** under the AI Agent (e.g., OpenAI, Claude)
4. Add an **MCP Client Tool** under the AI Agent

<img src="/images/n8n-step3-workflow.png" alt="n8n workflow with AI Agent and MCP Client" />

### 3. Configure the AI Agent

In the AI Agent node, set **Source for Prompt** to **Connected Chat Trigger Node**.

<img src="/images/n8n-step4-agent-prompt.png" alt="AI Agent prompt configuration" />

### 4. Connect to BrowserOS

Click on the MCP Client node and configure:

- **Endpoint**: Your BrowserOS MCP URL (find it in Settings → BrowserOS as MCP)
- **Server Transport**: `HTTP Streamable`

<img src="/images/n8n-step5-mcp-client.png" alt="MCP Client configuration with BrowserOS URL" />

### 5. Test it

Save the workflow, click **Open chat**, and try:

```
open google.com in BrowserOS
```

<img src="/images/n8n-step6-test.png" alt="Testing the workflow" />

## Troubleshooting

If the connection fails:
- Make sure BrowserOS is running
- Check that MCP server is enabled in BrowserOS settings
- Verify the port number matches your BrowserOS MCP URL

---

### Browseros Troubleshooting Connection Issues (`docs/browseros/troubleshooting/connection-issues.mdx`)

---
title: "Has Agent Crashed?"
description: "How to fix connection issues when the BrowserOS agent is not responding"
---

If you see **"Failed to Fetch"** or **"Unable to connect to BrowserOS agent"**, your agent has been killed.

<Frame>
  <img src="/browseros/troubleshooting/failed-to-fetch-error.png" alt="Failed to fetch error" />
</Frame>

## Windows: Did you allow the BrowserOS Agent?

When BrowserOS starts for the first time on Windows, a popup will ask if you want to allow **BrowserOS Agent** to access the network. Click **Allow** — the agent runs as a separate process alongside the browser and needs this permission to work. If you clicked **Cancel** or missed this prompt, the agent won't be able to connect.

<Frame>
  <img src="/browseros/troubleshooting/windows-installation-allow-browseros-agent.png" alt="Allow BrowserOS Agent network access prompt" />
</Frame>

To fix this, go to **Windows Security → Allow an app through your network settings**, and make sure **BrowserOS Agent** is enabled.

## Fix It

<Steps>
  <Step title="Go to Settings → MCP Server and click Restart">
    Open **Settings** from the sidebar, scroll to the MCP Server section, and click **Restart**. Wait a couple of minutes.

    <Frame>
      <img src="/browseros/troubleshooting/mcp-server-restart.png" alt="Click Restart in MCP Server Settings" />
    </Frame>
  </Step>

  <Step title="If restart doesn't work, restart the BrowserOS Agent manually">
    <Tabs>
      <Tab title="Windows">
        1. Open **Task Manager** — press `Ctrl + Shift + Esc` or right-click the taskbar and select **Task Manager**.
        2. In the search bar at the top, type **browseros agent**.
        3. Right-click **BrowserOS Agent** and select **End task**.
        4. Reopen **BrowserOS** — the agent will restart automatically.

        <Frame>
          <img src="/browseros/troubleshooting/troubleshoot-search-restart-agent-task-manager.png" alt="Search for BrowserOS Agent in Task Manager and restart it" />
        </Frame>

        <Note>If the agent still doesn't reconnect, end both **BrowserOS** and **BrowserOS Agent** in Task Manager, then reopen the app.</Note>
      </Tab>
      <Tab title="macOS">
        Right-click BrowserOS in the Dock → **Quit**, then reopen the app.
      </Tab>
    </Tabs>
  </Step>
</Steps>

## Still Not Working?

<AccordionGroup>
  <Accordion title="Check if another application is using the port">
    The agent runs on port `9100` by default. If another application is using this port, BrowserOS cannot start the agent.

    <Tabs>
      <Tab title="macOS/Linux">
        Find the process:
        ```bash
        lsof -i :9100
        ```

        Kill it (replace `PID` with the process ID from above):
        ```bash
        kill -9 PID
        ```
      </Tab>
      <Tab title="Windows">
        Find the process:
        ```powershell
        netstat -ano | findstr :9100
        ```

        Kill it (replace `PID` with the process ID from above):
        ```powershell
        taskkill /PID PID /F
        ```
      </Tab>
    </Tabs>

    Then restart BrowserOS.
  </Accordion>

  <Accordion title="Check your firewall or antivirus settings">
    Some firewalls may block local connections. Make sure your firewall allows connections to `127.0.0.1:9100`.

    **Windows users:** Antivirus software sometimes triggers a false positive. Try temporarily disabling your antivirus and restarting BrowserOS.
  </Accordion>
</AccordionGroup>

## Get Help

If you're still experiencing issues, reach out:

<CardGroup cols={2}>
  <Card title="Discord" icon="discord" href="https://discord.gg/YKwjt5vuKr">
    Get help from the community
  </Card>
  <Card title="Slack" icon="slack" href="https://dub.sh/browserOS-slack">
    Join our Slack
  </Card>
</CardGroup>

---

### Browseros Update Linux (`docs/browseros/update/linux.mdx`)

---
title: "Update on Linux"
description: "How to update BrowserOS on Linux"
---

<Steps>
  <Step title="Check for updates">
    Click the **BrowserOS Feedback** extension (bug icon) in the toolbar, then click **Check for Updates**.

    <Frame>
      <img src="/images/check-for-updates.png" alt="BrowserOS Feedback extension showing Check for Updates button" />
    </Frame>
  </Step>

  <Step title="Download the latest version">
    Download the Linux build from [GitHub Releases](https://github.com/browseros-ai/BrowserOS/releases).
  </Step>

  <Step title="Install">
    Extract and run the binary. Your settings and data will be preserved.
  </Step>
</Steps>

---

### Browseros Update Macos (`docs/browseros/update/macos.mdx`)

---
title: "Update on macOS"
description: "How to update BrowserOS on macOS"
---

<Steps>
  <Step title="Check your version">
    Go to **Settings > About BrowserOS** to see your current version.

    <Frame>
      <img src="/images/about-browseros.png" alt="Settings page showing About BrowserOS section" />
    </Frame>
  </Step>
  <Step title="Wait for auto-update">
    BrowserOS on macOS updates automatically. Restart your browser to apply pending updates.
  </Step>
  <Step title="Manual download (if needed)">
    If auto-update isn't working, download from [browseros.com](https://browseros.com) or [GitHub Releases](https://github.com/browseros-ai/BrowserOS/releases).
  </Step>
</Steps>

---

### Browseros Update Windows (`docs/browseros/update/windows.mdx`)

---
title: "Update on Windows"
description: "How to update BrowserOS on Windows"
---

<Steps>
  <Step title="Check for updates">
    Click the **BrowserOS Feedback** extension (bug icon) in the toolbar, then click **Check for Updates**.

    <Frame>
      <img src="/images/check-for-updates.png" alt="BrowserOS Feedback extension showing Check for Updates button" />
    </Frame>
  </Step>

  <Step title="Download the latest version">
    Download the Windows installer from [GitHub Releases](https://github.com/browseros-ai/BrowserOS/releases).
  </Step>

  <Step title="Run the installer">
    Double-click the downloaded installer to start the update. You'll see a temporary folder appear — this is normal and expected on Windows.

    <Frame>
      <img src="/images/windows-installation/windows-installation-installer-tmp-folder.png" alt="Temporary folder created by the installer" />
    </Frame>

    Wait about 30–40 seconds. The temporary folder will disappear on its own, and the updated **BrowserOS** app will automatically appear on your desktop.

    <Frame>
      <img src="/images/windows-installation/windows-installation-app-on-desktop.jpeg" alt="BrowserOS app appears on the desktop after installation" />
    </Frame>

    <Note>If BrowserOS was already running, close it completely and reopen it for the update to take effect.</Note>
  </Step>

  <Step title="Allow the BrowserOS Agent">
    When BrowserOS opens, you may see a popup asking to allow **BrowserOS Agent** to access the network. Click **Allow** — the agent runs as a separate process alongside the browser and needs this permission to work.

    <Frame>
      <img src="/images/windows-installation/windows-installation-allow-browseros-agent.png" alt="Allow BrowserOS Agent network access prompt" />
    </Frame>

    <Warning>If you click Cancel, the agent won't be able to connect and you'll see a "Failed to Fetch" error. If this happens, go to **Windows Security → Allow an app through your network settings** and enable **BrowserOS Agent**.</Warning>
  </Step>
</Steps>

Your settings and data will be preserved after the update.

---

### Neo Mcp Claude Desktop (`docs/neo/mcp/claude-desktop.mdx`)

---
title: "Claude Desktop and Cowork"
description: "Give Claude Desktop, and Cowork inside it, a real browser via a one-file extension."
keywords: ["Claude Desktop MCP", "Claude Cowork MCP", "BrowserOS neo Claude Desktop extension"]
---

[Claude Desktop](https://claude.ai/download) and [Claude Cowork](https://claude.com/product/cowork) both run inside the same Claude app. A single BrowserOS neo extension gives them both a real browser to work in.

## Install

<Steps>
  <Step title="Install BrowserOS neo">
    Download BrowserOS neo from [browseros.com/agents](https://browseros.com/agents) if you haven't already. Launch it at least once so the local server is running.
  </Step>
  <Step title="Download the BrowserOS neo extension">
    Head to the [releases page](https://github.com/browseros-ai/browserclaw-claude-desktop/releases) and grab the latest `browserclaw-<version>.mcpb` file. This is the Claude Desktop extension package.
  </Step>
  <Step title="Drag it onto Claude Desktop">
    Open Claude Desktop's Settings window and drag the `.mcpb` file onto it. Claude Desktop registers the extension and starts using BrowserOS neo's tools right away.
  </Step>
</Steps>

<Note>
The repo and the `.mcpb` file still carry the product's old name, BrowserClaw. Only the product was renamed, not the release artifacts, so download the file spelled exactly as above.
</Note>

## Verify

Open BrowserOS neo, then in Claude Desktop ask:

```text
Open browseros.com/agents in a new tab and tell me the page title.
```

Claude opens the page inside BrowserOS neo and replies with the title.

## Cowork gets it too

Cowork runs inside Claude Desktop, so the same extension unlocks it there as well. Ask Cowork to do a task that involves the web, and it uses BrowserOS neo the same way Claude Desktop does. No second install.

## Where the extension came from

The extension is a small forwarding wrapper: Claude Desktop talks to it locally, and it forwards every call to BrowserOS neo's local endpoint. Nothing goes to a server we control. Source, install file, and privacy policy live in the [browserclaw-claude-desktop repo](https://github.com/browseros-ai/browserclaw-claude-desktop).

## Troubleshooting

**Claude says `BrowserClaw is not running`.** Open BrowserOS neo. The local server starts with the app. The message uses the old product name because it comes from the extension, which still ships under it.

**The extension does not load.** Restart Claude Desktop. If it still fails, remove the extension from Settings and install the latest release again.

**Claude is not using the browser when it should.** Say `Use BrowserClaw for this` the first time and Claude picks up the tools. That is the name of the MCP entry, so it is the name Claude recognizes.

## Where to next

<CardGroup cols={2}>
  <Card title="How BrowserOS neo works" icon="play" href="/neo/how-it-works">
    A guided walkthrough from install to your first AI-driven session.
  </Card>
  <Card title="One-click setup" icon="plug" href="/neo/mcp">
    The AI tools we support with one click today.
  </Card>
</CardGroup>

---

### Neo Mcp Manual (`docs/neo/mcp/manual.mdx`)

---
title: "Manual URL setup"
description: "Connect BrowserOS neo to any MCP-compatible AI tool by hand with the endpoint URL, and add the BrowserOS neo skill so your agent uses it well."
keywords: ["BrowserOS neo manual MCP setup", "BrowserOS neo skill", "install browseros-neo skill", "Hermes MCP", "Vercel AI SDK MCP", "OpenClaw MCP"]
---

Any AI tool that speaks MCP over HTTP can use BrowserOS neo. Adding the MCP server connects the two, and installing the BrowserOS neo skill on top improves the experience.

The MCP syntax varies by tool, and so does the way skills are loaded. Here are the tools we have documented so far.

First, grab the endpoint URL from BrowserOS neo. Open a new tab, click **MCP** in the sidebar, and click **Copy** at the top of the page. It looks like this:

```text
http://127.0.0.1:9200/mcp
```

Now pick your AI tool below.

<Note>
The examples name the server `browseros-neo`, matching the one-click setup. The name is yours to choose, but whatever you pick is the name your AI tool will know the browser by.
</Note>

## Install the skill

The skill is one `SKILL.md` file, published from [the BrowserOS repository](https://github.com/browseros-ai/BrowserOS/tree/main/skills/browseros-neo). Most agents read skills from a shared `.agents/skills` directory, and the quickest way to put it there is the [skills.sh](https://skills.sh) CLI:

```bash
npx skills add browseros-ai/browseros --skill browseros-neo
```

<Warning>
Keep the `--skill browseros-neo` flag. Without it the command installs every skill published from that repository, including several we use to work on BrowserOS itself, which have no business in your agent.
</Warning>

That writes `./.agents/skills/browseros-neo/SKILL.md` in the current project and symlinks it for agents that use their own directory. Add `-g` instead to install it once for every project.

Not every agent reads `.agents/skills`, so check your tool below.

## Hermes Agent

[Hermes Agent](https://hermes-agent.nousresearch.com) from Nous Research supports connecting to external HTTP MCP servers via its YAML config. Full details in [Hermes' MCP docs](https://hermes-agent.nousresearch.com/docs/user-guide/features/mcp).

Open `~/.hermes/config.yaml` and add a `mcp_servers` entry:

```yaml
mcp_servers:
  browseros-neo:
    url: "http://127.0.0.1:9200/mcp"
```

Then reload Hermes:

- Inside an existing `hermes chat` session, run `/reload-mcp`.
- Or restart Hermes.

Hermes also has a CLI command that adds a server interactively: `hermes mcp add browseros-neo`. Either path works.

**Adding the skill.** Hermes does not read `.agents/skills`. It keeps skills in `~/.hermes/skills/`, so install it from the file directly:

```bash
hermes skills install https://raw.githubusercontent.com/browseros-ai/BrowserOS/main/skills/browseros-neo/SKILL.md
```

Check it landed with `hermes skills list`, or `/skills` inside a chat session. Hermes loads the name and description up front and pulls the full text only when it needs it, so the skill costs almost nothing until it is used. Full details in [Hermes' skills docs](https://hermes-agent.nousresearch.com/docs/user-guide/features/skills).

## Vercel AI SDK

The [Vercel AI SDK](https://ai-sdk.dev/) supports MCP tools via the `@ai-sdk/mcp` package. Full details in [the AI SDK MCP docs](https://ai-sdk.dev/docs/ai-sdk-core/mcp-tools). Point the client at BrowserOS neo's endpoint URL, pull the tools, and pass them into `streamText` or `generateText`.

```javascript
import { createMCPClient } from '@ai-sdk/mcp';
import { streamText } from 'ai';

const mcpClient = await createMCPClient({
  transport: {
    type: 'http',
    url: 'http://127.0.0.1:9200/mcp',
  },
});

const tools = await mcpClient.tools();

const result = await streamText({
  model: 'xai/grok-4.5',
  tools,
  prompt: 'Open the running BrowserOS neo tab and summarise what my agent just did.',
  onFinish: async () => {
    await mcpClient.close();
  },
});
```

The AI SDK docs recommend closing the client once you're done. In streaming code that means `mcpClient.close()` inside `onFinish`. In non-streaming code, use a `try` / `finally` block.

**Adding the skill.** The AI SDK is a library rather than an agent, so nothing discovers skills for you. Run the `npx skills add` command above, then read the file into your system prompt:

```javascript
import { readFile } from 'node:fs/promises';

const skill = await readFile('.agents/skills/browseros-neo/SKILL.md', 'utf8');

const result = await streamText({
  model: 'xai/grok-4.5',
  tools,
  system: skill,
  prompt: 'Book me a table for four on Friday.',
});
```

For more than one skill, the AI SDK's [agent skills guide](https://ai-sdk.dev/cookbook/guides/agent-skills) covers loading names and descriptions up front and fetching the full text on demand with a `loadSkill` tool.

## OpenClaw

[OpenClaw](https://openclaw.ai) is an open-source personal AI assistant that can act as an MCP client. Full details in [OpenClaw's MCP docs](https://docs.openclaw.ai/cli/mcp).

The fastest path is the CLI:

```bash
openclaw mcp add browseros-neo --url http://127.0.0.1:9200/mcp --transport streamable-http
```

Or edit `~/.openclaw/openclaw.json` directly:

```json
{
  "mcp": {
    "servers": {
      "browseros-neo": {
        "url": "http://127.0.0.1:9200/mcp",
        "transport": "streamable-http"
      }
    }
  }
}
```

Verify the connection with the built-in doctor:

```bash
openclaw mcp doctor browseros-neo --probe
```

**Adding the skill.** OpenClaw already reads `.agents/skills`, both in the workspace and at `~/.agents/skills`, so the `npx skills add` command above is enough and there is nothing else to wire up. If you would rather use OpenClaw's own installer, it takes a skills.sh reference:

```bash
openclaw skills install skills-sh:browseros-ai/browseros/browseros-neo
```

Add `--global` to install it for every workspace. Confirm with `openclaw skills list`. Full details in [OpenClaw's skills docs](https://docs.openclaw.ai/tools/skills).

## Any other MCP-compatible AI tool

The pattern is the same: paste `http://127.0.0.1:9200/mcp` into the AI tool's own MCP server config, using whatever syntax that tool expects. BrowserOS neo's endpoint uses **Streamable HTTP** transport (per the current MCP spec), so any client that supports Streamable HTTP works.

For the skill, run `npx skills add browseros-ai/browseros --skill browseros-neo` and then check where your agent looks for skills. Most read `.agents/skills` and will find it with no further work. If yours keeps them somewhere of its own, copy `.agents/skills/browseros-neo/SKILL.md` into that directory, or point its own installer at the file:

```text
https://raw.githubusercontent.com/browseros-ai/BrowserOS/main/skills/browseros-neo/SKILL.md
```

If you get your AI tool talking to BrowserOS neo and want to help others do the same, please [open a discussion](https://github.com/orgs/browseros-ai/discussions) with the setup steps.

## Where to next

<CardGroup cols={2}>
  <Card title="How BrowserOS neo works" icon="play" href="/neo/how-it-works">
    A guided walkthrough from install to your first AI-driven session.
  </Card>
  <Card title="One-click setup" icon="plug" href="/neo/mcp">
    The AI tools we support with one click today.
  </Card>
</CardGroup>

---

### Packages Browseros Bos Build Docs Build Cli (`packages/browseros/bos_build/docs/build-cli.md`)

# Build CLI Reference

Everything `browseros build` can do beyond the common invocations in
[`../README.md`](../README.md). Run these from `packages/browseros`.

## Seeing and tweaking a plan

The composed plan is always a projection of `plan()` in `core/planner.py` —
generated, never hand-copied, so it cannot drift from what actually runs.

```bash
# Print the composed steps + required env vars and exit
# (works without a chromium checkout)
browseros build --preset release --show-plan

# Comment out steps, as an operation: subtract from the composed plan
browseros build --preset release --skip upload,series_patches

# Resume the tail after a failure without recompiling
browseros build --preset release --from sign_macos

# One-off GN overrides while iterating (appended last, so they win)
browseros build --preset debug --gn-arg symbol_level=2 --gn-arg dcheck_always_on=true
```

### `--skip`

Subtracts **after** composition, so it never re-triggers composition rules —
skipping `sign_windows` will not add `mini_installer`. CLI `--skip` and a
profile's `skip:` list union. Unknown step names fail loudly; a valid step
absent from this plan is a no-op, so a saved `skip:` keeps working as presets
evolve. It is subtraction from the canonical plan, never a copy of it.

### `--from`

Resumes the composed (post-skip) run timeline at a step. Earlier runs are
dropped, the first run containing the step is sliced, later runs stay whole. A
failed universal merge resumes with just
`--arch universal --from merge_universal` — no recompiles.

CLI-only: a resume is a one-off, so there is no `from:` profile key.

### `--gn-arg`

Repeatable, valid in any mode. Appends GN overrides **after** the flags file and
the product args, so last write wins and `configure` honors them without editing
the committed `config/gn/*.gn` files.

Values are verbatim GN: bools and ints bare, strings with embedded quotes
(`--gn-arg 'target_cpu="arm64"'`). CLI-only by design — a profile that wants
different flags should use a different flags file.

Only the `configure` step writes `args.gn`. A plan that skips it (for example
`--from compile`) reuses the existing file untouched, including any overrides a
previous invocation wrote there.

## Modules profiles — "you own this list now"

For the rare run that genuinely wants an arbitrary sequence, a profile may carry
`modules:` as an explicit opt-in — a local, commentable file that bypasses the
planner entirely:

```yaml
# my-tail.yaml (local only — never shipped)
modules: [compile, sign_macos, package_macos]
build_type: release   # only valid with modules:; defaults to debug
arch: arm64           # single arch only
```

Planner-owned keys (`preset`, `clean`, `provision`, `download`, `sign`,
`upload`, `resource_mode`, `skip`) and the `--skip` / `--from` flags are
rejected alongside `modules:`. You own the list; edit it directly. Shipped
profiles stay switch-based, and a golden test keeps them from drifting.

The same escape hatch exists on the command line for one-off runs:

```bash
browseros build --modules clean,compile,sign_macos --product browseros
browseros build --list                                # every available step
```

Phase flags are the middle ground — auto-ordered, no explicit step list:

```bash
browseros build --setup --build --sign --package
browseros build --build --sign                        # skip setup
```

Note that `--prep` does **not** apply `series_patches`. Run
`browseros build -m series_patches` separately if you need them.

## Remote and ephemeral runners

A fresh machine needs nothing outside this package:

```bash
uv sync
uv run browseros source ensure --root "$CHROMIUM_ROOT" --reset
uv run browseros source clean-outputs --root "$CHROMIUM_ROOT" --all-products --arch x64
uv run browseros build --profile release-ci --chromium-src "$CHROMIUM_ROOT/src" --arch x64
```

The complete preparation command holds the checkout lock, fetches the exact
missing pin, resets source and managed dependencies, then runs sync/hooks.
Omit `--reset` to preserve local changes; conflicting checkout/sync operations
fail without silently discarding work. `--step checkout` and `--step sync` remain
partial-operation compatibility commands. Cache restore/save also hold the lock;
archives exclude lock files. Hosted roots remain exclusive to their workflow job.

macOS CI uses `source workspace` through `macos-chromium-workspace.sh`: it refreshes
the persistent base once and holds its lock through every requested product copy.
Per-product output/resource cleanup follows; `release-ci` and `nightly-macos`
then skip source cleanup and provisioning. `source cleanup-workspaces` removes
owned copy contents but retains small ownership markers and lock directories so
waiting processes cannot acquire a replacement lock inode. Local release and
explicit `--modules clean` retain their reset behavior.

## Concurrency

Every build takes an exclusive lock on its Chromium checkout, keyed by the
resolved `src` path and held regardless of product. A second build against the
same checkout fails fast and tells you who holds it. Pass `--lock-wait` to queue
behind it instead.

Release builds run `git reset`, `git clean`, and patch application in one shared
checkout, which is why the lock exists. The lock file sits next to the gclient
root rather than under `src/`, so `git clean` cannot delete it mid-build.

## Products

A product is one file: `products/<id>/product.py` with a
`ProductDescriptor.define()` call — about five irreducible inputs, roughly forty
fields derived by convention, keyword overrides for deviations — plus its server
bundle definitions. Verify with:

```bash
browseros product doctor          # identity uniqueness + branding assets
```

---

### Packages Browseros Bos Build Docs Docker Image (`packages/browseros/bos_build/docs/docker-image.md`)

# Neo Docker image

`ghcr.io/browseros-ai/neo` runs BrowserOS neo on a virtual display, streams it over
noVNC, and exposes Neo's MCP server. One tag covers `linux/amd64` and `linux/arm64`.
The user guide is [`docker/neo/README.md`](../../docker/neo/README.md); this page is
for building and publishing it.

## Where things live

| Path | Role |
|---|---|
| `docker/neo/Dockerfile` | The image. Picks the `.deb` for each architecture from the version's public `release.json` and checks its sha256, so it builds without `bos_build` |
| `docker/neo/entrypoint.sh` | Container supervisor: Xvnc, openbox, websockify, Neo restart loop, profile setup, clean shutdown |
| `docker/neo/smoke.py` | End-to-end check from the host: viewer, MCP from outside the container, hosted tool set, an agent tab |
| `bos_build/release/docker_image.py` | `build_image`: preflight that each architecture was published, tag policy, buildx invocation |
| `bos_build/cli/release_docker.py` | `browseros release docker`, a thin wrapper |
| `.github/workflows/release-docker.yml` | Dispatch workflow: build amd64, smoke test, push both architectures |

## Prerequisite: a Linux release with both architectures

The image installs released packages. A version can be published only when its
`releases/browserclaw/<version>/linux/release.json` lists both `x64_deb` and
`arm64_deb`, i.e. the Neo release ran with `linux_arch=all` and uploaded to R2.
`browseros release docker --push` checks this before building and names what is missing:

```
❌ Neo 0.51.1.4 has no x64_deb on the CDN
```

## Build locally

From `packages/browseros`:

```bash
# This machine's architecture, loaded into local Docker (arm64 on Apple silicon).
uv run browseros release docker --version 0.52.0.1

# A package that isn't on the CDN, e.g. a CI artifact. Loaded locally only.
uv run browseros release docker --deb ~/Downloads/BrowserOS_neo_v0.52.0.1_arm64.deb

# Then run and check it.
cd docker/neo
NEO_VERSION=0.52.0.1 docker compose up -d --wait
python3 smoke.py
docker compose down
```

A local `.deb` named like a release package (`BrowserOS_neo_v<version>_<arch>.deb`)
supplies the version and platform itself; otherwise pass `--version`.

## Publish

```bash
gh workflow run release-docker.yml -f version=0.52.0.1              # version tag only
gh workflow run release-docker.yml -f version=0.52.0.1 -f latest=true
```

The workflow builds the amd64 image, runs `smoke.py` against it, then pushes both
architectures with `GITHUB_TOKEN`. Tag `latest` only once the version has been
promoted (`browseros release publish`); a draft should never become `latest`.

From a workstation instead, after `docker login ghcr.io` with a token that has
`write:packages`, and with a buildx builder that can build arm64 and amd64:

```bash
uv run browseros release docker --version 0.52.0.1 --push [--latest]
```

## First publish

A new ghcr package starts private. After the first push, open the package's settings
on GitHub and change its visibility to Public (the org must allow public packages).
Public images pull without logging in.

`browseros release docker --push` links the package to this repository by putting an
`org.opencontainers.image.source` annotation on the pushed index (it also requests a
provenance attestation so a single-platform push has an index to annotate). The
Dockerfile's label of the same name is not enough on its own: GitHub reads the
index, and the label only reaches the per-platform images. The link is what lets the
workflow's `GITHUB_TOKEN` push; a package created without it must be connected in its
package settings first.

## Runtime notes for maintainers

- **Ports inside the container are fixed:** noVNC 6080, MCP proxy 9010
  (`--browseros-proxy-port`), CDP 9110 and claw-server 9210 (pinned, loopback only).
- **All state lives under `/data`.** The profile is `/data/profile`. claw-server's database,
  recordings, skills and agent settings are `/data/browserclaw` (`BROWSERCLAW_DIR`); its
  default, `~/.browserclaw`, is not on the volume.
- **Remote MCP needs a profile setting.** Docker's port forwarding doesn't arrive from
  loopback, so the entrypoint merges `browseros.server.allow_remote_in_mcp: true` into
  the profile's `Local State` before Neo starts.
- **Shutdown quits Neo over CDP.** `neo-quit` sends `Browser.close`; Chromium's SIGTERM
  path skips flushing. Neo on Linux still records a crash even after a clean quit,
  so Neo starts with `--hide-crash-restore-bubble`.
- **The sandbox is off by default** (`NEO_SANDBOX=false`): Docker's default seccomp
  profile blocks the user namespaces it needs. With the sandbox off, a managed policy
  hides Chromium's `--no-sandbox` warning bar.
- **claw-server runs in hosted mode** (`BROWSERCLAW_MODE=hosted`): agents get the browser
  tools without skills, human help or `name_session`, and name tasks with a `taskName`
  argument. The entrypoint also turns human help off through `/api/v1/settings/agent` on
  every start, before the container reports healthy, for claw-servers that predate the mode.

---

### Packages Browseros Bos Build Docs Linux Arm64 (`packages/browseros/bos_build/docs/linux-arm64.md`)

# Neo Linux arm64 releases

Neo can build Linux arm64 packages with the existing x64 WarpBuild runner.
`bos_build` already selects `target_cpu = "arm64"`, installs Chromium's arm64
sysroot, downloads the published arm64 Neo server, and packages an arm64
AppImage and Debian archive. This design connects those capabilities to the
release workflow and its exact artifact checks.

## Interface and ownership

The Neo release selection is `linux_arch=all|x64|arm64`, defaulting to `all` so
routine releases include both Linux architectures. Explicit `x64` or `arm64`
selections narrow the artifact contract. The standalone/reusable Linux workflow
calls this input `arch` and keeps its `x64` default for BrowserOS and source-mode
callers. CLI defaults remain compatible with historical release receipts.

The deep module is the existing release metadata validator in `release/common.py`.
Its interface accepts the selected platforms and architecture sets, then checks
product, version, source commit, workflow provenance, and the exact artifact set.
GitHub drafts, download promotion, and appcast generation cross the same seam;
callers do not independently interpret which Linux packages constitute a release.

| Selection | Required Linux artifact keys |
| --- | --- |
| `x64` | `x64_appimage`, `x64_deb` |
| `arm64` | `arm64_appimage`, `arm64_deb` |
| `all` | all four keys above |

Missing or extra keys fail validation. Selecting arm64 must never silently
attach x64 packages left by another run. Archive names and existing download
aliases remain architecture-specific; the x64 aliases retain their historical
names.

```text
Neo dispatch: platforms + linux_arch + publication
  -> preflight validates and freezes the selection/source
  -> release-linux expands product x architecture
       -> existing x64 build runner
       -> published server for the target architecture
       -> Chromium build -> verified AppImage + Debian pair
       -> versioned artifacts and Linux release.json
  -> draft finalizer validates the selected exact artifact set
  -> explicit promotion uses that same architecture selection
```

## Metadata is one serialized handoff

Both architectures own entries in the same versioned `linux/release.json`.
Its existing read/merge/write operation is not atomic. The Linux matrix therefore
runs with `max-parallel: 1`, inside the existing `release-linux` concurrency group.
This deliberately serializes compilation as well as publication: it is the
smallest ownership rule that prevents lost updates without a new storage protocol
or another finalization job. Each architecture still has its own checkout cache
key and product output directory.

A retry of a failed architecture may use a later workflow attempt than an already
successful sibling. Linux metadata merges only when the release identity, source,
workflow run, and complete pinned resource versions match. Unpinned standalone
receipts are replaced across attempts because mutable `latest` resources may
have changed. Each Linux artifact records its
own workflow attempt. The platform-level attempt is present only when every
artifact belongs to that attempt; mixed attempts cannot claim a single attempt.
An explicitly requested attempt still fails closed for a mixed receipt. Other
platforms retain their existing merge rules.

## Build host and resource mode

Use the existing x64 Linux runner to cross-compile. AppImage tooling is selected
for the host, while its `ARCH` setting and Debian metadata describe the target.
Installing an arm64 appimagetool on the x64 host would break packaging.

This release path uses published resources: the Neo server release already
produces `linux-arm64`, and extensions/onboarding are architecture-independent.
The separate source-resource provider currently supports Linux x64 only. The
Linux workflow rejects source mode with an arm64-containing selection during
planning, before allocating an expensive browser runner. Adding source mode
requires a Cargo GNU cross-linker and its own server/lane contract work.

## Run an arm64 build

After this change is merged, dispatch from the default branch:

```sh
gh workflow run release-browserclaw.yml --ref main \
  -f platforms=linux -f linux_arch=arm64 -f publication=draft-only
```

This binds the browser to exact published-resource versions created by the same
release transaction and leaves a browser draft. `draft-only` creates private
resource drafts/versioned objects and does not promote their aliases or feeds.
Omit `linux_arch` to build both architectures. Releases selecting only macOS or
Windows accept the default without building Linux.

Expected arm64 browser assets:

```text
BrowserOS_neo_v<VERSION>_arm64.AppImage
BrowserOS_neo_v<VERSION>_arm64.deb
```

For standalone Linux builds using the existing published resources:

```sh
gh workflow run release-linux.yml --ref main \
  -f products=browserclaw -f arch=arm64 -f upload_to_r2=true
```

A standalone `arch=all` build requires one product and explicit `server_version`,
`extension_version`, and `onboarding_version` inputs. Otherwise two builds could
resolve different mutable `latest` resources hours apart. The full Neo workflow
supplies these exact versions automatically; an unpinned standalone request for
both architectures fails before any browser runner is allocated.
Server/onboarding pins must be numeric `MAJOR.MINOR.PATCH` releases; extension
pins use the existing numeric Chrome version format. Mutable aliases such as
`latest` and `alpha` are rejected both during planning and retry retention.

Pass `--linux-arch arm64` (or `all`) to `browseros release github create`,
`browseros release publish`, and `browseros release appcast` when binding those
operations to an architecture-selected release.
An explicit CLI architecture always binds exact pairs, including `x64`, without
requiring additional provenance flags. Existing generic CLI calls with no release
contract keep their legacy behavior; when a contract is requested and the Linux
architecture is omitted, that contract defaults to x64.

## Evidence required before shipping

The implementation checks the release tooling without generating Chromium build
files. A successful cross-build is still required to establish that the pinned
Chromium source and BrowserOS patches compile for Linux arm64.

On a real Linux arm64 machine, inspect the ELF architecture and Debian metadata,
install the Debian archive, extract and launch the AppImage, and verify browser
startup, the sandbox, Neo extension startup, and the bundled Neo server. Verify
these on the intended distribution baseline, including its shared-library/glibc
requirements. Cross-host packaging deliberately skips target execution and library
checks, so those checks alone cannot establish runtime compatibility.

---

### Packages Browseros Bos Build Docs Nightly Macos Ci (`packages/browseros/bos_build/docs/nightly-macos-ci.md`)

# Nightly macOS CI

The two manual entry workflows complete and publish one product each:

| Workflow | Display name | Rolling prerelease |
| --- | --- | --- |
| `.github/workflows/nightly-macos-browseros.yml` | Nightly: BrowserOS (macOS arm64) | `nightly-browseros` |
| `.github/workflows/nightly-macos-browserclaw.yml` | Nightly: BrowserOS neo (macOS arm64) | `nightly-browserclaw` |

Dispatch either entry from `main`; neither has a schedule or release-shape inputs.

```bash
gh workflow run nightly-macos-browseros.yml --ref main
gh workflow run nightly-macos-browserclaw.yml --ref main
```

`.github/workflows/reusable-build-macos-nightly.yml` is named
**Reusable: Build macOS nightly** and accepts only `workflow_call`. It retains the
existing signed arm64 build, provisioning profiles, published resources, deferred
R2 upload, and unconditional Chromium-workspace and signing-keychain cleanup.

## Product transaction

Each entry freezes one source SHA, reserves a browser version and its own server
and extension versions, then prepares those two exact components. BrowserOS pins
`server`, `agent`, and the existing `app-onboard` version. BrowserOS neo pins
`claw-server-rust`, `browserclaw`, and the existing `claw-onboard` version.
Onboarding bundles continue to release independently.

```text
manual dispatch from main
  -> reserve one product transaction on a draft PR
  -> prepare and verify its server and extension
  -> build one signed macOS arm64 browser
  -> finalize its server and extension; assemble its server appcast
  -> acquire release-feed-snapshots
  -> compose current-main snapshots and render its extension pin
  -> reconcile the product gate and merge state
  -> conditionally create or verify its immutable DMG and receipt
  -> publish current committed feeds and reconcile its rolling prerelease
```

A sibling build or finalizer is never a dependency. Component callers pass
`state_owner: suite` and disable standalone feed publication, leaving the product
transaction as the owner of its tracked state.

The retry identity is `nightly-<product>-<source-sha>` and the reservation branch
is `bot/release-nightly-<product>-<12-source-chars>`. Different products therefore
have different records even when dispatched at the same source commit. The
transaction PR is created as a draft. Open, closed, and merged canonical suite
records continue to reserve their versions; closing a failed PR does not free a
version already used by immutable uploads.

| Identity | Meaning |
| --- | --- |
| Source SHA | Frozen `main` commit used for artifact provenance and component builds |
| Reservation SHA | Immutable source child containing the exact version overlay used by the browser build |
| State SHA | Product PR head combining the reservation and current-main state with approved snapshots |
| Merge SHA | Squash commit proving the product state became durable on `main` |

Builders always check out the Reservation SHA. The state and merge commits are
never build inputs. After branch deletion, `refs/pull/<PR_NUMBER>/head` keeps the
validated reservation reachable for recovery. Shared browser version and build
offset allocation remains monotonic across both products and saved family records.

## Shared feeds and publication recovery

One `release-feed-snapshots` job holds the lock from current-main resolution
through state merge and publication. It writes only its server alpha appcast and
the three shared extension snapshots. Rendering pins only the selected extension;
unpinned entries carry their newer live or committed versions through
`--baseline-root`. This preserves a sibling whose snapshot merge succeeded but
whose R2 upload failed. Standalone extension publishers use the same boundary.

Final state composition keeps the checkout HEAD at Source SHA, restores the
selected snapshots from current main, and passes that main SHA as
`--state-base-sha`. Backend reconciliation preserves unrelated and sibling state
while retaining the original reservation and selected component pins.

Publication first verifies that the transaction is merged and its Merge SHA is
an ancestor of current main. It conditionally creates the product's immutable
DMG and receipt before exposing any mutable feeds. Identical bytes and transaction
bindings are accepted on retry; conflicts fail without overwrite. The publisher
restores current committed feed files, so recovery cannot overwrite a later
sibling snapshot with files from the old transaction merge.

Use **Re-run failed jobs** on the original run for post-build or post-merge
failures. An already-merged publication skips rendering and state reconciliation,
reuses the original signed Actions artifact, and publishes current committed
feeds. A new full run cannot restart an already-merged transaction. Signed
artifacts are retained for 14 days; recovery needs those exact bytes.

Live feeds retain downgrade guards; nightlies never pass `--allow-downgrade`.
Rolling publication is source- and checksum-aware: a newer product release is a
superseded/no-op, an exact partial draft resumes, and conflicting source/version
or asset identities fail. A release record and its live tag must resolve to the
same source before cleanup or replacement is allowed.

## Cutover and saved family runs

The old `.github/workflows/nightly.yml` dispatch entry and
`nightly-macos-product.yml` helper are removed from current main. Historical runs
retain their saved workflow definitions, including that helper. Both new entries
retain the historical top-level `release-suite` concurrency group with
`cancel-in-progress: false` and `queue: max`. This conservatively serializes whole
nightly runs during cutover: an active or rerun family transaction cannot overlap
a product transaction, while each new graph can succeed independently.

Legacy records without a product field remain family records with identity
`nightly-<source-sha>`. Inspect or recover those with the legacy CLI by omitting
`--product`, or rerun failed jobs on the original family run. Their draft PRs,
closed records, and pre-PR reservation branches remain allocation history. No
automatic cancellation, closure, or migration of those records occurs.

Historical standalone extension-feed runs saved before this change do not have
the shared publication lock; finish those runs before starting new nightlies.
Rewriting `main` history remains unsupported because reservation provenance must
remain auditable.

## Mac runner and resources

The reusable worker requires `[self-hosted, macOS, ARM64, browseros-builder]` and
shares `macos-build` with full releases. Component allocation retains
`release-component-allocation`; both locks retain pending jobs with `queue: max`.

The profile keeps `resource_mode: published` and executes:

```bash
uv run browseros build --profile nightly-macos --product <browseros-or-browserclaw> \
  --arch arm64 --resource-mode published --chromium-src "$CHROMIUM_SRC"
```

Set `BROWSEROS_REPO_PATH` to the persistent BrowserOS checkout and
`BROWSEROS_CHROMIUM_SRC` to the warm CI-owned Chromium clone base. The runner must
run in the logged-in GUI user's session with Xcode, depot_tools, `uv`, `gh`,
signing/notarization credentials, and enough disk for disposable workspaces.
The Chromium helper fetches the exact pin and syncs the CI base before copying it
under the same checkout lock into a product-qualified APFS workspace;
both workspace and signing-keychain cleanup run under `if: always()`.

The optional `PROD_MACOS_BROWSEROS_PASSKEY_PROFILE_B64` and
`PROD_MACOS_BROWSERCLAW_PASSKEY_PROFILE_B64` secrets remain product-specific.
Missing profiles leave normal signing available without platform passkeys;
configured invalid profiles fail before the long build.

---

### Packages Browseros Bos Build Docs Release Ci (`packages/browseros/bos_build/docs/release-ci.md`)

# Browser release CI

The full BrowserOS and BrowserOS neo workflows orchestrate the existing
component release workflows before building the browser. Component workflows
own component versions and publication. Native browser lanes consume the
normal published-resource manifests and `latest` aliases.

Signed nightlies use independent product transactions through
`nightly-macos-browseros.yml` and `nightly-macos-browserclaw.yml`. Each freezes its
source and resource pins, builds one signed browser, and merges only its product
state before publishing its immutable browser artifacts and rolling prerelease.
The shared allocation and publication locks protect versions and sibling feed
entries. Historical family transactions remain recoverable; see
[nightly-macos-ci.md](nightly-macos-ci.md) for ownership and cutover details.

The existing `release-browseros.yml` and `release-browserclaw.yml` full-release
entrypoints retain their native lane orchestration. Nightly browser jobs build
the exact reservation commit (the frozen source plus its deterministic version
overlay); later state commits and squash merges are never browser build inputs.

## Full-release graph

Both products use the same fixed sequence:

```text
dispatch from main
  -> publish server release, latest resources, and alpha OTA
  -> reflect the successful server version on main
  -> publish extension release, versioned CRX, and alpha/bundled feeds
  -> reflect the successful extension version on main
  -> Linux x64 ───────┐
     Windows x64 ─────┼─> create or refresh the browser draft
     macOS universal ─┘
```

BrowserOS calls `release-server.yml` and releases the `agent` extension.
BrowserOS neo calls `release-claw-server.yml` and releases the `browserclaw`
extension. Each reusable component workflow must finish successfully before
the next stage starts. A failed component release prevents every native
browser lane from starting.

The full workflow freezes the dispatch SHA and passes it to every component
and browser build. Version reflection is intentionally separate: a component
first allocates and builds its next version from that SHA, publishes its tag,
GitHub release, and canonical R2 objects, and only then opens the version-bump
PR. A failed build or publication never changes the committed component
version.

The native lanes use `resource_mode: published`. This is the same path used by
normal local published-resource builds, but the orchestrator pins the exact
server and product-extension versions returned by its component jobs plus the
onboarding version recorded by the frozen checkout. The unchanged extension
pins come from that checkout's bundled manifest.
This prevents another release from changing mutable `latest` or feed aliases
while a native browser lane waits for a runner.

## Dispatch

A dispatch without inputs is a full release: it publishes the product's server
and extension, updates alpha, builds signed Windows x64 and signed macOS
universal, uploads browser deliverables, and creates a draft browser GitHub
release. Neo builds both Linux x64 and arm64 by default; BrowserOS builds Linux
x64. `release-browseros.yml` has no release-shape inputs.

```bash
gh workflow run release-browseros.yml --ref main
gh workflow run release-browserclaw.yml --ref main
```

`release-browserclaw.yml` can narrow that run. Every input defaults to the full
release, and preflight rejects anything else before allocating a version:

| Input | Values | Effect |
| --- | --- | --- |
| `platforms` | `all` (default), `macos`, `linux`, `windows` | native lanes to build; the others are skipped |
| `macos_arch` | `universal` (default), `arm64` | macOS artifact set; non-default only when macOS is selected |
| `linux_arch` | `all` (default), `x64`, `arm64` | Linux artifact set; default is accepted when Linux is skipped; `arm64` requires Linux |
| `publication` | `alpha` (default), `draft-only` | component publication, see below |

`draft-only` passes `defer_finalize: true` to both component workflows. Each
component still allocates a version from the frozen SHA, uploads its immutable
versioned R2 objects and keeps a private GitHub draft, and the browser lanes pin
those exact versions. Nothing downstream of component finalization runs: no
component tags, server `latest` alias, public component releases, server OTA,
extension alpha/bundled feeds, or version-reflection PRs. The macOS lane also
runs with `notify: false`, which skips its Slack failure ping and blanks
`SLACK_WEBHOOK_URL` so a builder `.env` cannot post. The browser draft is
created as usual from only the selected receipts.

```bash
# Signed macOS arm64 test build with private component drafts.
gh workflow run release-browserclaw.yml --ref main \
  -f platforms=macos -f macos_arch=arm64 -f publication=draft-only

# Cross-compiled Linux arm64 test build with private resource drafts.
gh workflow run release-browserclaw.yml --ref main \
  -f platforms=linux -f linux_arch=arm64 -f publication=draft-only
```

Linux arm64 uses the existing x64 WarpBuild runner and published arm64 server
resources. `linux_arch=all` builds the x64 and arm64 AppImage/DEB pairs serially
so their shared Linux release metadata cannot lose an architecture. The browser
draft checks exactly the selected pairs. Pass the same `--linux-arch` selection
to later release CLI validation/promotion. See [Linux arm64](linux-arm64.md) for
the design, source-mode limit, retry provenance, and native verification gate.

The deferred component drafts remain allocations bound to that source SHA: a
later dispatch of the same SHA reuses them, and releases from other SHAs skip
their versions. Browser R2 objects are versioned but not write-once, so give the
next real release a new browser version instead of reusing a test build's.

The dispatch ref must be the repository default branch. Product, component,
native-lane, and shared Mac concurrency groups use `queue: max`, so up to 100
pending releases wait instead of a newer dispatch replacing an older one.

The browser version comes from `resources/BROWSEROS_VERSION` at the frozen
dispatch SHA. Set that version on main before dispatching when the browser
itself needs a new version. Server and extension versions are independently
allocated by their component workflows.

## Standalone component releases

The component workflows remain independently dispatchable and use main by
default:

```bash
gh workflow run release-server.yml --ref main
gh workflow run release-claw-server.yml --ref main
gh workflow run release-extensions.yml --ref main -f extension=agent
gh workflow run release-extensions.yml --ref main -f extension=browserclaw
```

Direct server dispatches default to `publish_ota=true`. They publish the
versioned and `latest` resources, render all five platform appcast fragments,
merge the tracked snapshot through a short-lived pull request, and then publish
that exact appcast to alpha.

Direct extension dispatches default to `publish_alpha_feed=true`. They publish
the CRX release and canonical versioned R2 object, update the alpha and bundled
manifests atomically through a short-lived pull request, publish those exact
manifests, and reflect in-repository extension versions only after finalization
succeeds.

Production promotion remains explicit:

```bash
cd packages/browseros
uv run browseros ota server promote --product browseros --publish
uv run browseros ota server promote --product browserclaw --publish
```

## Retry procedures

Rerun failed jobs in the original full-release run:

```bash
RUN_ID=<github-run-id>
gh run rerun "$RUN_ID" --failed
gh run watch "$RUN_ID" --exit-status
```

Component allocation and publication are idempotent. A rerun recovers a
matching release for the same source SHA instead of silently allocating a new
version. Successful earlier stages are not rebuilt, and downstream browser
lanes stay gated until the failed stage succeeds.

For the combined signed nightly, rerun failed jobs in the original run when
possible. The stable transaction identity is `nightly-<source-sha>`. Browser
jobs fetch the transaction branch before merge, or
`refs/pull/<PR_NUMBER>/head` after branch deletion, only to make the proven
transaction history reachable. They verify that history contains the recorded
reservation, then always check out `reservation_sha`: the frozen source plus
the exact version/component overlay, without the later tracked-state commit.
They never rebuild from the squash merge SHA, whose tree may include unrelated
`main` commits. A new whole-run invocation that finds the transaction already
merged fails closed; post-merge recovery must rerun failed jobs so it reuses the
successful signed artifacts from the original run.

If browser draft creation alone fails, rerun that job in the original run. It
uses the R2 metadata written by the selected native lanes and verifies the same
source SHA and workflow run ID before refreshing the draft. It runs only when
every selected lane succeeded and every unselected lane was skipped. Native lanes from
different rerun attempts are valid because GitHub keeps the run ID stable.

## Local published-resource build

The full workflows use the standard published-resource path. The equivalent
local build is:

```bash
cd /path/to/BrowserOS/packages/browseros
uv run browseros build \
  --preset release \
  --product browseros \
  --arch x64 \
  --resource-mode published \
  --no-sign \
  --no-upload \
  --chromium-src /path/to/chromium/src
```

Use `--product browserclaw` for BrowserOS neo. Published mode resolves mutable
component aliases, so publish the intended component releases before starting
the browser build.

## Local source build

Source mode remains available for local development. It builds
the product extension, onboarding bundle, and active host's server from the
checkout; only the pinned bug reporter is downloaded. It does not publish
component tags, `latest` aliases, server OTA, or extension feeds.

```bash
cd /path/to/BrowserOS/packages/browseros
SOURCE_SHA="$(git rev-parse HEAD)"

uv run browseros build \
  --preset release \
  --product browseros \
  --arch x64 \
  --resource-mode source \
  --source-sha "$SOURCE_SHA" \
  --no-sign \
  --no-upload \
  --chromium-src /path/to/chromium/src
```

Chrome, Bun, and the product's build-time secrets must be available. BrowserOS
neo additionally needs the native Rust toolchain. Source mode does not bump
versions, commit, push, or open a PR.

## Publication boundary

The full workflow creates or refreshes a draft browser GitHub release after
every selected native lane uploads complete R2 metadata. It does not publish the
browser appcast. Inspect the browser draft before promotion.

| Workflow | Owned publication |
| --- | --- |
| `release-server.yml` | BrowserOS server release, versioned/`latest` resources, alpha OTA, version reflection |
| `release-claw-server.yml` | BrowserOS neo server release, versioned/`latest` resources, alpha OTA, version reflection |
| `release-claw-onboard.yml` | onboarding release and resources |
| `release-extensions.yml` | extension CRX release, versioned object, alpha/bundled manifests, version reflection |
| `release-extension-feeds.yml` | explicit extension manifest preview or publication |
| `nightly-macos-browseros.yml` | BrowserOS nightly transaction, product alpha snapshots, and `nightly-browseros` |
| `nightly-macos-browserclaw.yml` | BrowserOS neo nightly transaction, product alpha snapshots, and `nightly-browserclaw` |
| `release-browseros.yml` | ordered BrowserOS component releases, native builds, browser draft |
| `release-browserclaw.yml` | ordered BrowserOS neo component releases, native builds, browser draft |

## Required configuration

Component publication and browser uploads use the `R2_*` secrets. BrowserOS
server builds need `BROWSEROS_CONFIG_URL`, `POSTHOG_API_KEY`, and `SENTRY_DSN`;
BrowserOS neo server builds need `CLAW_POSTHOG_KEY`. Extension builds need the
matching signing key and build-time secrets.

Windows signing needs the eSigner secrets and `SPARKLE_PRIVATE_KEY`. macOS uses
repository variables `BROWSEROS_REPO_PATH` and `BROWSEROS_CHROMIUM_SRC` plus
the signing and notarization secrets on the persistent builder. Signed macOS
releases require separate base64-encoded Developer ID provisioning profiles:
`PROD_MACOS_BROWSEROS_PASSKEY_PROFILE_B64` for `com.browseros.BrowserOS` and
`PROD_MACOS_BROWSERCLAW_PASSKEY_PROFILE_B64` for
`com.browseros.BrowserClaw`. Each profile must authorize team `8YMKWU47S5`, its
bundle-specific keychain groups, and
`com.apple.developer.web-browser.public-key-credential`; the build validates
those claims before signing. The profiles are not interchangeable because
Apple assigns the managed capability to an exact App ID.
Until Apple approves a profile, its secret may remain unset: the corresponding
browser still builds, signs, and runs with the standard entitlements, but macOS
platform passkeys are unavailable. Once a secret is configured, a missing,
wrong, or malformed profile is a hard release error.
`BROWSEROS_CHROMIUM_SRC` is a dedicated, CI-owned APFS clone base. Setup keeps
its pinned Chromium identity strict but repairs local Git changes and
BrowserOS-owned output directories before the release runs against a disposable
copy-on-write workspace. The workspace is cleaned under `if: always()`. Runner
labels, cache behavior, and queue recovery are documented in `warpbuild-ci.md`;
persistent macOS setup is in `nightly-macos-ci.md`.

---

### Packages Browseros Bos Build Docs Source Preparation Plan (`packages/browseros/bos_build/docs/source-preparation-plan.md`)

# Automatic release build preparation

Chromium upgrades must not require an operator to repair each release runner.
The selected BrowserOS checkout's `CHROMIUM_VERSION` is the source of truth.
Bring stale checkouts to that exact tag, finish cleanup, synchronize dependencies
and hooks, then build from a prepared workspace.

## Source preparation and macOS workspace ownership

One source-preparation implementation in `bos_build` owns reset, exact-tag
acquisition, checkout alignment, `.gclient` preservation, and dependency sync.
`git_setup` remains its local-build adapter; `source ensure` is its provisioning
adapter. Preserve the existing explicit clean commands and local no-clean
behavior. Source reset must account for gclient-managed repositories, which are
not necessarily Git submodules.

The macOS persistent base is infrastructure-owned cache state. Refresh it before
APFS copying and hold the existing checkout lock through preparation and copy.
Each product receives an independent disposable workspace; a universal build
prepares once and retains its workspace through both architectures. Product-
qualified workspace markers and state files must survive multiple requested
copies and support complete cleanup after partial failure.

All cleanup that can delete dependency toolchains must finish before the final
sync. Builds consuming prepared copies skip source cleanup and provisioning,
but retain output/checkpoint cleanup and pruning of stale resource families in
the separate persistent BrowserOS repository. Source cache publication remains
after successful sync and output cleanup, before product patches and resources.

Do not use a moving upstream branch, fetch every Chromium tag, overwrite custom
`.gclient` settings, or interpret matching HEAD as proof that sync succeeded.
Keep this focused; no general workspace-provider framework is needed.

## Windows host prerequisites

The build currently selects the locally installed Windows toolchain through
`DEPOT_TOOLS_WIN_TOOLCHAIN=0`. Git and gclient cannot install a missing Windows
SDK in that mode. A separate setup module must determine the SDK required by the
selected Chromium source, ensure the exact supported SDK is installed on the CI
host, and verify its required headers/libraries/tools before configuration.

The Chromium 155 release failed because its required SDK directory
`10.0.28000.0` was absent. Official installation instructions specify SDK package
`10.0.28000.2270`. Resolve this through supported Microsoft provisioning and
explicit installed-file verification; do not change Chromium's SDK pin to an
older installed version.

## Implementation ownership

| Piece | Owned code | Integration contract |
| --- | --- | --- |
| Source preparation | `steps/source/provision.py`, `steps/setup/git.py`, `steps/setup/clean.py`, `cli/source.py`, source/workspace helpers, macOS workspace script and its release/nightly callers; source preparation block in `build-browseros.yml` | Preserve planner/step names where practical; communicate any shared registration changes before editing |
| Windows SDK | New Windows SDK setup module; its Windows-only registrations/planner integration; Windows prerequisite workflow block if needed | Do not change source-preparation blocks, Chromium patches, GN files, or the Chromium pin |
| Integration and release | Combined main review, full Neo workflow dispatch, run/artifact verification, delegated repairs for additional failures | Merge both implementations before dispatch; a queued or component-only success does not prove full-release success |

The two implementation pieces have independent interfaces, so empty skeleton
modules are unnecessary. Each worker uses an isolated worktree, designs the
details, completes independent review, and merges its scoped PR. Preserve both
intentions when integrating current main; never force-push.

## Acceptance

Exercise preparation using real disposable checkouts: missing tag, old HEAD,
dirty source and dependency repositories, interrupted sync, preserved developer
changes and `.gclient` configuration, checkout locking, multi-product copies,
and universal ordering. Verify Windows setup on a real Windows runner; Python
syntax or mocked installation alone is not evidence of SDK readiness.

The owner's Chromium constraints apply: no GN generation or cleanup and no
Chromium unit/browser test targets. Any Chromium source change requires the
specified `autoninja -C out/Default_browseros_arm64 chrome` build gate.

Completion requires merged changes and a successful full BrowserOS Neo release
workflow, including server, extension, Linux, Windows, macOS universal, and
browser draft creation. Verify the expected browser artifacts and source
identity. Production promotion remains a separate request.

---

### Packages Browseros Bos Build Docs Warpbuild Ci (`packages/browseros/bos_build/docs/warpbuild-ci.md`)

# WarpBuild Release CI

The release Linux and Windows browser lanes run Chromium builds on WarpBuild
Azure BYOC runners:

- `.github/workflows/release-linux.yml`
- `.github/workflows/release-windows.yml`
- `.github/workflows/build-browseros.yml`

The full product workflows call the Linux and Windows wrappers, which delegate
one native lane to the reusable `build-browseros.yml` workflow. That workflow
owns the WarpBuild checkout, cache, sync, one `bos_build` invocation, browser
artifact upload, and lane attestation. The wrappers own their product matrix
and queue watchdog. Signed macOS releases and nightlies use the repo-scoped Mac
builder; see `release-ci.md` and `nightly-macos-ci.md`.

## Runners

| Platform | Label | Image | Compute | Disk |
| --- | --- | --- | --- | --- |
| Linux x64 | `warp-custom-browseros-ubuntu-2204-x64-32x` | Ubuntu 22.04 | `Standard_D32alds_v7` | P40, 2048 GB |
| Windows x64 | `warp-custom-browseros-windows-2025-x64-32x` | Windows Server 2025 | `Standard_D32as_v5` | P30, 1024 GB |
| macOS arm64 | `warp-macos-26-arm64-12x` | macOS 26 | M4 Pro, 12 vCPU / 44 GB | 500 GB |

WarpBuild provisions the Linux and Windows runners in the BrowserOS Azure
subscription through the `browseros-ci-eastus` BYOC stack in East US. Both
configurations are on-demand, with no standby pool and static IPs disabled.
They are ephemeral:
the VM and build disk are created for a job and discarded afterward. Their
compute SKUs and disk capacities mirror the source Azure build VMs, but they
do not clone or retain those VMs' persistent disks.

WarpBuild's Windows Server 2025 image is Hypervisor Generation 1, so its VM
family must accept a Gen1 image. `Standard_D32as_v5` supports both Generation 1
and 2, making the current 32-vCPU/128-GiB configuration image-compatible. A
live smoke run successfully provisioned its VM and registered a GitHub runner.
`Standard_D32ls_v5` is Gen1-compatible too, but it was rejected for this stack
after East US returned HTTP 409 `SkuNotAvailable`; that is a regional-capacity
failure, not an image-generation mismatch. Dalsv7 is Generation 2-only, so
`Standard_D32als_v7` fails during Azure VM creation before a runner can
register with GitHub.

There is no 32-core macOS tier; 12x is WarpBuild's largest Mac. The macOS
label is kept in the runner catalog for future reusable `build-browseros.yml`
callers, but the current signed macOS release and nightly workflows use the
self-hosted `browseros-builder` runner. The macOS image version must satisfy
the chromium pin's SDK requirement — check
`build/config/mac/mac_sdk.gni` (`mac_sdk_official_version`) in the pinned
tree when bumping `CHROMIUM_VERSION`; chromium 148 needs the macOS 26 SDK,
and the macOS 15 image (Xcode 16.4 / SDK 15.5) fails compiling
`skia_utils_mac.mm` (`kCGImageByteOrder32Host` only exists in SDK 26).
WarpBuild runners register as self-hosted, so GitHub's 6-hour hosted-job
cap does not apply — but `timeout-minutes` must be set explicitly (the
implicit default is 360). The 2048 GB Linux and 1024 GB Windows build disks
leave ample headroom for the ~60-75 GB checkout and ~25-40 GB out dir. The
workflow prints `df -h` after each build. The WarpBuild BYOC connection and
runner configurations are the source of truth for labels, sizes, and Azure
placement; public docs pages can lag the live configuration.

## One-time setup (WarpBuild)

The `warpbuildbot` GitHub app is installed org-wide on `browseros-ai`
(since 2026-06-11). Two more things must be true before any `warp-*` job
leaves `queued`:

1. **The org must allow self-hosted runners on public repos.** WarpBuild
   runners register as org-level self-hosted runners, and GitHub blocks
   those on public repositories by default
   (https://www.warpbuild.com/docs/ci/public-repos). BrowserOS is public,
   so an org admin must check: Organization Settings → Actions → Runner
   groups → Default → "Allow public repositories". Via API (needs
   `admin:org` scope):

   ```bash
   gh auth refresh -h github.com -s admin:org
   gh api orgs/browseros-ai/actions/runner-groups \
     --jq '.runner_groups[] | {id, name, allows_public_repositories}'
   gh api -X PATCH "orgs/browseros-ai/actions/runner-groups/<id>" \
     -F allows_public_repositories=true
   ```

   Before flipping the toggle, check what else lives in that group — it
   widens exposure for every runner in it:

   ```bash
   gh api "orgs/browseros-ai/actions/runner-groups/<id>/runners" \
     --jq '.runners[] | {name, status, labels: [.labels[].name]}'
   ```

   Expect only ephemeral `warp-*` runners (usually none while idle). The
   signed-nightly Mac (`browseros-builder`) is registered at the repo
   level, so this org-group toggle does not change its exposure. If the
   group ever holds other persistent org-level runners, give WarpBuild a
   dedicated runner group instead of widening Default.

   Done for `browseros-ai` on 2026-06-13 — pickup verified live (a
   queued job was claimed within ~60 s of dispatch).

2. **The Azure BYOC connection must be healthy**: sign in at
   https://app.warpbuild.com/ and confirm the BrowserOS Azure subscription,
   stack `browseros-ci-eastus` in East US, and both custom runner
   configurations listed above. Also check Azure quota and regional capacity
   for their VM SKUs when provisioning fails.

Smoke test the platform whose runner configuration changed:

```bash
gh workflow run release-linux.yml -f products=browseros -f upload_to_r2=false
gh workflow run release-windows.yml \
  -f products=browserclaw \
  -f sign=false \
  -f upload_to_r2=false
```

Then watch its build job leave `queued` within ~5 minutes (`gh run watch`).
Only dispatch one when you intentionally want to spend Azure compute time.

## Release lane flow

`release-linux.yml` and `release-windows.yml` select products (`browseros`,
`browserclaw`, or `all`) and call
`.github/workflows/build-browseros.yml` with `profile=release-ci`. Full product
releases set `resource-mode=published`, pass the frozen dispatch SHA, and build
one product after its server and extension workflows publish their `latest`
resources. Standalone wrapper dispatches use the same published-resource path.
Linux is unsigned. Windows follows the caller's `sign` input.

Linux also accepts `arch=x64|arm64|all` (default x64). The product-by-architecture
matrix cross-compiles arm64 on the existing x64 runner. Its entries run serially
because both architectures merge one product/version's `linux/release.json`;
the queue watchdog succeeds on the first runner pickup rather than timing out
on intentionally queued siblings. Published resources support both targets;
source mode is limited to x64. A dual-architecture standalone build requires one
product and exact `server_version`, `extension_version`, and `onboarding_version`
inputs; full product releases supply those pins. See [Linux arm64](linux-arm64.md).

The reusable workflow performs the per-platform recipe:

1. `actions/checkout`.
2. On Windows, select
   `$RUNNER_TEMP/browseros-global.gitconfig` through `GIT_CONFIG_GLOBAL`,
   write depot_tools' required Git settings with PATH Git, and export the
   selection to every later step. This is deliberately after repository
   checkout but before any Chromium/depot_tools operation. Linux and macOS
   skip the step.
3. `astral-sh/setup-uv`, resolve the Chromium pin and paths, then restore the
   pinned chromium checkout from cache (see below).
4. `browseros source ensure --reset --repair-cached-depot-tools` —
   fetches only the missing exact tag, resets source and gclient-managed Git
   repositories, and syncs dependencies/hooks after destructive cleanup.
   Existing `.gclient` settings and full history are preserved. Only line-ending
   drift in cached depot_tools is repaired; substantive changes fail closed.
5. `browseros source clean-outputs --all-products ...` — removes known product
   output/checkpoint state and prunes retired resource families in the selected
   BrowserOS repository. This does not delete hook-managed toolchains.
6. Preparation failure stops before cache publication or product patching.
7. Save the cache (only when the restore missed, i.e. first run per pin).
8. In source mode, download and validate the prepared common-resource artifact.
   Set up Bun for the BrowserOS server or the native Rust target for the
   BrowserOS neo server.
9. Invoke `uv run browseros build` once with the selected profile, product,
   architecture, resource mode, Chromium path, signing/upload switches, and
   prepared directory. `bos_build` builds the native server, stages validated
   resources, compiles, packages, signs when requested, uploads browser
   deliverables, and writes the lane manifest.
10. Upload the lane manifest with 30-day retention in source mode and browser
    build artifacts with 14-day retention.

Source mode never downloads server, onboarding, or product-extension resources
from R2; the only downloaded build input is the prepared GitHub artifact.
Published mode deliberately retains the `download_resources` provider.

The `release-ci` profile is the release preset minus `clean`/`git_setup`
(steps 5-6 replace them). Why not run `git_setup` as-is: it does
`git fetch --tags`, which on the shallow CI clone would pull objects for all
~70k chromium tags; the script instead fetches exactly the pinned tag at depth
2. On Windows the `mini_installer` module builds the installer that the signing
step signs when `sign=true`.

## Caching strategy

Cache key: `chromium-src-<platform>-<arch>-v2-<CHROMIUM_VERSION>`. Contents:
the whole gclient root (depot_tools, `.gclient`, post-sync `src`) captured
immediately after `gclient sync`, before patches and before any `out/` dir
exists — pristine and deterministic. The pin changes rarely, so steady state
is one cold sync per chromium bump per platform.

Generation `v2` was introduced after the Windows Git bootstrap standardized
`core.autocrlf=false`. It deliberately has no `v1` fallback: those immutable
archives may contain a depot_tools worktree checked out under the previous
line-ending policy. The first `v2` run per platform is therefore cold and
publishes a cache under the current policy.

- **Linux / macOS — WarpCache** (`WarpBuilds/cache@v1`): drop-in for
  `actions/cache` with no size cap (entries expire 7 days after last use).
  Restore-keys fall back to the previous pin's cache, then the script
  fast-forwards `src` with a single-tag fetch.
- **Windows — R2 tarball** (`browseros source cache`): WarpCache does not
  support Windows runners and `actions/cache` caps at 10 GB/repo. The tree
  is zstd-tarred (~25-30 GB) into `ci-cache/chromium/` in the existing R2
  bucket using the same `R2_*` secrets the build already needs for
  `download_resources`. R2 has zero egress fees. Missing credentials or a
  cache miss degrade to a cold checkout, never a failure.

Expected timings (32-core linux/windows, M4 Pro mac):

| Phase | Cold (first run / pin bump) | Warm |
| --- | --- | --- |
| Checkout + sync | 40-70 min | restore 3-10 min + sync 5-15 min |
| Compile + package | 2.5-6 h (per platform) | same — out/ is rebuilt per run |
| Total | ~4-7 h | ~3-6 h |

The compile dominates either way; the cache removes the checkout cost and
network flakiness. Toolchains deleted by `clean` (~2-4 GB) are re-fetched by
hooks each run — accepted, matches the maintainer's local flow.

Linux and Windows compute and managed-disk costs accrue in the BrowserOS Azure
subscription; WarpBuild's managed-runner list prices do not apply. Use Azure
Cost Management for the actual BYOC cost and the WarpBuild account for any
separate platform or cache charges. Current signed macOS release and nightly
builds run on the self-hosted Mac Mini.

Azure BYOC does not support WarpBuild snapshot runners. Keep checkout
acceleration on WarpCache for Linux and the R2 tarball for Windows; do not add
`snapshot.key` runner syntax or `WarpBuilds/snapshot-save` to these lanes.

### Future optimizations (not yet wired)

- **Compiler cache (sccache/ccache via `cc_wrapper`)** in a CI gn flags
  variant: release rebuilds often differ only slightly, so this is the lever
  that could cut warm builds to well under an hour.

## Operating release lanes

```bash
# BrowserOS Linux build from intentionally published component resources.
gh workflow run release-linux.yml \
  -f products=browseros \
  -f upload_to_r2=false

# BrowserClaw unsigned Windows verification without R2 upload.
gh workflow run release-windows.yml \
  -f products=browserclaw \
  -f sign=false \
  -f upload_to_r2=false

# Full releases publish components before building the native matrices.
gh workflow run release-browseros.yml --ref main
gh workflow run release-browserclaw.yml --ref main
```

Manual wrapper dispatches and signed nightlies use published mode. Source mode
remains available through `workflow_call` for specialized prepared-source
builds. Retry a failed full-release lane with
`gh run rerun <run-id> --failed` so it retains the original source SHA and run
ID. Successful lanes from an earlier rerun attempt remain valid.

The first run per platform is the cache warm-up; expect cold timings. If a
pin bump lands, the next run is cold again for that version. To force a fresh
checkout, bump the `v2` in the cache key (workflow) — for Windows also delete
the old object under `ci-cache/chromium/` in R2.

## Troubleshooting: depot_tools cannot read global Git config

The Windows failure signature is
`fatal: unable to read config file 'C:/Users/runneradmin/.gitconfig'`, followed
by depot_tools' recommended core settings, a stray `'failed' is not
recognized` message, and gclient exit `9009`. This occurs after the runner has
started; it is not an Azure provisioning, cache, or clean failure.

The reusable workflow does not depend on the runner account's HOME, XDG, or
AppData mapping. Its Windows-only bootstrap selects a disposable file under
`RUNNER_TEMP` with `GIT_CONFIG_GLOBAL`, writes the four Chromium settings plus
`depot-tools.allowGlobalGitConfig=true`, and verifies each value before source
setup. It uses PATH Git intentionally because depot_tools may not exist on a
cold checkout. Later depot_tools `git.bat` and `gclient.bat` processes inherit
the same `GIT_CONFIG_GLOBAL`, so warm and cold checkouts share one explicit
configuration.

If this signature returns, inspect the "Configure Git for depot_tools" step and
confirm its five read-back checks passed and its `GITHUB_ENV` assignment names
the temporary file. Fix the workflow contract; do not modify the runner image
or create `C:/Users/runneradmin/.gitconfig` manually. WarpBuild runners are
ephemeral, and account-level repair would disappear with the VM while
reintroducing HOME-resolution ambiguity.

## Troubleshooting: cached depot_tools appears all-dirty

The Windows cache-policy migration failure occurs after R2 restore and the
Chromium clean step. `gclient.bat` starts, prints `Updating depot_tools...`,
then Git reports `Your local changes to the following files would be
overwritten by checkout` for most depot_tools files, followed by `Aborting`
and `Failed to update depot_tools`. This is distinct from the missing-global-
config signature above and from Azure runner provisioning.

An archive written under `core.autocrlf=true` can restore CRLF working-tree
bytes whose index contains LF. Once the job selects `core.autocrlf=false`,
Git correctly sees those tracked files as modified. Chromium's later clean
module resets `src`, but depot_tools self-update happens before anything else
resets the depot_tools worktree.

The reusable workflow passes `--repair-cached-depot-tools` only on its
disposable source-provisioning calls. The provisioner validates the repository
and classifies its tracked diff. It resets and verifies the checkout only when
every change is line-ending-only. If it finds substantive tracked changes, it
fails with `substantive tracked changes` and preserves the files; this prevents
cache corruption from being silently masked. It likewise rejects non-default
index flags such as assume-unchanged or skip-worktree, because those flags can
hide real content from status and diff. The flag defaults off for local CLI
use, so developer-owned depot_tools edits are never reset implicitly. Untracked
files are preserved.

Cache generation `v2` has no `v1` fallback, so normal recovery is a cold sync
followed by a new archive under the current Git policy. If this signature
appears on a `v2` hit, inspect the source-ensure log for either the normalization
message or the fail-closed error. Do not delete files in a persistent checkout
and do not broaden the repair to unconditional `git reset --hard`.

## Troubleshooting: jobs stuck in `queued`

A job no runner ever picked up shows `runner_id: 0` and empty steps:

```bash
gh run view <run-id> --json jobs --jq '.jobs[] | {name, status}'
gh api repos/browseros-ai/BrowserOS/actions/jobs/<job-id> \
  --jq '{status, runner_id, runner_name, labels}'
```

Causes, in the order to check:

1. **Runner group blocks public repos** — see one-time setup above. This
   stalls all platforms at once.
2. **Label does not match a live runner configuration** — compare the job
   label with the two exact custom labels above in
   https://app.warpbuild.com/. An unsupported label queues forever;
   WarpBuild reports no error back to GitHub.
3. **Azure BYOC stack** — confirm the connection and stack are healthy, then
   open the BYOC stack's launch errors and inspect `LaunchInstances`. An Azure
   400 that reports an image/VM-size generation mismatch means the image and
   selected VM family support different Hypervisor Generations; choose a
   Gen1-compatible size for the current Windows image. An Azure 409
   `SkuNotAvailable` is different: the requested SKU has no capacity for that
   subscription, location, or zone. Check quota and regional capacity in the
   configured region, then choose a regionally available Gen1-compatible size.
   `Standard_D32as_v4` is the verified-family fallback if D32as v5 is
   unavailable, but confirm its capacity in East US before switching.
4. **WarpBuild incident** — check their dashboard.

Mechanics worth knowing:

- GitHub discards self-hosted jobs queued for more than 24h, and each release
  platform workflow has a concurrency group (`release-linux` or
  `release-windows`) with `cancel-in-progress: false`. A queued build can
  therefore pin the platform lane for a full day. Linux's `queue-watchdog`
  exits after the first runner pickup; later matrix entries intentionally queue
  behind it. If no Linux job starts, the watchdog cancels at 20 minutes. The
  Windows watchdog steps in at the 20-minute mark: it cancels the run when no build job is
  actually running (everything stuck in queue or already finished), and fails
  loudly without cancelling while any build is in progress. In that mixed
  case, cancel the run manually once the live builds finish — a still-queued
  job otherwise pins the group for up to 24h with no watcher left.
- Do not rely on a configuration fix to repair the current release.
  Unsupported labels need a new `workflow_job.queued` webhook; Azure launch
  failures may be retried while a job is queued, but the lane's watchdog may
  already have failed. After correcting the configuration, cancel the stuck
  run and re-dispatch according to the release procedure.
- A job that IS picked up but dies in "Set up job" within seconds with
  `Unable to resolve action <owner>/<name>@vN` has nothing to do with
  WarpBuild: the floating major tag does not exist upstream (e.g.
  astral-sh/setup-uv publishes v8.x.y releases but no `v8` tag). Pin an
  exact existing version.

---

### Packages Browseros Bos Build Docs Windows Install Verification (`packages/browseros/bos_build/docs/windows-install-verification.md`)

# Windows Install Verification Checklist

Use a Windows machine or VM with a clean user profile when verifying a fresh
install. BrowserOS installs per-user; the Apps & Features entry is under:

`HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall`

## Fresh Install

- [ ] Download the Windows installer artifact and double-click it.
- [ ] A progress window appears with the title/text `Installing BrowserOS…`.
- [ ] The installer window closes when installation completes.
- [ ] BrowserOS launches automatically after the fresh install.
- [ ] Apps & Features shows `BrowserOS`.
- [ ] Apps & Features shows publisher `BrowserOS Software Inc`.
- [ ] Apps & Features shows the BrowserOS icon.
- [ ] Apps & Features shows the expected version.
- [ ] A Start Menu shortcut exists and launches BrowserOS.
- [ ] A desktop shortcut exists and launches BrowserOS.

## Update Path

- [ ] Install an older BrowserOS version.
- [ ] Open `chrome://settings/help` and let WinSparkle find the newer update.
- [ ] Start the update from the WinSparkle flow.
- [ ] No installer progress window appears during the update.
- [ ] BrowserOS does not auto-launch as part of the update install.
- [ ] Relaunch BrowserOS after the update completes.
- [ ] `chrome://settings/help` shows the new expected version.
- [ ] `WinSparkle.dll` exists in
      `%LOCALAPPDATA%\BrowserOS\Application\<version>\`.

## Silent Fresh Install

- [ ] Run the installer with `--silent` from Command Prompt or PowerShell.
- [ ] No installer UI appears.
- [ ] BrowserOS is installed successfully.
- [ ] BrowserOS does not auto-launch during the silent install.

## Portable Zip

- [ ] Download the portable zip artifact.
- [ ] Extract the zip.
- [ ] The extracted contents include the Windows installer executable.

---

### Packages Browseros Bos Build Docs Windows Sdk Setup (`packages/browseros/bos_build/docs/windows-sdk-setup.md`)

# Windows SDK setup

Windows release/debug plans run `windows_sdk` after source preparation and before product resources and patches. It also runs for prepared CI checkouts (`--provision none`). Planning with `--show-plan` does not inspect source or install anything.

The selected Chromium tag supplies both SDK directory pins (`build/vs_toolchain.py` and `build/toolchain/win/setup_toolchain.py`) and the package requirement (`docs/windows_build_instructions.md`). For example, SDK package `10.0.28000.2270` installs into directory `10.0.28000.0`. An older source checkout or conflicting requirements fail before installation.

To check an already prepared checkout without building:

```powershell
uv run --project packages/browseros browseros build --modules windows_sdk `
  --chromium-src C:/chromium/src --arch x64 --build-type release
```

Local builds only check. When prerequisites are missing, install the package requested by the pinned Chromium documentation from [Microsoft's SDK downloads](https://learn.microsoft.com/en-us/windows/apps/windows-sdk/downloads), selecting Desktop C++ x86/x64 and Debugging Tools for Windows, then rerun. ARM64 builds additionally need their existing target libraries and debugging tools; automatic installation is currently scoped to the x64 CI lane.

The reusable Windows build explicitly sets `BROWSEROS_INSTALL_WINDOWS_SDK=1`. Installation additionally requires `GITHUB_ACTIONS=true` and an already elevated process. The module never opens a UAC prompt or requests a restart. It resolves the exact package from Microsoft's supported downloads table and validates its Microsoft Authenticode signature before launching the quiet installer. Installation is machine-wide; `WINDOWSSDKDIR`, when set, selects the same root used by Chromium.

Every invocation verifies nonempty headers, libraries, resource/manifest/IDL tools, and debugging DLLs, plus machine registration at or above the required servicing version in the same SDK family. It then runs the pinned Chromium `vs_toolchain.py get_toolchain_dir` and `setup_toolchain.py` for x86/x64 (and ARM64 when requested). The environment-block argument is `none`, so these checks generate no environment files, GN files, or Ninja files.

An installer failure leaves logs in the printed `browseros-windows-sdk-*` directory under `RUNNER_TEMP` on managed CI. The reusable workflow uploads those logs as `windows-sdk-logs-<product>-<arch>` even if the build fails, retaining them for 14 days. Only the transient “another installation is running” result is automatically retried, up to three attempts. Other failures stop the build and can be retried after fixing the reported cause; there is no completion marker that could conceal a partial installation. A successful installer result still requires the file and Chromium environment checks to pass. A reboot-required result is reported, then accepted only if those checks succeed immediately.

Microsoft's [runner image installation script](https://github.com/actions/runner-images/blob/main/images/windows/scripts/build/Install-VisualStudio.ps1) documents the SDK feature selection and quiet/no-restart pattern; [Windows Installer error codes](https://learn.microsoft.com/en-us/windows/win32/msi/error-codes) describe the busy and reboot results. A passing SDK check establishes SDK environment readiness, not a complete Chromium build or release.

---

--- METRICS ---
- Files Extracted: 50
- Estimated Token Budget: ~66733 tokens
- Canonical Reference: https://codewiki.google/github.com/browseros-ai/BrowserOS
