Browser automation for AI agents and humans.
Vibium gives AI agents a browser. Install the vibe-check skill and your agent can navigate pages, fill forms, click buttons, and take screenshots — all through simple CLI commands. Also available as an MCP server and as JS/TS and Python client libraries.
New here? Getting Started Tutorial — zero to hello world in 5 minutes.
- AI-native. Install as a skill — your agent learns 22 browser commands instantly.
- Zero config. One install, browser downloads automatically, visible by default.
- Standards-based. Built on WebDriver BiDi, not proprietary protocols controlled by large corporations.
- Lightweight. Single ~10MB binary. No runtime dependencies.
- Flexible. Use as a CLI skill, MCP server, or JS/Python library.
┌──────────────────────────────────────┐
│ LLM / Agent │
│ (Claude Code, Codex, Gemini, etc.) │
└──────────────────────────────────────┘
▲ ▲
│ MCP (stdio) │ CLI (Bash)
▼ ▼
┌──────────────────────────────────┐
│ Vibium binary │
│ (vibe-check CLI) │
│ │
│ ┌───────────┐ ┌──────────────┐ │
│ │ MCP Server│ │ CLI Commands │ │
│ └─────┬─────┘ └──────┬───────┘ │ ┌──────────────────┐
│ └──────▲───────┘ │ │ │
│ │ │ │ │
│ ┌──────▼───────┐ │ BiDi │ Chrome Browser │
│ │ BiDi Proxy │ │◄──────►│ │
│ └──────────────┘ │ │ │
└──────────────────────────────────┘ └──────────────────┘
▲
│ WebSocket BiDi :9515
▼
┌──────────────────────────────────────┐
│ Client Libraries │
│ (js/ts | python) │
│ │
│ ┌─────────────────┐ ┌────────────┐ │
│ │ Async API │ │ Sync API │ │
│ │ await vibe.go() │ │ vibe.go() │ │
│ └─────────────────┘ └────────────┘ │
└──────────────────────────────────────┘
See internals for component details.
npm install -g vibium
npx skills add https://github.com/VibiumDev/vibium --skill vibe-checkThe first command installs Vibium and the vibe-check binary, and downloads Chrome. The second installs the skill to {project}/.agents/skills/vibe-check.
vibe-check navigate https://example.com # go to a page
vibe-check text # get page text
vibe-check click "a" # click an element
vibe-check type "input" "hello" # type into a field
vibe-check screenshot -o page.png # capture screenshot
vibe-check eval "document.title" # run JavaScriptFull command list: SKILL.md
Alternative: MCP server (for structured tool use instead of CLI):
claude mcp add vibium -- npx -y vibium mcp # Claude Code
gemini mcp add vibium npx -y vibium mcp # Gemini CLISee detailed setup guides: MCP Server | Gemini CLI
npm install vibium # JavaScript/TypeScript
pip install vibium # PythonThis automatically:
- Installs the Vibium binary for your platform
- Downloads Chrome for Testing + chromedriver to platform cache:
- Linux:
~/.cache/vibium/ - macOS:
~/Library/Caches/vibium/ - Windows:
%LOCALAPPDATA%\vibium\
- Linux:
No manual browser setup required.
Skip browser download (if you manage browsers separately):
VIBIUM_SKIP_BROWSER_DOWNLOAD=1 npm install vibium// Option 1: require (REPL-friendly)
const { browserSync } = require('vibium')
// Option 2: dynamic import (REPL with --experimental-repl-await)
const { browser } = await import('vibium')
// Option 3: static import (in .mjs or .ts files)
import { browser, browserSync } from 'vibium'Sync API:
const fs = require('fs')
const { browserSync } = require('vibium')
const vibe = browserSync.launch()
vibe.go('https://example.com')
const png = vibe.screenshot()
fs.writeFileSync('screenshot.png', png)
const link = vibe.find('a')
link.click()
vibe.quit()Async API:
const fs = await import('fs/promises')
const { browser } = await import('vibium')
const vibe = await browser.launch()
await vibe.go('https://example.com')
const png = await vibe.screenshot()
await fs.writeFile('screenshot.png', png)
const link = await vibe.find('a')
await link.click()
await vibe.quit()from vibium import browser, browser_syncSync API:
from vibium import browser_sync as browser
vibe = browser.launch()
vibe.go("https://example.com")
png = vibe.screenshot()
with open("screenshot.png", "wb") as f:
f.write(png)
link = vibe.find("a")
link.click()
vibe.quit()Async API:
import asyncio
from vibium import browser
async def main():
vibe = await browser.launch()
await vibe.go("https://example.com")
png = await vibe.screenshot()
with open("screenshot.png", "wb") as f:
f.write(png)
link = await vibe.find("a")
await link.click()
await vibe.quit()
asyncio.run(main())| Platform | Architecture | Status |
|---|---|---|
| Linux | x64 | ✅ Supported |
| macOS | x64 (Intel) | ✅ Supported |
| macOS | arm64 (Apple Silicon) | ✅ Supported |
| Windows | x64 | ✅ Supported |
See CONTRIBUTING.md for development setup and guidelines.
V1 focuses on the core loop: browser control via CLI, MCP, and client libraries.
See V2-ROADMAP.md for planned features:
- Java client
- Cortex (memory/navigation layer)
- Retina (recording extension)
- Video recording
- AI-powered locators
Apache 2.0