Reading the repo
Reading the repo
How to install on Windows
Open Source Alternative to Grok Bot with a virtual machine that bots can use
Saved setup from 34 min ago
Will it work on Windows?
CONTRIBUTING.mdThanks for wanting to help — community PRs have already shipped in this repo, and more are welcome. This file tells you how to get a working dev setup, what the codebase expects from a change, and what makes a PR easy to merge. Read it once before opening anything; it's short on purpose.
pnpm typecheck && pnpm test must pass. Server changes need tests (see below).src/styles.css.Requirements: Node 24+, pnpm, and for actually chatting with a bot, at least one agent CLI
(claude or codex) installed
and logged in. macOS is the primary release platform and Ubuntu 24.04 x64 is the Linux desktop beta;
the harness server itself is portable Node and the test suite runs on macOS, Linux, and Windows.
git clone https://github.com/milind-soni/OpenMausBot && cd OpenMausBot
pnpm install
pnpm dev:server # harness server → 127.0.0.1:8799
pnpm dev # app → http://127.0.0.1:5199
pnpm dev:desktop # Electron shell (macOS/Ubuntu; keep server + Vite running)
pnpm typecheck # app + server
pnpm test # vitest suite (server unit + driver contract + API smoke)
pnpm test:watch # same, in watch mode
pnpm check:electron # syntax-check the plain JS Electron entrypoints
pnpm package:mac # DMG + ZIP; requires Swift/Xcode tools
pnpm package:linux # Ubuntu x64 .deb + AppImage; no Swift required
For Ubuntu installation and real desktop checks, see docs/linux-desktop.md.
| Path | What lives there |
|---|---|
| server/contracts.ts | The driver SPI and canonical runtime event types. The whole architecture in one file — read it first. |
| server/drivers/ | One file per provider (Claude, Codex, Grok, cloud computer). Adding a provider = one file + one registration line in builtIn.ts. |
| server/harness/ | Registry (configs → live instances, unknown → shadow) and the fan-in event bus. |
| server/index.ts | The HTTP + SSE API the app talks to. |
| server/testing/ | Test fakes: an in-memory driver, plus scripted fake claude / codex CLIs. |
| src/ | The React chat app. No transports of its own — HTTP commands out, one SSE stream in. |
| electron/ | Desktop shell: dictation, screen capture, local computer-use daemon. macOS-specific code lives here, gated. |
| dist-server/ | Build output. Never hand-edit, never include in PRs — it's regenerated by pnpm build:server at release time. |
Data lives in ~/.openmausbot/ (bots, transcripts, per-thread NDJSON event logs, config with keys).
The suite is colocated (server/**/*.test.ts) and runs with pnpm test. Three layers:
server/testing/fake-driver.ts.claude.test.ts and
codex.test.ts spawn the scripted fake CLIs in server/testing/
and assert the canonical event stream, argv/env hygiene, interrupts, and the permission broker.
Failure modes are toggled by env var (FAKE_CLAUDE_MODE=exit-early, etc.) — extend those fakes
rather than mocking child_process.index.test.ts boots the real server against a throwaway
home directory and exercises the HTTP surface.House rules for tests:
server/testing/events.ts's
recordEvents(...).until(...)). A test that needs a timeout to pass is wrong.~/.openmausbot. The setup file points HOME at a temp dir; keep it
that way.spawnCli/execCli, which resolve them through
Node on Windows. Only gate a test when the behavior itself is genuinely platform-specific.The SPI in server/contracts.ts is deliberately small. A driver PR should:
server/drivers/<name>.ts implementing ProviderDriver and register it in
builtIn.ts.decodeConfig throws on invalid config; create rejects (never throws synchronously) on
failure — the registry downgrades both to an unavailable shadow instead of crashing the fleet.
Do not remove or work around that behavior; it's what makes configs forward/backward compatible.RuntimeEvents carrying your own driverKind — the bus drops cross-driver
events on the floor.snapshot() → { state: "unavailable", reason }, and a
failed spawn as a failed turn — never a hang, never a crash.recordEvents).server/) must stay portable Node. Anything macOS-only (TCC, Swift helpers,
~/Library paths) belongs in electron/ behind a process.platform === "darwin" gate.shell: true, no spawning through cmd.exe with
quoted strings — model names, personas, and MCP config JSON travel through argv, and cmd.exe
metacharacter expansion is a real injection class. On Windows, resolve .cmd shims to their JS
entry and spawn process.execPath instead.process.kill(-pid), unix sockets) need a gated Windows equivalent
(taskkill /T, named pipes) — not a silent failure.API keys are write-only: they land in ~/.openmausbot/config.json via PUT /api/config and the API
only ever reports configured booleans. Keep it that way — no logging keys, no echoing them in
responses or events, no baking them into argv where another local process could read them.
pnpm typecheck and pnpm test passpnpm check:electron passes for desktop-shell changespnpm package:linux and node scripts/verify-linux-package.mjsdist-server/ churn, no lockfile churn beyond your actual dependency changeBy contributing you agree your contributions are licensed under the MIT License.
Then run powershell -ExecutionPolicy Bypass -File .\setup.ps1. It stops at the first error and is safe to run again. Servers and tests aren't started; it lists them at the end. Read it first.
Needs Git: winget install Git.Git
git clone https://github.com/TomLeeLive/milind-soni-OpenMausBot.git cd milind-soni-OpenMausBot
Node.js >=24
winget install CoreyButler.NVMforWindows nvm install lts nvm use lts
corepack enable pnpm install
pnpm dev
pnpm test
Released builds: the harness server is embedded, so macOS and Windows need no separate server setup.
| | Download | Install | |---|---|---| | macOS (Apple silicon) | OpenMausBot.dmg | Drag it to Applications, open it. Signed & notarized. | | Windows (x64) | OpenMausBot-setup.exe | Run it — one-click, per-user, no admin rights. The installer isn't code-signed yet, so SmartScreen shows "unknown publisher": More info → Run anyway. |
Ubuntu Desktop beta: build the .deb or AppImage from source using the commands below. Release downloads
will be linked here once Linux publishing is enabled. See the Ubuntu Desktop guide for
installation, capabilities, and troubleshooting.
From source:
git clone https://github.com/milind-soni/OpenMausBot && cd OpenMausBot
pnpm install
pnpm dev:server # harness server → 127.0.0.1:8799
pnpm dev # app → 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. They appear
in the model picker automatically.
Package the desktop application:
pnpm package:mac # macOS: DMG + ZIP; requires Swift/Xcode tools
pnpm package:win # Windows: installer + ZIP
pnpm package:linux # Ubuntu x64: .deb + AppImage; no Swift required
| Capability | macOS | Ubuntu 24.04 Xorg | Ubuntu 24.04 Wayland | |---|---|---|---| | Packaged app, embedded harness, local agent CLIs | Supported | Beta | Beta | | Composio and Box/cloud computers | Supported | Beta | Beta | | Local screen preview and computer control | Supported | Planned | Planned after compositor validation | | Native on-device dictation | Supported | Planned | Planned |
Unavailable native features fail closed on Ubuntu without blocking chat or cloud features. Linux local computer control, Wayland capture/automation, dictation, and ARM64 are tracked in #29 and are not claimed by the baseline package.
These credentials are optional — local chat works without them. Paste a key once in App Settings (gear in the sidebar footer) when you want to enable its integration:
| Credential | What it enables | Where to get it |
|---|---|---|
| Composio project key (ak_…) | Connect Gmail, GitHub, Slack, Notion, and other apps to your bots | OpenMausBot Composio setup |
| Box API key | Give bots an isolated remote Linux computer with a desktop and terminal | Box API key guide |
| ElevenLabs key | Read replies aloud, and call your bots | ElevenLabs API keys |
Composio and Box are third-party services with their own accounts and terms. Box is a paid service after its trial, and using a cloud computer may incur charges.
pnpm typecheck # app + server
pnpm test # unit, driver, API, and desktop capability tests
pnpm build # typecheck + production build
pnpm check:electron # syntax-check Electron main/preload files
pnpm package:win # Windows installer + zip → release/
pnpm package:linux # Ubuntu x64 .deb + AppImage → release/
Routines can run once or on selected weekdays, using either a MAUS's configured model/computer or the Cloud VM runner. Webhook triggers are independent from schedules but reuse the same queued task executor and calendar receipts.
OpenMausBot starts a webhook-only receiver on 127.0.0.1:8800 by default (or one port above OMB_PORT).
Set OMB_WEBHOOK_PORT to choose another port. A webhook secret is shown once when the trigger is created
or rotated. Bearer authentication is recommended so the secret stays out of request URLs and most access
logs; a single capability URL remains available for senders that cannot configure headers. The receiver
exposes only /health and secret /hooks/... endpoints; it never exposes the app's broader API.
OpenMausBot must remain running to accept a delivery. For public internet delivery, proxy only this
dedicated receiver through a hosted relay or a tool such as Tailscale Funnel.
No reports for Windows yet.
Opens a chat with this manual already filled in, for Windows. It uses your own account; gitmanual sends nothing.