Hey there! Thanks for your interest in BrowserOS. Whether you're fixing bugs, adding features, improving docs, or just poking around the code, we're glad you're here.
BrowserOS is a monorepo with two main parts:
- Agent - The Chrome extension with AI features (TypeScript/React)
- Browser - The custom Chromium build (C++/Python)
Most folks start with the agent since it's way easier to set up and iterate on.
|
What you'll work on:
What you need:
Skills: TypeScript, React, Chrome APIs |
What you'll work on:
What you need:
Skills: C++, Python, Chromium internals |
The agent is a Chrome extension that provides AI-powered automation. Most contributors work here.
# 1. Navigate to agent directory
cd packages/browseros-agent
# 2. Install dependencies
yarn install
# 3. Set up environment
cp .env.example .env
# Edit .env and add your LITELLM_API_KEY
# 4. Build the extension
yarn build:dev # One-time build- Open
chrome://extensions/ - Enable Developer mode (top right toggle)
- Click Load unpacked
- Select
packages/browseros-agent/dist/ - Press Agent icon from extensions toolbar to open the agent panel
For detailed setup, architecture, and code standards, see Agent Contributing Guide.
Building the custom Chromium browser requires significant disk space and time. Only go down this path if you're working on browser-level features like patches to Chromium itself.
- ~100GB disk space for Chromium source
- 16GB+ RAM (recommended)
- Platform tools:
- macOS: Xcode + Command Line Tools
- Linux: build-essential and dependencies
- Windows: Visual Studio Build Tools
1. Checkout Chromium source
First, follow the official Chromium guide for your platform:
This will set up depot_tools and fetch the ~100GB Chromium source tree. This typically takes 2-3 hours depending on your internet speed.
2. Build BrowserOS
Once you have Chromium checked out, navigate to our build system:
cd packages/browseros
# Debug build (for development)
# macOS
python build/build.py --config build/config/debug.macos.yaml --chromium-src /path/to/chromium/src --build
# Linux
python build/build.py --config build/config/debug.linux.yaml --chromium-src /path/to/chromium/src --build
# Windows
python build/build.py --config build/config/debug.windows.yaml --chromium-src /path/to/chromium/src --build
# Release build (for production)
# macOS
python build/build.py --config build/config/release.macos.yaml --chromium-src /path/to/chromium/src --build
# Linux
python build/build.py --config build/config/release.linux.yaml --chromium-src /path/to/chromium/src --build
# Windows
python build/build.py --config build/config/release.windows.yaml --chromium-src /path/to/chromium/src --buildThe build typically takes 1-3 hours on modern hardware (M4 Max, Ryzen 9, etc.).
For detailed instructions, see Browser Build Guide.
Open a PR on GitHub with:
- Clear title in conventional commit format
- Description explaining what changed and why
- Screenshots/videos for UI changes
- Link to related issues (e.g., "Fixes #123")
On your first PR, our bot will ask you to sign the Contributor License Agreement:
- Read the CLA document
- Comment on your PR:
I have read the CLA Document and I hereby sign the CLA - The bot will record your signature (one-time thing)
- Strict typing - Always declare types, avoid
any - Zod schemas - Use Zod instead of TypeScript interfaces
- Path aliases - Use
@/libnot relative paths like../ - Naming:
- Classes:
PascalCase - Functions/variables:
camelCase - Constants:
UPPERCASE - Private methods: prefix with
_
- Classes:
Example:
import { z } from 'zod'
// Good: Zod schema with inline comments
export const ToolInputSchema = z.object({
action: z.enum(['click', 'type']), // Action to perform
target: z.string().min(1), // Element selector
timeout: z.number().default(5000) // Timeout in ms
})
export type ToolInput = z.infer<typeof ToolInputSchema>- Styling: Tailwind CSS only (no SCSS or CSS modules)
- Hooks: Only at top level
- Props: Define with Zod schemas
- Testing: Vitest (not Jest)
- Keep functions short (<20 lines ideally)
- Write tests for new features
- Use descriptive variable names
- Handle errors gracefully
For detailed standards:
- Agent: packages/browseros-agent/CLAUDE.md
- Browser: Follow Chromium style guide
monorepo/
├── packages/
│ ├── browseros/ # Chromium build system
│ │ ├── build/ # Python build scripts
│ │ ├── chromium_patches/ # Patches to Chromium source
│ │ └── resources/ # Icons, configs
│ │
│ └── browseros-agent/ # Chrome extension
│ ├── src/
│ │ ├── lib/ # Core agent logic
│ │ ├── sidepanel/ # Side panel UI
│ │ ├── newtab/ # New tab page
│ │ └── background/ # Extension background
│ └── docs/ # Architecture docs
│
├── docs/ # General documentation
└── CONTRIBUTING.md # This file
You don't need to write code to help out! Here are other ways:
Found a bug? Open an issue with:
- Clear description
- Steps to reproduce
- Expected vs actual behavior
- Screenshots/videos
- Environment details (OS, browser version, BrowserOS version)
Have an idea? Share it here or chat with us on Discord.
- Write blog posts or guides
- Try new features
- Test on different platforms
- Report edge cases
- Share your use cases
- Suggest UI improvements
- Create mockups
- Improve accessibility
- Enhance user experience
Stuck? Need clarification? We're here to help.
- Discord - Real-time chat and support
- GitHub Issues - Bug reports and features
- GitHub Discussions - General questions
We appreciate all contributors! You'll get:
- Credits in release notes
- Name in README
By contributing, you agree that your contributions will be licensed under AGPL-3.0.
Built with ❤️ from San Francisco