Technical Documentation: browseros-ai/BrowserOS
ℹ️ Provenance: Multi-Tier Ingestion · CodeWiki Reference
Overview (README.md)
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
brew tap browseros-ai/tap
brew install --cask browseros-neoPrefer a direct download? Grab it for macOS, Windows, or Linux x64 (AppImage · 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
| Live dashboard
| Your new tab shows every agent working right now: which site it's on, what it's doing, how far along. Docs | |
|---|---|
| One-click connect | |
| Automatically connects to every harness. We built tools optimized for web use! Docs | |
| Replay every session | |
| Every session is saved as a scrubbable video on your disk with a step-by-step action timeline. Rewind and see exactly what happened. Docs |
- Your logins. Agents automate your real work using your logged-in accounts, not a blank sandbox. 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
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
| | BrowserOS, the AI browser for humans
A Chromium fork with an AI agent built into every new tab, for when you are the one browsing. Bring your own AI keys or run everything locally with Ollama.
Read about BrowserOS · Website · Docs |
| --- | --- |
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.
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 · Slack
- Report a bug
- BrowserOS neo docs · BrowserOS docs
- Enterprise deployment: [email protected]
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 |
Chromium fork: patches, build system, signing |
apps/claw-server |
BrowserOS neo backend: MCP endpoint agents connect to, plus the API behind the dashboard |
apps/claw-app |
BrowserOS neo new-tab dashboard: watch, replay, and manage agent sessions |
apps/claw-onboard |
BrowserOS neo first-run onboarding |
apps/server |
Bun server exposing the browser MCP tools and running the BrowserOS AI agent loop |
apps/app |
BrowserOS extension: new tab, side panel chat, onboarding, settings |
apps/app-onboard |
BrowserOS first-run onboarding |
Contributing
We'd love your help making BrowserOS neo and BrowserOS better. Start with the Contributing Guide, which routes you to the right path.
- BrowserOS neo (TypeScript, React, Rust): setup guide. Around 15 minutes.
- BrowserOS (TypeScript, React, Bun): setup guide. Around 15 minutes.
- Browser (C++, Python): requires ~100GB of disk. See the root guide.
Credits
- ungoogled-chromium: we use some of its patches for enhanced privacy. Thanks to everyone behind this project.
- The Chromium Project: 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:
@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.
Copyright © 2026 Felafax, Inc.
Watch the repo if you want to hear when agents can do something new.
Stargazers
Thank you to all our supporters.
| Nikhil | Nithin | Dani |
|---|---|---|
Index (`docs/index.mdx`)
title: "BrowserOS neo" 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"
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
See it in action
Three steps from asking your AI to replaying what it did.
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.
Get started
Browseros Index (`docs/browseros/index.mdx`)
title: "BrowserOS"
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
Quick Start
```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).<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>Which AI Model Should I Use?
- **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.| 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>Why BrowserOS?
Community
Browseros Update Index (`docs/browseros/update/index.mdx`)
title: "Update BrowserOS"
Select your platform for step-by-step update instructions:
Neo Mcp Index (`docs/neo/mcp/index.mdx`)
title: "Connect your agent" 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 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:
http://127.0.0.1:9200/mcpThat 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.
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.
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 and open a new discussion. A short template that helps us move fast:
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 setupWhile you're waiting for one-click support, two other paths work with almost every AI tool.
Where to next
Changelog (`docs/changelog.mdx`)
title: "Changelog"
import Shared from '/snippets/changelog.mdx'
Contributing (`docs/contributing.mdx`)
title: "Contributing to BrowserOS"
import Shared from '/snippets/contributing.mdx'
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"
import Shared from '/snippets/changelog.mdx'
Browseros Contributing (`docs/browseros/contributing.mdx`)
title: "Contributing to BrowserOS"
import Shared from '/snippets/contributing.mdx'
Browseros Onboarding (`docs/browseros/onboarding.mdx`)
title: "Getting Started"
Welcome to BrowserOS! Let's get you set up.
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>**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>- **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>You're all set!
Explore what BrowserOS can do:
Neo Audit And Replay (`docs/neo/audit-and-replay.mdx`)
title: "Audit and replay" 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.
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.
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.
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.sqliteis 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.
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:
Neo Cockpit (`docs/neo/cockpit.mdx`)
title: "Your dashboard" 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
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
Neo How It Works (`docs/neo/how-it-works.mdx`)
title: "How BrowserOS neo works" 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.
Once it's open, it works like Chrome or any other browser you've used. Bookmarks, extensions, keyboard shortcuts, all in the same places.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><Frame caption="The connect page: one endpoint, one click per AI tool.">
</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>```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.<Frame caption="Every running AI and every finished session, at a glance.">
</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.<Frame caption="Replay any session like a video. Scrub through, see exactly what your AI saw at every moment.">
</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.Where to next
Neo Install (`docs/neo/install.mdx`)
title: "Install BrowserOS neo" 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.
macOS
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.Windows
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.
Next
Neo Privacy (`docs/neo/privacy.mdx`)
title: "Privacy and data" 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 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, 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 (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
Where to next
Neo Tabs And Isolation (`docs/neo/tabs-and-isolation.mdx`)
title: "Your tabs and agent tabs" 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
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.
v0.46.0
June 17, 2026
- 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
March 20, 2026
- 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
March 12, 2026
- 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 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
March 9, 2026
- 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 →
- 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
v0.41.0
March 4, 2026
- 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
February 16, 2026
- 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
February 3, 2026
- 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
v0.38.0
January 28, 2026
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.settingsnot 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
January 21, 2026
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.
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 →
v0.36.3
January 15, 2026
- Agent history — Agent conversations are now saved automatically. View and resume them anytime from the Assistant panel
v0.36.2
January 10, 2026
Bug fix release focused on MCP stability.
- MCP server disconnect fix — Fixed port handling issue causing MCP connections to drop unexpectedly
v0.36.0
January 8, 2026
- 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
December 25, 2025
- 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
December 20, 2025
- 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
December 18, 2025
- 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
December 12, 2025
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
November 14, 2025
- 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
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
Ways to Contribute
Report bugs — Open an issue with steps to reproduce, expected vs actual behavior, and screenshots.
Suggest features — Share ideas on GitHub or Discord.
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
Setup
# 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.developmentRunning Locally
# Terminal 1: Start the server
bun run start:server
# Terminal 2: Start the agent extension (dev mode)
bun run start:agentThen load the extension in BrowserOS:
- Go to
chrome://extensions/ - Enable Developer mode
- 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
Build Instructions
1. Clone Chromium source
Follow the official Chromium: 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
# Install UV
curl -LsSf https://astral.sh/uv/install.sh | sh
# Navigate to build system
cd packages/browseros
# Install dependencies
uv sync3. Build debug version
uv run browseros build \
--chromium-src <your-chromium-src-path> \
--setup \
--prep \
--build \
--build-type debugThe --setup and --prep flags are only needed for the first build. After that, just use --build for incremental builds:
uv run browseros build --chromium-src <path> --build --build-type debug4. Run BrowserOS
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
- Fork the repository on GitHub
- Clone your fork locally
- Create a branch:
git checkout -b feature/your-feature - Make changes and test them
- Commit:
git commit -m "feat: add your feature" - Push:
git push origin feature/your-feature - 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 CLACode Standards
TypeScript:
- Use strict typing, avoid
any - Use Zod schemas instead of TypeScript interfaces
- Use path aliases (
@/lib) not relative paths (../) - Naming:
PascalCasefor classes,camelCasefor 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
- GitHub Issues — github.com/BrowserOS-ai/BrowserOS/issues
- GitHub Discussions — 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"
Both BrowserOS MCP and 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
```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.```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).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"
Both BrowserOS Cowork and Claude 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 |
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
- 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- 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 toolsWhere 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"
OpenClaw 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 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 |
| 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
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"
BrowserOS supports full ad blocking through uBlock Origin, the most powerful open-source ad blocker available — the full extension, not the watered-down "Lite" version.
Why BrowserOS?
Chrome killed support 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.
BrowserOS vs Chrome
We ran both browsers through adblock.turtlecute.org, a test that measures how effectively a browser blocks ads and tracking scripts.
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"
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"
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.
Sign in with your OpenAI account. Access GPT-5 Codex, GPT-5.4, and the full Codex lineup with up to 400K context.Sign in with your GitHub account. Access 19+ models including Claude, GPT-5, and Gemini through one subscription.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) |
Kimi K2.5 — In Partnership with Moonshot AI
{/* */}
BrowserOS has partnered with Moonshot AI 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.
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:
- Go to platform.moonshot.ai and create an account
- Navigate to the API keys section in your dashboard
- Click Create new API key and copy the key
Add to BrowserOS:
- Go to
chrome://browseros/settings - Click USE on the Moonshot AI card
- Enter your API key (it will be encrypted and stored locally on your machine)
- The model is pre-configured to
kimi-k2.5with a 128,000 context window - Click Save
Cloud Providers
Connect to powerful AI models using your API keys. Your keys stay on your machine — requests go directly to the provider.
**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****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****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****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****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****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****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>Local Models
Switching Between Models
Use the model switcher in the Assistant panel to change providers anytime. The default provider is highlighted.
Browseros Features Chatgpt Pro Oauth (`docs/browseros/features/chatgpt-pro-oauth.mdx`)
title: "ChatGPT Pro / Plus"
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 |
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.
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"
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"
How It Works
BrowserOS uses the Model Context Protocol (MCP) 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.
{/*
*/}See Smart Nudges 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
40+ Supported Apps
BrowserOS connects to over 40 apps across every category you need.
Example Prompts
The assistant figures out which apps to use based on what you ask. Just describe what you want in plain language.
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.
Add a Custom MCP Server
You can connect any MCP-compatible server that exposes an SSE endpoint.
- Go to Settings > Connected Apps
- Click Add custom app
- 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.
Connect to OAuth-Protected Remote Servers
Some remote MCP servers (like Atlassian Jira, GitHub, etc.) require OAuth authentication. Use mcp-remote and supergateway to handle the OAuth flow locally:
npx -y supergateway --stdio "npx -y mcp-remote https://mcp.atlassian.com/v1/sse" --port 8000A browser window will open to sign in. Once authenticated, add http://localhost:8000/sse as a custom MCP in BrowserOS.
Privacy and Security
Browseros Features Cowork (`docs/browseros/features/cowork.mdx`)
title: "Cowork"
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"
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:
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
The agent is sandboxed to your selected folder. It cannot access files outside of it.
Filesystem Tools
Cowork provides 7 filesystem tools that the agent can use alongside browser automation:
| 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.| Parameter | Type | Description |
|-----------|------|-------------|
| `path` | string (required) | File path relative to working directory |
| `content` | string (required) | Complete file content to write || 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.| 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.| 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.| 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) || Parameter | Type | Description |
|-----------|------|-------------|
| `path` | string (optional) | Directory path (default: working directory) |
| `limit` | number (optional) | Max entries (default: 500) |
Entries are sorted alphabetically, case-insensitive.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:
Example Use Cases
Security
Browseros Features Github Copilot Oauth (`docs/browseros/features/github-copilot-oauth.mdx`)
title: "GitHub Copilot"
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.
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.
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 |
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"
BrowserOS works great with local models for Chat Mode. Run models completely offline — your data never leaves your machine.
Context Length
Set context length when starting Ollama:
OLLAMA_CONTEXT_LENGTH=20000 ollama serveIncreasing context length uses more VRAM. Run ollama ps to check your current allocation. See the Ollama context length docs for more details.
Setup
<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><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>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 |
Browseros Features Scheduled Tasks (`docs/browseros/features/scheduled-tasks.mdx`)
title: "Scheduled Tasks"
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"
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 for more details.
From settings
Schedule Types
Example Use Cases
Your scheduled task prompts can be as complex as you want. If you have connected apps 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
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.
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
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 for more details.
Privacy
Browseros Features Smart Nudges (`docs/browseros/features/smart-nudges.mdx`)
title: "Smart Nudges"
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.
What happens after you choose
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 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.
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:
The agent will infer the task name, schedule type, and timing from your conversation and show the scheduling card immediately.What gets scheduled
The scheduling card pre-fills the 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
Browseros Features Sync To Cloud (`docs/browseros/features/sync-to-cloud.mdx`)
title: "Sync to Cloud"
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.
How to Sign In
What Gets Synced
**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.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.
Security
Browseros Features Use With Claude Code (`docs/browseros/features/use-with-claude-code.mdx`)
title: "MCP Clients (Claude Code, OpenClaw)"
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.
Why Use BrowserOS with Claude Code?
Getting Started
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
```Replace the URL with your BrowserOS MCP URL from settings.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.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 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.
All commands below use port 9239 — replace it with the port shown on your chrome://browseros/mcp settings page.
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.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>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>Example Prompts
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 errorsCapture 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 matchesAccess your email directly from the agent — read, search, and summarize without switching windows.
Read my latest Gmail messages and summarize themChain 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 SlackBrowser Automation Tools
BrowserOS exposes 53 browser automation tools to MCP clients, organized into the following categories:
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
Supported Services
Demo Videos
Agentic coding workflow
Browser automation with Claude Code
Browseros Features Vertical Tabs (`docs/browseros/features/vertical-tabs.mdx`)
title: "Vertical Tabs"
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:
Enabling Vertical Tabs
Toggle vertical tabs on or off from the Customization settings page.
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"
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 n8nor install globally withnpm install n8n)
Setup
1. Install the MCP community node
In n8n, go to Settings → Community Nodes and install n8n-nodes-mcp:
2. Create a workflow
Build a workflow with these nodes:
- Add a Chat Trigger node (receives your messages)
- Add an AI Agent node and connect it to the trigger
- Add a Chat Model under the AI Agent (e.g., OpenAI, Claude)
- Add an MCP Client Tool under the AI Agent
3. Configure the AI Agent
In the AI Agent node, set Source for Prompt to Connected Chat Trigger Node.
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
5. Test it
Save the workflow, click Open chat, and try:
open google.com in BrowserOSTroubleshooting
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?"
If you see "Failed to Fetch" or "Unable to connect to BrowserOS agent", your agent has been killed.
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.
To fix this, go to Windows Security → Allow an app through your network settings, and make sure BrowserOS Agent is enabled.
Fix It
<Frame>
</Frame><Frame>
</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>Still Not Working?
<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.**Windows users:** Antivirus software sometimes triggers a false positive. Try temporarily disabling your antivirus and restarting BrowserOS.Get Help
If you're still experiencing issues, reach out:
Browseros Update Linux (`docs/browseros/update/linux.mdx`)
title: "Update on Linux"
<Frame>
</Frame>Browseros Update Macos (`docs/browseros/update/macos.mdx`)
title: "Update on macOS"
<Frame>
</Frame>Browseros Update Windows (`docs/browseros/update/windows.mdx`)
title: "Update on Windows"
<Frame>
</Frame><Frame>
</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>
</Frame>
<Note>If BrowserOS was already running, close it completely and reopen it for the update to take effect.</Note><Frame>
</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>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" keywords: ["Claude Desktop MCP", "Claude Cowork MCP", "BrowserOS neo Claude Desktop extension"]
Claude Desktop and Claude Cowork both run inside the same Claude app. A single BrowserOS neo extension gives them both a real browser to work in.
Install
Verify
Open BrowserOS neo, then in Claude Desktop ask:
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.
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
Neo Mcp Manual (`docs/neo/mcp/manual.mdx`)
title: "Manual URL setup" 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:
http://127.0.0.1:9200/mcpNow pick your AI tool below.
Install the skill
The skill is one SKILL.md file, published from the BrowserOS repository. Most agents read skills from a shared .agents/skills directory, and the quickest way to put it there is the skills.sh CLI:
npx skills add browseros-ai/browseros --skill browseros-neoThat 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 from Nous Research supports connecting to external HTTP MCP servers via its YAML config. Full details in Hermes' MCP docs.
Open ~/.hermes/config.yaml and add a mcp_servers entry:
mcp_servers:
browseros-neo:
url: "http://127.0.0.1:9200/mcp"Then reload Hermes:
- Inside an existing
hermes chatsession, 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:
hermes skills install https://raw.githubusercontent.com/browseros-ai/BrowserOS/main/skills/browseros-neo/SKILL.mdCheck 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.
Vercel AI SDK
The Vercel AI SDK supports MCP tools via the @ai-sdk/mcp package. Full details in the AI SDK MCP docs. Point the client at BrowserOS neo's endpoint URL, pull the tools, and pass them into streamText or generateText.
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:
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 covers loading names and descriptions up front and fetching the full text on demand with a loadSkill tool.
OpenClaw
OpenClaw is an open-source personal AI assistant that can act as an MCP client. Full details in OpenClaw's MCP docs.
The fastest path is the CLI:
openclaw mcp add browseros-neo --url http://127.0.0.1:9200/mcp --transport streamable-httpOr edit ~/.openclaw/openclaw.json directly:
{
"mcp": {
"servers": {
"browseros-neo": {
"url": "http://127.0.0.1:9200/mcp",
"transport": "streamable-http"
}
}
}
}Verify the connection with the built-in doctor:
openclaw mcp doctor browseros-neo --probeAdding 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:
openclaw skills install skills-sh:browseros-ai/browseros/browseros-neoAdd --global to install it for every workspace. Confirm with openclaw skills list. Full details in OpenClaw's skills docs.
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:
https://raw.githubusercontent.com/browseros-ai/BrowserOS/main/skills/browseros-neo/SKILL.mdIf you get your AI tool talking to BrowserOS neo and want to help others do the same, please open a discussion with the setup steps.
Where to next
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. 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.
# 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 carrymodules: as an explicit opt-in — a local, commentable file that bypasses the
planner entirely:
# 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 onlyPlanner-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:
browseros build --modules clean,compile,sign_macos --product browseros
browseros build --list # every available stepPhase flags are the middle ground — auto-ordered, no explicit step list:
browseros build --setup --build --sign --package
browseros build --build --sign # skip setupNote that --prep does not apply series_patches. Runbrowseros build -m series_patches separately if you need them.
Remote and ephemeral runners
A fresh machine needs nothing outside this package:
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 x64The 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//product.py with aProductDescriptor.define() call — about five irreducible inputs, roughly forty
fields derived by convention, keyword overrides for deviations — plus its server
bundle definitions. Verify with:
browseros product doctor # identity uniqueness + branding assetsPackages 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; 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 itsreleases/browserclaw/<version>/linux/release.json lists both x64_deb andarm64_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 CDNBuild locally
From packages/browseros:
# 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 downA local .deb named like a release package (BrowserOS_neo_v<version>_<arch>.deb)
supplies the version and platform itself; otherwise pass --version.
Publish
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=trueThe 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 haswrite:packages, and with a buildx builder that can build arm64 and amd64:
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 anorg.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 mergesbrowseros.server.allow_remote_in_mcp: trueinto
the profile'sLocal Statebefore Neo starts. - Shutdown quits Neo over CDP.
neo-quitsendsBrowser.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-sandboxwarning bar. - claw-server runs in hosted mode (
BROWSERCLAW_MODE=hosted): agents get the browser
tools without skills, human help orname_session, and name tasks with ataskName
argument. The entrypoint also turns human help off through/api/v1/settings/agenton
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.
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 selectionMetadata 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:
gh workflow run release-browserclaw.yml --ref main \
-f platforms=linux -f linux_arch=arm64 -f publication=draft-onlyThis 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:
BrowserOS_neo_v<VERSION>_arm64.AppImage
BrowserOS_neo_v<VERSION>_arm64.debFor standalone Linux builds using the existing published resources:
gh workflow run release-linux.yml --ref main \
-f products=browserclaw -f arch=arm64 -f upload_to_r2=trueA 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 aslatest 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.
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 pinsserver, agent, and the existing app-onboard version. BrowserOS neo pinsclaw-server-rust, browserclaw, and the existing claw-onboard version.
Onboarding bundles continue to release independently.
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 prereleaseA sibling build or finalizer is never a dependency. Component callers passstate_owner: suite and disable standalone feed publication, leaving the product
transaction as the owner of its tracked state.
The retry identity is nightly-- and the reservation branch
is bot/release-nightly--<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//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 andnightly-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 withcancel-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 identitynightly-. 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 retainsrelease-component-allocation; both locks retain pending jobs with queue: max.
The profile keeps resource_mode: published and executes:
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 andBROWSEROS_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 andPROD_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 throughnightly-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 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:
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.
gh workflow run release-browseros.yml --ref main
gh workflow run release-browserclaw.yml --ref mainrelease-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 blanksSLACK_WEBHOOK_URL so a builder .env cannot post. The browser draft is
created as usual from only the selected receipts.
# 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-onlyLinux 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 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:
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=browserclawDirect 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:
cd packages/browseros
uv run browseros ota server promote --product browseros --publish
uv run browseros ota server promote --product browserclaw --publishRetry procedures
Rerun failed jobs in the original full-release run:
RUN_ID=<github-run-id>
gh run rerun "$RUN_ID" --failed
gh run watch "$RUN_ID" --exit-statusComponent 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-. Browser
jobs fetch the transaction branch before merge, orrefs/pull//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 unrelatedmain 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:
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/srcUse --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.
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/srcChrome, 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 andPROD_MACOS_BROWSERCLAW_PASSKEY_PROFILE_B64 forcom.browseros.BrowserClaw. Each profile must authorize team 8YMKWU47S5, its
bundle-specific keychain groups, andcom.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 throughDEPOT_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 directory10.0.28000.0 was absent. Official installation instructions specify SDK package10.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, soStandard_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 — checkbuild/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 compilingskia_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:
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 (needsadmin:orgscope):bashgh 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=trueBefore flipping the toggle, check what else lives in that group — it
widens exposure for every runner in it:bashgh 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-aion 2026-06-13 — pickup verified live (a
queued job was claimed within ~60 s of dispatch).The Azure BYOC connection must be healthy: sign in at
https://app.warpbuild.com/ and confirm the BrowserOS Azure subscription,
stackbrowseros-ci-eastusin 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:
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=falseThen 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.
The reusable workflow performs the per-platform recipe:
actions/checkout.- On Windows, select
$RUNNER_TEMP/browseros-global.gitconfigthroughGIT_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. astral-sh/setup-uv, resolve the Chromium pin and paths, then restore the
pinned chromium checkout from cache (see below).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.gclientsettings and full history are preserved. Only line-ending
drift in cached depot_tools is repaired; substantive changes fail closed.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.- Preparation failure stops before cache publication or product patching.
- Save the cache (only when the restore missed, i.e. first run per pin).
- 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. - Invoke
uv run browseros buildonce with the selected profile, product,
architecture, resource mode, Chromium path, signing/upload switches, and
prepared directory.bos_buildbuilds the native server, stages validated
resources, compiles, packages, signs when requested, uploads browser
deliverables, and writes the lane manifest. - 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 doesgit 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--<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 standardizedcore.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 foractions/cachewith no size cap (entries expire 7 days after last use).
Restore-keys fall back to the previous pin's cache, then the script
fast-forwardssrcwith a single-tag fetch. - Windows — R2 tarball (
browseros source cache): WarpCache does not
support Windows runners andactions/cachecaps at 10 GB/repo. The tree
is zstd-tarred (~25-30 GB) intoci-cache/chromium/in the existing R2
bucket using the sameR2_*secrets the build already needs fordownload_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 addsnapshot.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
# 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 mainManual 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 withgh 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 isfatal: 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 underRUNNER_TEMP with GIT_CONFIG_GLOBAL, writes the four Chromium settings plusdepot-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:
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:
- Runner group blocks public repos — see one-time setup above. This
stalls all platforms at once. - 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. - Azure BYOC stack — confirm the connection and stack are healthy, then
open the BYOC stack's launch errors and inspectLaunchInstances. 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 409SkuNotAvailableis 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_v4is the verified-family fallback if D32as v5 is
unavailable, but confirm its capacity in East US before switching. - 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-linuxorrelease-windows) withcancel-in-progress: false. A queued build can
therefore pin the platform lane for a full day. Linux'squeue-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 newworkflow_job.queuedwebhook; 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>@vNhas 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 nov8tag). 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/helpand 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/helpshows the new expected version. -
WinSparkle.dllexists in%LOCALAPPDATA%\BrowserOS\Application\<version>\.
Silent Fresh Install
- Run the installer with
--silentfrom 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:
uv run --project packages/browseros browseros build --modules windows_sdk `
--chromium-src C:/chromium/src --arch x64 --build-type releaseLocal builds only check. When prerequisites are missing, install the package requested by the pinned Chromium documentation from Microsoft's 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--<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 documents the SDK feature selection and quiet/no-restart pattern; Windows Installer 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