If you use agent CLIs like Claude Code or Codex every day, you have probably wished you could run several of them side by side, give each one a role, and manage them like contacts in a messaging app. That is the idea behind OpenMausBot.
This post is a practical walkthrough for developers: what it is, how it is built, how to run it in a few minutes, and where you can extend it.
What is OpenMausBot?
OpenMausBot is an open-source, local-first chat app where every chat is a real AI agent. Each bot in the sidebar is backed by an agent CLI running on your machine, and each one can have its own:
- personality and instructions
- model
- computer (a cloud Linux desktop, an isolated local VM, or your own machine)
- set of connected apps
The project describes itself as an independent, open-source alternative to products like Grok Bot, Meta Muse, OpenAI dots, and Cue by Manus. It is not affiliated with xAI, Meta, OpenAI, or Manus. It is also known as MausBot and was formerly called OpenGrokBot.
Quick facts from the repository:
| Item | Detail |
|---|---|
| Language | TypeScript |
| UI | React, Vite, Tailwind CSS |
| Desktop shell | Electron (macOS, Windows, Ubuntu 24.04) |
| License | Apache 2.0 (the enterprise/ folder has its own source-available license) |
| Runtime requirement | Node 24 or newer, pnpm for source builds |
| Agent engines | claude, codex, and grok CLIs, plus custom engines |
Why developers might care
There are three design choices that make this project interesting from an engineering point of view.
1. Bring your own agents. OpenMausBot does not proxy your requests through a hosted service. Bots run on the claude, codex, and grok CLIs already installed and logged in on your machine, so your existing subscriptions and logins are reused. You can point an engine at a custom CLI binary in Settings under Engines.
2. Local first. One small harness server listens on 127.0.0.1 and owns every agent process. Transcripts, keys, and events are stored in ~/.openmausbot, not in someone else's cloud.
3. Approvals instead of blind autonomy. A permission broker turns risky actions such as shell commands and file edits into inline cards in the chat. You choose Allow or Deny, for cloud and local computers alike.
Architecture in two minutes
OpenMausBot is split into two processes.
- The app (React and Tailwind, port 5199 in dev) holds no transports of its own. It sends typed commands over HTTP and folds a single Server-Sent Events (SSE) stream into state.
- The harness server (
127.0.0.1:8799) owns every agent process. It normalizes each provider's native protocol into one canonical runtime event stream, which is logged per thread as NDJSON.
App (React + Tailwind, :5199) | HTTP commands ^ one SSE stream v | Harness server (127.0.0.1:8799) |-- Driver registry --> claude CLI / codex CLI / grok CLI |-- Event bus (SSE) |-- Permission broker <-- permission requests from agents |-- Boat API --> cloud computer |-- Composio session --> Gmail, Slack, GitHub, ... The main layers map to folders in the repo:
| Layer | Path | Responsibility |
|---|---|---|
| Drivers | server/drivers/ | One per provider, over stream-JSON, JSON-RPC, or ACP. Unknown drivers degrade to "unavailable" instead of crashing the fleet. |
| Harness | server/harness/ | Registry (configs to live instances) and the fan-in event bus. |
| API | server/index.ts | Bots, turns, approvals, model catalog, computer lifecycle, connectors, config over HTTP and SSE. |
| Voice | server/tts/ | Text-to-speech providers; cloud keys stay on the server. |
| App | src/ | The chat shell: server-backed store, one reducer, no client-side transports. |
| Desktop | electron/ | Desktop shells with an embedded harness. |
If you have built anything with an event-sourced UI, this will feel familiar: commands go in over HTTP, events come out over one stream, and the client is a reducer over those events.
Get it running
You have three options.
Option 1: Download a release
Released builds embed the harness server, so there is no separate server setup. Builds are available for macOS (Apple silicon and Intel), Windows x64, and Ubuntu 24.04 x64 (beta, as a .deb or AppImage). Grab them from the latest release.
Note that the Windows installer is not code-signed yet, so SmartScreen will show "unknown publisher". Use More info, then Run anyway.
Option 2: Run from the terminal with npm
This is the fastest path if you just want to try it, and it works on a server too. You need Node 24 or newer.
npm install -g openmausbot openmausbot You can also skip the global install:
npx openmausbot First launch walks you through arrow-key prompts: choose AI access, sign in or paste a hidden API key, choose a model, and optionally connect a phone. The next run reuses your saved setup. Useful flags and commands:
openmausbot --no-open # do not open the browser automatically openmausbot setup # reconfigure without resetting bots or conversations npx openmausbot serve # background service for a VPS or always-on machine Option 3: Build from source
git clone https://github.com/milind-soni/OpenMausBot && cd OpenMausBot pnpm install pnpm dev:server # harness server on 127.0.0.1:8799 pnpm dev # app on http://127.0.0.1:5199 pnpm dev:desktop # Electron shell; keep the two commands above running Requirements: macOS, Windows, or Ubuntu 24.04 x64, Node 24+, pnpm, and at least one agent CLI (claude, codex, or grok) installed and logged in. Installed CLIs show up in the model picker automatically.
Useful scripts while developing:
pnpm typecheck # app and server pnpm test # unit, driver, API, and desktop capability tests pnpm build # typecheck and production build pnpm check:electron # syntax-check Electron main and preload files pnpm package:mac # DMG and ZIP (needs Swift/Xcode tools) pnpm package:win # installer and ZIP pnpm package:linux # .deb, AppImage, verified CUA runtime Optional credentials
Local chat works without any extra keys. Add these in App Settings (the gear icon in the sidebar footer) only when you want the matching feature:
| Credential | What it enables |
|---|---|
| Composio project key | Connect Gmail, GitHub, Slack, Notion, and other apps as tools for your bots |
| Boat API key | Give bots an isolated remote Linux computer with a desktop and terminal |
| ElevenLabs or Fish Audio key | Read replies aloud and call your bots |
Composio and Boat are third-party services with their own accounts and terms. Boat is paid after its trial, so a cloud computer can incur charges.
Features worth knowing about
Model picker per bot. Claude and Codex models appear side by side, and you can switch a bot's model mid-conversation.
Computers for bots. A bot can use a cloud desktop, an isolated Local VM, or your own computer. Control of your own machine is explicit opt-in and available on macOS and Ubuntu Xorg. On Ubuntu Wayland it is currently disabled behind a safety gate (tracked in issue #345).
Channels. Separate Work, Personal, and project contexts without cloning bots. Each channel has its own transcript, shared instructions, working folder, and roster.
Teams from one Markdown file. A team package uses YAML frontmatter plus a normal Markdown playbook, so the app can install it in one click while humans can still read it. Connections stay off until you approve them, routines arrive paused, and packages never carry credentials, conversations, or memory.
Triggers. Schedules and webhooks let a bot act without you. Schedules can run once, on selected weekdays, or every 5 to 1,440 minutes. Interval schedules skip a run if the previous one is still active, so slow work cannot pile up in a queue.
Voice. Spoken replies and calls through ElevenLabs, Fish Audio, Grok, built-in Mac voices, or a local Chatterbox server. Calls are macOS-only for now.
Automate it: webhooks, CLI, and MCP
This is where it gets useful for developers.
Webhook triggers
OpenMausBot starts a webhook-only receiver on 127.0.0.1:8800 by default. Set OMB_WEBHOOK_PORT to change it. Key points:
- The webhook secret is shown once, when the trigger is created or rotated.
- Bearer authentication is recommended so the secret stays out of URLs and access logs.
- The receiver exposes only
/healthand secret/hooks/...endpoints. It never exposes the broader API. - The app must be running to accept a delivery. For public delivery, proxy only this receiver through a hosted relay or something like Tailscale Funnel.
Headless CLI for scripts and CI
The openmausbot command can drive a running workspace without a screen. It returns one JSON document with --json and uses exit codes a script can branch on.
openmausbot team apply team.yaml openmausbot run "Room Lead" "Rehearse the launch of https://example.com" --export ./out MCP server
OpenMausBot ships a stdio MCP server so external clients such as Claude Desktop and Cursor can orchestrate your bots. The tool surface is deliberately bounded: inspect bots and channels, read and search transcripts, create and configure bots, channels, and tasks, send work, wait for completion, switch models, and interrupt turns.
It does not expose approval grants, deletion, arbitrary settings, credentials, or computer lifecycle. That is a sensible boundary, because it means an outside client cannot approve its own risky actions. Setup details are in the MCP docs.
Extending it
You have three extension paths, in increasing order of effort.
- Add an MCP tool server with zero code. See
docs/custom-mcp-servers.mdin the repo. - Add a custom engine with config only. Any ACP-speaking CLI or OpenAI-compatible endpoint plugs in through configuration. See
docs/custom-engines.md. The docs also cover running bots on OpenRouter, Fireworks AI, DeepSeek, Cline, or your own OpenAI- or Anthropic-compatible provider. - Write a new driver. The driver interface in
server/contracts.tsis deliberately small. Adding a provider is one file inserver/drivers/plus a one-line registration.
If you want to contribute, read CONTRIBUTING.md and LICENSING.md first. The repo uses a CLA and describes how contributions are signed off.
Security mindset
Any tool that lets an agent run shell commands and control a computer deserves care. Reasonable defaults when you try it:
- Keep bots on Ask mode (approval cards) until you trust a workflow.
- Start with the cloud computer or Local VM before pointing a bot at your own machine.
- Connect only the apps a given bot needs.
- Review a team package before importing it from someone else.
- If you expose it to the internet, use a managed HTTPS endpoint with pairing, Tailscale, or your own reverse proxy, never a bare open port.
Where to go next
- Repository: github.com/milind-soni/OpenMausBot
- Website: openmausbot.com
- Self-hosting guide:
docs/self-hosting.mdanddocs/deploy-vps.mdin the repo
If you try it, start with npx openmausbot, create one bot, and watch the approval cards while it works. That is the fastest way to see why the architecture is built the way it is.