---
title: "Self-host OpenMausBot, the open-source Grok Bot alternative"
description: "Run OpenMausBot's server on an exe.dev VM: a private chat app of AI bots with Claude through exe.dev, a browser, and a Linux desktop of their own."
url: https://exe.dev/deploy/openmausbot
category: "AI agents"
updated: 2026-11-02
---

# Self-host OpenMausBot, the open-source Grok Bot alternative

A team of AI bots, each with a computer that isn't your laptop.

- **Software:** OpenMausBot (https://www.openmausbot.com)
- **Source:** https://github.com/milind-soni/OpenMausBot
- **License:** Apache-2.0 (except its enterprise/ folder)
- **Time:** 20 minutes
- **Example VM name:** `my-openmausbot` (yours will differ; on the VM, `hostname` prints it)
- **Machine-readable:** https://exe.dev/deploy/openmausbot/manifest.json

## What you get

- The OpenMausBot web app at `https://<vm>.exe.xyz/`, behind your exe.dev login, with this browser paired as the owner.
- Claude bots through exe.dev's LLM integration, with no API key to paste.
- A server that stays on when you disconnect and starts again after a reboot, so routines keep running.
- The bots' built-in browser, installed and checked.
- Docker ready for the bots' private Linux desktop.

Running on the VM:

- **OpenMausBot server**: openmausbot 0.1.138 on Node.js 24, managed by systemd, port 8799, data in `~/.openmausbot`
- **nginx**: Private web app proxy, port 8000
- **Claude Code**: The bots' engine, connected through exe.dev's LLM integration
- **Private desktop**: Optional Cua Linux desktop in Docker, for computer use

How it is reached:

- https://my-openmausbot.exe.xyz/ (private): The OpenMausBot web app, behind your exe.dev login and a per-device pairing

## Deploy with Shelley

Open https://exe.dev/new?prompt=Set%20up%20OpenMausBot%20on%20this%20VM%20by%20following%20the%20exe.dev%20recipe%20at%20https%3A%2F%2Fexe.dev%2Fdeploy%2Fopenmausbot.md%20from%20top%20to%20bottom.%0A%0AThe%20recipe%27s%20example%20VM%20name%20is%20my-openmausbot.%20This%20VM%27s%20name%20is%20the%20output%20of%20%60hostname%60%3A%20use%20it%20wherever%20the%20recipe%20writes%20my-openmausbot.%20Skip%20the%20step%20that%20creates%20the%20VM%3B%20you%20are%20on%20it.%0A%0AYou%20are%20done%20when%20all%20of%20these%20are%20true.%20Check%20each%20one%20yourself%3A%0A-%20The%20OpenMausBot%20web%20app%20at%20%60https%3A%2F%2F%3Cvm%3E.exe.xyz%2F%60%2C%20behind%20your%20exe.dev%20login%2C%20with%20this%20browser%20paired%20as%20the%20owner.%0A-%20Claude%20bots%20through%20exe.dev%27s%20LLM%20integration%2C%20with%20no%20API%20key%20to%20paste.%0A-%20A%20server%20that%20stays%20on%20when%20you%20disconnect%20and%20starts%20again%20after%20a%20reboot%2C%20so%20routines%20keep%20running.%0A-%20The%20bots%27%20built-in%20browser%2C%20installed%20and%20checked.%0A-%20Docker%20ready%20for%20the%20bots%27%20private%20Linux%20desktop.%0A%0ARead%20the%20whole%20recipe%2C%20including%20the%20closed%20details.%20For%20initial%20setup%2C%0Afollow%20%22Install%20by%20hand%22%20first%2C%20skipping%20VM%20creation%20and%20SSH.%20The%0Aopening%20walkthrough%20is%20for%20the%20owner.%20Install%20exactly%20the%20pinned%0Aversion.%20Do%20not%20run%20the%20restore%20or%20update%20instructions%2C%20and%20don%27t%20set%0Aup%20a%20second%20VM%20unless%20the%20owner%20asks.%0AKeep%20the%20VM%20private.%20Never%20run%20share%20set-public%2C%20change%20the%20server%27s%0Aloopback%20address%2C%20or%20set%20OMB_LOOPBACK_TRUST.%20On%20an%20existing%20VM%2C%20ask%0Abefore%20replacing%20configuration%20or%20a%20service%20on%20port%208000.%0AVerify%20%60openmausbot%20doctor%60%20says%20ready%20with%20the%20browser%20installed%2C%20a%0A%60pong%60%20from%20%60openmausbot%20run%60%2C%20the%20service%20enabled%20and%20active%2C%20and%20the%0Ahealth%20check%20through%20nginx.%20Do%20not%20reboot.%0AGenerate%20the%20pairing%20link%20last%2C%20after%20the%20owner%20has%20signed%20in%20to%0Ahttps%3A%2F%2F%3Cvm%3E.exe.xyz%2F.%20Give%20only%20the%20https%3A%2F%2F%3Cvm%3E.exe.xyz%2Fpair%20link%20and%0Aexplain%20that%20it%20works%20once%20and%20expires%20in%20five%20minutes%3B%20reissue%20on%0Arequest.%20The%20private%20desktop%20is%20prepared%20in%20the%20web%20app%27s%20settings%3A%0Apoint%20the%20owner%20to%20%22Give%20it%20a%20desktop%22.%0A%0AFinish%20with%20the%20URLs%20I%20should%20open.%0A to create a VM whose agent, Shelley, follows this recipe. From a terminal:

```sh
curl -fsSL https://exe.dev/deploy/openmausbot/prompt.txt | ssh exe.dev new --prompt=/dev/stdin
```

Or follow the steps below by hand.

[OpenMausBot](https://www.openmausbot.com) is a chat app where every chat is
an AI agent. Bots browse, use a Linux desktop, run routines on a schedule,
and pass work to each other, with a Chief of Staff keeping track. On
exe.dev, they get a computer of their own instead of yours: the server runs
on a VM behind your exe.dev login, Claude comes through the
[LLM integration](/docs/integrations-llm), and the disk keeps their memory.

OpenMausBot is new and ships almost daily. These steps pin version 0.1.138,
which we ran end to end on 2 November 2026.

## Say hello

When Shelley finishes, open `https://my-openmausbot.exe.xyz/` and sign in
to exe.dev. Then ask Shelley for a **pairing link** and open it in the same
browser. It works once and expires in five minutes, so ask again if it does.

Click **Connect**, meet MausBot, and create your Chief of Staff. Then try:

> Use your browser to open https://exe.dev/docs and tell me in one line what it's about.

A second device, say your phone's browser, needs its own pairing link.

> [!WARNING]
> **Keep this VM private.** Bots run commands on the VM as `exedev`, who
> can use sudo. Don't make the web app public or put unrelated secrets on
> this VM, and keep pairing links to yourself.

## Give it a desktop

The browser covers most web tasks. For apps that need a screen, bots get a
private Linux desktop in Docker on the same VM:

1. Click your avatar, then **Settings** → **Computer**.
2. Under **Private desktops**, click **Prepare Cua desktop**, then
   **Start the private desktop**. The first run builds a 2 GB image.
3. In a bot's chat, open the screen panel (the monitor icon) and choose
   **Private desktop**.

Ask the bot to open a terminal on its desktop. **Take control** in the
screen panel lets you drive it yourself until you hand it back.

<figure>
<img src="https://exe.dev/deploy/openmausbot/desktop.png" alt="OpenMausBot chat where MausBot reports what exe.dev's docs say, with a screenshot of Firefox on its Linux desktop and the live screen in the side panel" width="1440" height="900" loading="lazy">
<figcaption>MausBot reads exe.dev's docs in Firefox on its own desktop. The side panel shows the screen live.</figcaption>
</figure>

## Give a bot its own VM

One desktop per VM is tidier when bots shouldn't share. OpenMausBot's
**Self-hosted VPS** option runs a bot's desktop on any Linux server it can
reach over SSH, and another exe.dev VM fits: its own disk, its own CPU, and
nothing on it but the bot's container. The server stays on
`my-openmausbot`; only the desktop moves.

The steps are in [Give a bot its own VM by hand](#own-vm). You run one
command on your computer to give the server a key for that VM alone.

<figure>
<img src="https://exe.dev/deploy/openmausbot/bot-vps.png" alt="A bot's Access settings in OpenMausBot with the Cloud backend set to Self-hosted VPS and a Server (SSH alias) field" width="1440" height="900" loading="lazy">
<figcaption>Each bot can name its own server.</figcaption>
</figure>

## Keep the memories

Bots, chats, memory and settings live in `~/.openmausbot`, on the VM's
persistent disk. Ask Shelley for a backup before an update; see
[Back up and restore](#back-up-and-restore). Copy backups **off the VM**,
too. On your computer:

```bash
rsync -av my-openmausbot.exe.xyz:backups/openmausbot/ ./openmausbot-backups/
```

They hold your conversations, so keep them private.

## Setup and upkeep

No need to read on unless you're curious—or doing it yourself.

<details id="create-the-vm" data-manual-setup class="dp-details">
<summary>Install by hand</summary>

On your computer (pick another name if `my-openmausbot` is taken):

```bash
ssh exe.dev new --name=my-openmausbot
ssh my-openmausbot.exe.xyz
```

All remaining installation commands run **on the VM**, as `exedev`.

### Install Node.js 24 and OpenMausBot

OpenMausBot needs Node.js 24 or newer. Install it from NodeSource, then the
pinned release into `~/.local`:

```bash
curl -fsSL https://deb.nodesource.com/setup_24.x | sudo -E bash -
sudo apt-get install -y nodejs
npm install --global --prefix "$HOME/.local" openmausbot@0.1.138
export PATH="$HOME/.local/bin:$PATH"
node --version
claude --version
```

Expect Node 24 and a Claude Code version. Claude Code comes with the VM's
image; OpenMausBot drives it.

### Run the server

`openmausbot service install` writes a systemd unit for the server on
`127.0.0.1:8799`. The drop-in sends every Claude bot through exe.dev's LLM
integration; the key is a placeholder, since exe.dev adds the real
credentials outside the VM. `OMB_PUBLIC_URL` makes pairing links use the
VM's address.

```bash
openmausbot service install --port 8799
sudo install -m 644 ~/.openmausbot/openmausbot.service /etc/systemd/system/openmausbot.service
sudo mkdir -p /etc/systemd/system/openmausbot.service.d
sudo tee /etc/systemd/system/openmausbot.service.d/exe-dev.conf >/dev/null <<EOF
[Service]
Environment=OMB_PUBLIC_URL=https://$(hostname).exe.xyz
Environment=OMB_ANTHROPIC_API_KEY=exe-llm-integration
Environment=OMB_ANTHROPIC_API_URL=https://llm.int.exe.xyz
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now openmausbot
sleep 15
openmausbot doctor
```

Expect `ready` and `claude` among the engines. Then try a bot:

```bash
openmausbot run MausBot "Reply with exactly: pong"
```

### Install the bots' browser

The first command installs Chrome's libraries as root, the second the
browser itself for `exedev`:

```bash
sudo -H env PATH="$PATH" openmausbot browser install --with-deps
openmausbot browser install
sudo systemctl restart openmausbot
sleep 15
openmausbot doctor
```

Expect `Bots' browser: installed`.

### Turn on Docker

For the private desktop. The VM's image has Docker but leaves it off:

```bash
sudo systemctl enable --now docker.service
docker info --format '{{.ServerVersion}}'
```

### Set up the web app proxy

The [exe.dev proxy](/docs/proxy) handles HTTPS and login. nginx passes
requests and the live desktop's WebSockets to the loopback-only server, and
hands it the visitor's address, which the exe.dev proxy appends last. Every
request from outside still needs a paired device. This replaces the image's
default site:

```bash
sudo tee /etc/nginx/sites-available/openmausbot >/dev/null <<'EOF'
map $http_upgrade $omb_connection {
    default upgrade;
    ""      close;
}
# The exe.dev proxy appends the client's address last.
map $http_x_forwarded_for $omb_client {
    "~(?<last>[^,\s]+)\s*$" $last;
    default                 $remote_addr;
}
server {
    listen 8000 default_server;
    listen [::]:8000 default_server;
    server_name _;
    location / {
        proxy_pass http://127.0.0.1:8799;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $omb_connection;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $omb_client;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-Host $host;
        proxy_buffering off;
        proxy_read_timeout 1d;
        proxy_send_timeout 1d;
        client_max_body_size 100m;
    }
}
EOF
sudo rm -f /etc/nginx/sites-enabled/default
sudo ln -sf /etc/nginx/sites-available/openmausbot /etc/nginx/sites-enabled/openmausbot
sudo nginx -t && sudo systemctl enable --now nginx && sudo systemctl reload nginx
curl -fsS http://127.0.0.1:8000/api/health
```

Expect `"app":"openmausbot"` through nginx.

### Pair your browser

Open `https://my-openmausbot.exe.xyz/` and sign in to exe.dev first. Then,
on the VM:

```bash
openmausbot pair --label Browser
```

Open the printed `https://…/pair#code=…` link in that browser within five
minutes and click **Connect**. List or sign out devices with
`openmausbot sessions`.

</details>

<details id="own-vm" class="dp-details">
<summary>Give a bot its own VM by hand</summary>

On your computer, create the desktop VM and turn on its Docker
(`my-mausbot-desk` is an example name):

```bash
ssh exe.dev new --name=my-mausbot-desk
ssh my-mausbot-desk.exe.xyz sudo systemctl enable --now docker.service
```

On `my-openmausbot`, make a key for it:

```bash
ssh-keygen -q -t ed25519 -N "" -C "openmausbot@$(hostname)" -f ~/.ssh/mausbot_desk
```

On your computer, let that key into the new VM, and only that one, as a
[VM-scoped SSH key](/docs/vm-scoped-ssh-keys):

```bash
ssh my-openmausbot.exe.xyz cat .ssh/mausbot_desk.pub | ssh exe.dev ssh-key add --vm=my-mausbot-desk
```

Back on `my-openmausbot`, give it an SSH alias and check that Docker answers
through it:

```bash
cat >> ~/.ssh/config <<'EOF'
Host mausbot-desk
  HostName my-mausbot-desk.exe.xyz
  User exedev
  IdentityFile ~/.ssh/mausbot_desk
  IdentitiesOnly yes
  ControlMaster auto
  ControlPath ~/.ssh/cm-%r@%h-%p
  ControlPersist 60m
  ServerAliveInterval 15
  ServerAliveCountMax 3
  ConnectTimeout 10
EOF
chmod 600 ~/.ssh/config
ssh -o StrictHostKeyChecking=accept-new mausbot-desk true
docker -H ssh://mausbot-desk info --format '{{.ServerVersion}}'
```

In the web app:

1. **Settings** → **AI** → **API keys** → **Computers and browser**: enter
   `mausbot-desk` under **Self-hosted VPS** and save.
2. **Settings** → **General**: turn on **Advanced mode**.
3. In the bot's screen panel, choose **Cloud desktop**, then
   **Self-hosted VPS** under **Cloud provider**.

The bot's desktop starts on `my-mausbot-desk`; the first start builds its
image there. For more bots, repeat with a new VM, key and alias, and set
the alias in the panel's gear → **Access** → **Server (SSH alias)**. More in
OpenMausBot's [Bring Your Own VPS guide](https://github.com/milind-soni/OpenMausBot/blob/main/docs/byo-vps.md).

The key lets OpenMausBot run anything on that VM, which is the point: keep
only the bot's work there.

</details>

<details id="back-up-and-restore" class="dp-details">
<summary>Back up and restore</summary>

On the VM, stop the server for a consistent copy:

```bash
mkdir -p ~/backups/openmausbot && chmod 700 ~/backups ~/backups/openmausbot
sudo systemctl stop openmausbot &&
(umask 077; tar czf ~/backups/openmausbot/openmausbot-$(date +%F).tar.gz -C "$HOME" .openmausbot)
sudo systemctl start openmausbot
```

To restore, replace `BACKUP.tar.gz` with the archive's filename:

```bash
test ! -e ~/.openmausbot.before-restore &&
tar tzf ~/backups/openmausbot/BACKUP.tar.gz >/dev/null &&
sudo systemctl stop openmausbot &&
mv ~/.openmausbot ~/.openmausbot.before-restore &&
tar xzf ~/backups/openmausbot/BACKUP.tar.gz -C "$HOME" &&
sudo systemctl start openmausbot &&
sleep 15 && openmausbot bots
```

Try a chat before removing `~/.openmausbot.before-restore`. Paired devices
come back with the backup. OpenMausBot also has an encrypted in-app backup
under **Settings** → **Backups** (in Advanced mode).

</details>

<details id="update" class="dp-details">
<summary>Update</summary>

Read the [releases](https://github.com/milind-soni/OpenMausBot/releases)
first; it changes quickly. Take a backup, then on the VM, with the version
you chose:

```bash
sudo systemctl stop openmausbot
npm install --global --prefix "$HOME/.local" openmausbot@0.1.138
sudo systemctl start openmausbot
sleep 15
openmausbot status
```

</details>

<details id="troubleshooting" class="dp-details">
<summary>Something stuck?</summary>

Ask Shelley, or check on the VM:

```bash
openmausbot doctor
systemctl status openmausbot --no-pager
journalctl -u openmausbot -n 50 --no-pager
```

If the app asks you to pair this device, the browser isn't paired yet or
its session was revoked. Run `openmausbot pair` for a fresh link.

</details>

## Frequently asked questions

### What is OpenMausBot?

An open-source app for a team of AI bots, formerly OpenGrokBot. Each chat is an agent (Claude Code, Codex, OpenCode, pi and others) that can use a browser and a desktop, run routines on a schedule, and hand work to other bots. It pitches itself as an open alternative to [Grok Bot](/deploy/grok-bot).

### What does it cost?

Your [VM plan](https://exe.dev/pricing) plus model usage through the [LLM integration](/docs/integrations-llm). Each turn carries the bot's instructions and tools: in our test, a one-word reply used about 58,000 input tokens ($0.16 by OpenMausBot's own ledger). Routines and the Chief of Staff use tokens too.

### Can I use Codex or another model?

OpenMausBot runs other engines from Settings → AI, each with its own sign-in: on a VM, use `codex login --device-auth` for Codex. We only tested Claude through exe.dev; the setting below sends every Claude bot through it.

### Can I use it from my phone?

Yes, in the phone's browser: sign in to exe.dev, then open a pairing link made for that phone. OpenMausBot's iOS and Android apps talk to the server directly, and the exe.dev login stands in front of it, so we didn't set them up.

### Can the bots talk in Slack or Telegram?

Not in the self-hosted version we tested. Its chats live in its own app; Slack, Gmail and other apps are tools the bots can use through [Composio](https://github.com/milind-soni/OpenMausBot/blob/main/docs/composio.md), with your own Composio key.

### Is it stable?

It's young and moves fast, with a release most days. This page pins and was tested with 0.1.138 (2 November 2026). Back up before you update, and update on purpose.


## Related

- [Let Grok Bot deploy the apps it builds](https://exe.dev/deploy/grok-bot.md): Ask a Grok Bot in Slack for an internal tool, and get back a link only your team can open.
- [Run Codync on a remote server](https://exe.dev/deploy/codync.md): Your coding agents as bots you message, on a VM that never sleeps.
- [Host OpenClaw](https://exe.dev/deploy/openclaw.md): An AI sidekick with its own computer. Your laptop can take a nap.
- [Self-host Hermes Agent](https://exe.dev/deploy/hermes-agent.md): An agent that remembers you, on a computer that never sleeps.
- [Run Claude Code on a remote server](https://exe.dev/deploy/claude-code.md): A computer for Claude. A breather for your laptop.
- [Run Codex on a remote server](https://exe.dev/deploy/codex.md): A computer for Codex. An early night for your laptop.
