Browser-native personal AI assistant. Zero infrastructure — the browser is the server.
Built as a browser-only reimagination of NanoClaw. Same philosophy — small enough to understand, secure by default, built for one user — but running entirely in a browser tab.
cd openbrowserclaw
npm install
npm run devOpen http://localhost:5173, paste your Anthropic API key, and start chatting.
┌─────────────────────────────────────────────────────────┐
│ Browser Tab (PWA) │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────────────────── │
│ │ Chat UI │ │ Settings │ │ Task Manager │ │
│ └────┬─────┘ └────┬─────┘ └──────┬─────────────── ┘ │
│ └──────────────┼───────────────┘ │
│ ▼ │
│ Orchestrator (main thread) │
│ ├── Message queue & routing │
│ ├── State machine (idle/thinking/responding) │
│ └── Task scheduler (cron) │
│ │ │
│ ┌───────────┼───────────┐ │
│ ▼ ▼ ▼ │
│ IndexedDB OPFS Agent Worker │
│ (messages, (group (Claude API │
│ tasks, files, tool-use loop, │
│ config) memory) WebVM sandbox) │
│ │
│ Channels: │
│ ├── Browser Chat (built-in) │
│ └── Telegram Bot API (optional, pure HTTPS) │
└──────────────────────────────────────────────────────────┘
| File | Purpose |
|---|---|
src/index.ts |
Entry point, bootstraps UI |
src/orchestrator.ts |
State machine, message routing, agent invocation |
src/agent-worker.ts |
Web Worker: Claude API tool-use loop |
src/tools.ts |
Tool definitions (bash, read/write files, fetch, etc.) |
src/vm.ts |
WebVM wrapper (v86 Alpine Linux in WASM) |
src/db.ts |
IndexedDB: messages, sessions, tasks, config |
src/storage.ts |
OPFS: per-group file storage |
src/router.ts |
Routes messages to correct channel |
src/channels/browser-chat.ts |
In-browser chat channel |
src/channels/telegram.ts |
Telegram Bot API channel |
src/task-scheduler.ts |
Cron expression evaluation |
src/crypto.ts |
AES-256-GCM encryption for API keys |
src/ui/ |
Chat, settings, and task manager components |
- You type a message in the browser chat (or send one via Telegram)
- The orchestrator checks the trigger pattern, saves to IndexedDB, queues for processing
- The agent worker (a Web Worker) sends your message + conversation history to the Anthropic API
- Claude responds, possibly using tools (bash, file I/O, fetch, JavaScript)
- Tool results are fed back to Claude in a loop until it produces a final text response
- The response is routed back to the originating channel (browser chat or Telegram)
| Tool | What it does |
|---|---|
bash |
Execute shell commands in a sandboxed Linux VM (Alpine in WASM) |
javascript |
Execute JS code in an isolated scope (lighter than bash) |
read_file / write_file / list_files |
Manage files in OPFS per-group workspace |
fetch_url |
HTTP requests via browser fetch() (subject to CORS) |
update_memory |
Persist context to CLAUDE.md (loaded on every conversation) |
create_task |
Schedule recurring tasks with cron expressions |
Optional. Works entirely via HTTPS — no WebSockets or special protocols.
- Create a bot with
@BotFatheron Telegram - Open Settings in OpenBrowserClaw, paste the bot token
- Send
/chatidto your bot to get the chat ID - Add the chat ID in Settings
- Messages from Telegram are processed the same as browser chat
Caveat: The browser tab must be open for the bot to respond. Messages queue on Telegram's side and are processed when you reopen the tab.
The bash tool runs commands in a v86-emulated Alpine Linux. To enable:
- Download the v86 WASM binary and Alpine rootfs image
- Place them in
public/assets/:public/assets/v86.wasmpublic/assets/v86/libv86.jspublic/assets/alpine-rootfs.ext2
- The VM boots automatically on first use (~5-15 seconds)
Without these assets, the bash tool returns a helpful error. All other tools work without the VM.
| NanoClaw | OpenBrowserClaw | |
|---|---|---|
| Runtime | Node.js process | Browser tab |
| Agent sandbox | Docker/Apple Container | Web Worker + WebVM |
| Database | SQLite (better-sqlite3) | IndexedDB |
| Files | Filesystem | OPFS |
| Primary channel | In-browser chat | |
| Other channels | Telegram, Discord | Telegram |
| Agent SDK | Claude Agent SDK | Raw Anthropic API |
| Background tasks | launchd service | setInterval (tab must be open) |
| Deployment | Self-hosted server | Static files (any CDN) |
| Dependencies | ~50 npm packages | 0 runtime deps |
npm run dev # Vite dev server with HMR
npm run build # Production build → dist/
npm run preview # Preview production build
npm run typecheck # TypeScript type checkingnpm run build
# Upload dist/ to any static host:
# GitHub Pages, Cloudflare Pages, Netlify, Vercel, S3, etc.No server needed. It's just HTML, CSS, and JS.