---
title: "Host OpenClaw"
description: "Give OpenClaw its own computer on exe.dev. Chat in a private dashboard, add Telegram when you like, and let your laptop take a nap."
url: https://exe.dev/deploy/openclaw
category: "AI agents"
updated: 2026-10-14
---

# Host OpenClaw

An AI sidekick with its own computer. Your laptop can take a nap.

- **Software:** OpenClaw (https://openclaw.ai)
- **Source:** https://github.com/openclaw/openclaw
- **License:** MIT
- **Time:** 15 minutes
- **Example VM name:** `my-openclaw` (yours will differ; on the VM, `hostname` prints it)
- **Machine-readable:** https://exe.dev/deploy/openclaw/manifest.json

## What you get

- A private dashboard that chats with Claude. No API key to paste.
- An assistant that stays on when you disconnect and starts again after a reboot.
- Nightly backups of your settings, conversations, and workspace.

Running on the VM:

- **OpenClaw Gateway**: Background service, managed by systemd, port 18789, data in `~/.openclaw`
- **nginx**: Private dashboard proxy, port 8000
- **Claude**: Connected through exe.dev's LLM integration

How it is reached:

- https://my-openclaw.exe.xyz/ (private): Your chat dashboard

## Deploy with Shelley

Open https://exe.dev/new?prompt=Set%20up%20OpenClaw%20on%20this%20VM%20by%20following%20the%20exe.dev%20recipe%20at%20https%3A%2F%2Fexe.dev%2Fdeploy%2Fopenclaw.md%20from%20top%20to%20bottom.%0A%0AThe%20recipe%27s%20example%20VM%20name%20is%20my-openclaw.%20This%20VM%27s%20name%20is%20the%20output%20of%20%60hostname%60%3A%20use%20it%20wherever%20the%20recipe%20writes%20my-openclaw.%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-%20A%20private%20dashboard%20that%20chats%20with%20Claude.%20No%20API%20key%20to%20paste.%0A-%20An%20assistant%20that%20stays%20on%20when%20you%20disconnect%20and%20starts%20again%20after%20a%20reboot.%0A-%20Nightly%20backups%20of%20your%20settings%2C%20conversations%2C%20and%20workspace.%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.%0AThe%20opening%20walkthrough%20is%20for%20the%20owner.%20Telegram%20is%20optional%3A%20don%27t%0Aask%20for%20a%20bot%20token%20during%20initial%20setup.%20Do%20not%20run%20the%20later%20restore%0Aor%20update%20instructions.%0AKeep%20the%20VM%20private.%20Never%20run%20share%20set-public%20or%20disable%20Gateway%20auth.%0AOn%20an%20existing%20VM%2C%20ask%20before%20replacing%20configuration%20or%20a%20service%20on%0Aport%208000.%20Verify%20a%20model%20reply%2C%20Gateway%20health%2C%20enabled%20services%2C%0ALinger%3Dyes%2C%20the%20backup%20timer%2C%20and%20a%20verified%20archive.%20Do%20not%20reboot.%0AGenerate%20the%20browser%20pairing%20link%20last%2C%20after%20the%20owner%20has%20signed%20in%0Ato%20https%3A%2F%2F%3Cvm%3E.exe.xyz%2F.%20Use%20the%20VM%27s%20actual%20hostname.%20Explain%20that%20the%0Alink%20is%20private%2C%20single-use%2C%20and%20expires%20in%20ten%20minutes%3B%20reissue%20on%20request.%0AIf%20the%20owner%20wants%20Telegram%2C%20follow%20%22Connect%20Telegram%20by%20hand%22%2C%20using%0Atheir%20supplied%20token%20instead%20of%20interactive%20read.%20Approve%20only%20the%20code%0Athe%20owner%20confirms%20their%20bot%20sent%20them%2C%20then%20restrict%20access%20to%20their%0Anumeric%20user%20ID.%20Never%20echo%20the%20bot%20token%20back.%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/openclaw/prompt.txt | ssh exe.dev new --prompt=/dev/stdin
```

Or follow the steps below by hand.

OpenClaw is an open-source AI assistant that can work with files, run
commands, and remember things. Give it a computer of its own—not the one
with your holiday photos.

Model usage is billed to your exe.dev account through the
[LLM integration](/docs/integrations-llm).

## Say hello

When Shelley finishes, open your VM's dashboard link and sign in to exe.dev.
Then ask Shelley for a **pairing link**. Open it in the same browser within
ten minutes. It works once; ask for a fresh one if it expires.

In the chat box, try:

> Make a packing checklist for a weekend away. Leave room for snacks.

Hello, lobster.

> [!WARNING]
> **Keep this VM private.** OpenClaw can run commands with sudo.
> Don't make its dashboard public or put unrelated secrets on this VM.
> Keep pairing links and bot tokens to yourself.

## Take it to Telegram

Happy chatting in the browser? Skip this bit.

1. In Telegram, message **@BotFather** (check the handle), send `/newbot`,
   and follow the prompts.
2. Ask **Shelley** to connect the bot. Give it the token in your private
   Shelley conversation.
3. Message your new bot. Give Shelley the pairing code and numeric user ID
   it sends **you**, so it can allow only your account.

Send another message to check it replies. Pocket assistant, ready to go.

## Keep the memories

Settings, chats, and workspace live in `~/.openclaw`. Nightly backups go to
`~/backups/openclaw`. Copy them **off the VM**, too. On your computer:

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

Keep those copies private: they contain tokens and conversations.
Ask Shelley to take a backup before an update.

## 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-openclaw` is taken):

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

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

### Install OpenClaw

The [official installer](https://docs.openclaw.ai/install) also updates
Node.js if needed:

```bash
curl -fsSL https://openclaw.ai/install.sh | bash -s -- --no-onboard --no-prompt
export PATH="$HOME/.npm-global/bin:$PATH"
command -v jq >/dev/null || sudo apt-get install -y jq
openclaw --version
node --version
```

Expect OpenClaw 2026.x and Node 24.16+ or 26.1+.

### Set up the Gateway service

`--accept-risk` acknowledges that the agent can run commands on this VM:

```bash
openclaw onboard --non-interactive --accept-risk --mode local \
  --auth-choice skip --install-daemon --skip-channels --skip-search
sudo loginctl enable-linger "$USER"
loginctl show-user "$USER" -p Linger
systemctl --user is-enabled openclaw-gateway
curl -fsS --retry 30 --retry-connrefused --retry-delay 5 --max-time 5 \
  http://127.0.0.1:18789/healthz
```

Expect `Linger=yes`, `enabled`, and `"ok":true`. Startup can take a minute.

### Connect Claude through exe.dev

The API key below is a placeholder; exe.dev supplies the real credentials
outside the VM. The network exception permits the integration endpoint.
Memory search uses keywords, so there's no embeddings key to arrange.

```bash
openclaw config patch --stdin <<EOF
{
  models: { providers: { anthropic: {
    baseUrl: "https://llm.int.exe.xyz",
    apiKey: "exe-llm-integration",
    request: { allowPrivateNetwork: true },
  } } },
  agents: { defaults: { model: { primary: "anthropic/claude-sonnet-5-5" } } },
  memory: { search: { provider: "none" } },
  gateway: {
    publicOrigin: "https://$(hostname).exe.xyz",
    controlUi: { allowedOrigins: ["https://$(hostname).exe.xyz"] },
    trustedProxies: ["127.0.0.1"],
  },
}
EOF
openclaw gateway restart
curl -fsS --retry 30 --retry-connrefused --retry-delay 5 --max-time 5 \
  http://127.0.0.1:18789/readyz
openclaw agent --agent main -m "Reply with exactly: pong"
```

The agent should answer `pong`.

### Set up the dashboard proxy

The [exe.dev proxy](/docs/proxy) handles HTTPS and login. nginx passes
requests to the loopback-only Gateway. This replaces the image's default site:

```bash
sudo tee /etc/nginx/sites-available/openclaw >/dev/null <<'EOF'
map $http_upgrade $openclaw_connection {
    default upgrade;
    ""      close;
}
server {
    listen 8000 default_server;
    listen [::]:8000 default_server;
    server_name _;
    location / {
        proxy_pass http://127.0.0.1:18789;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $openclaw_connection;
        proxy_set_header Host $host;
        # Overwrite, never append, client attribution.
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-Host $host;
        proxy_read_timeout 1d;
        proxy_send_timeout 1d;
        proxy_buffering off;
        client_max_body_size 50m;
    }
}
EOF
sudo rm -f /etc/nginx/sites-enabled/default
sudo ln -sf /etc/nginx/sites-available/openclaw /etc/nginx/sites-enabled/openclaw
sudo nginx -t && sudo systemctl enable --now nginx && sudo systemctl reload nginx
curl -fsS http://127.0.0.1:8000/healthz
```

Expect `"ok":true` through nginx, too.

### Set up nightly backups

Keep two weeks of private archives:

```bash
mkdir -p ~/.config/systemd/user ~/backups/openclaw
chmod 700 ~/backups ~/backups/openclaw
cat > ~/.config/systemd/user/openclaw-backup.service <<'EOF'
[Unit]
Description=OpenClaw backup

[Service]
Type=oneshot
UMask=0077
ExecStart=%h/.npm-global/bin/openclaw backup create --output %h/backups/openclaw --verify
ExecStart=/usr/bin/find %h/backups/openclaw -name *-openclaw-backup.tar.gz -mtime +14 -delete
EOF
cat > ~/.config/systemd/user/openclaw-backup.timer <<'EOF'
[Unit]
Description=Nightly OpenClaw backup

[Timer]
OnCalendar=*-*-* 03:30:00
RandomizedDelaySec=30m
Persistent=true

[Install]
WantedBy=timers.target
EOF
systemctl --user daemon-reload
systemctl --user enable --now openclaw-backup.timer
systemctl --user start openclaw-backup.service
journalctl --user -u openclaw-backup -n 20 --no-pager
systemctl --user list-timers openclaw-backup.timer
```

Look for `Archive verification: passed` and a scheduled next run.

### Open the dashboard

Open `https://my-openclaw.exe.xyz/` and sign in first. On the VM, generate
your private, one-time pairing link:

```bash
(
  set -o pipefail
  openclaw dashboard --json | jq -er '.browserUrl // empty' | sed \
    -e "s#^http://[^/]*/#https://$(hostname).exe.xyz/#" \
    -e "s#gatewayUrl=[^&]*#gatewayUrl=wss%3A%2F%2F$(hostname).exe.xyz#"
)
```

Open the printed link in the same browser within ten minutes, then try
the chat. Rerun the command if the link expires.

</details>

<details id="connect-telegram" class="dp-details">
<summary>Connect Telegram by hand (optional)</summary>

On the VM, paste the token from @BotFather when prompted:

```bash
read -rsp "Telegram bot token: " token; echo
openclaw channels add --channel telegram --token "$token"
unset token
openclaw channels status --probe
```

Expect Telegram to be enabled and configured. Message your bot, then
replace `YOUR_PAIRING_CODE` below with the code it sends **you**:

```bash
openclaw pairing approve telegram YOUR_PAIRING_CODE
```

Enter your numeric user ID from that same reply—not your @username:

```bash
read -rp "Your Telegram user ID: " telegram_id
openclaw config set channels.telegram.allowFrom "[\"$telegram_id\"]" --strict-json
openclaw config set channels.telegram.dmPolicy allowlist
openclaw config set commands.ownerAllowFrom "[\"telegram:$telegram_id\"]" --strict-json
unset telegram_id
openclaw config get channels.telegram.dmPolicy
openclaw config get channels.telegram.allowFrom
```

Expect `allowlist` and only your ID. Send another message to check the
reply. Groups stay blocked; see [Telegram access control](https://docs.openclaw.ai/channels/telegram/access-control)
before adding any.

</details>

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

On the VM, take a fresh backup:

```bash
openclaw backup create --output ~/backups/openclaw --verify
```

For this recipe's default paths, replace `BACKUP.tar.gz` with your chosen
archive's filename. Use fresh staging and old-state directory names if
these already exist:

```bash
openclaw backup restore ~/backups/openclaw/BACKUP.tar.gz --target ~/openclaw-restore
```

Only continue if verification and extraction succeeded:

```bash
state=(~/openclaw-restore/*/payload/posix/home/exedev/.openclaw)
test "${#state[@]}" -eq 1 &&
test -f "${state[0]}/openclaw.json" &&
test ! -e ~/.openclaw.before-restore &&
systemctl --user stop openclaw-gateway &&
mv ~/.openclaw ~/.openclaw.before-restore &&
mv "${state[0]}" ~/.openclaw &&
openclaw doctor --non-interactive &&
systemctl --user start openclaw-gateway &&
openclaw gateway status
```

Try a chat before removing the old state in `~/.openclaw.before-restore`.
Old archives also restore old access permissions; review your pairings.
Moving to a new VM? Ask Shelley to restore your archive and update the
dashboard address. More in [OpenClaw's backup reference](https://docs.openclaw.ai/cli/backup).

</details>

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

On the VM, back up before upgrading:

```bash
openclaw backup create --output ~/backups/openclaw --verify &&
openclaw update &&
openclaw gateway status
```

Reload the dashboard and try a chat. Your settings and memory stay put.

</details>

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

Ask Shelley, or check on the VM:

```bash
openclaw gateway status
journalctl --user -u openclaw-gateway -n 50 --no-pager
openclaw doctor
```

- **Expired pairing link?** Make a [fresh one](#open-the-dashboard).
- **502 or a slow restart?** Give it a minute, then check the log above.
- **Browser origin not allowed?** Rerun the [address configuration](#connect-claude-through-exedev).
- **Telegram is quiet?** `openclaw channels status --probe` reports token
  errors. Check that the allowlist contains your numeric user ID.
- **Claude won't reply?** Check the provider's `allowPrivateNetwork` setting
  above and your [LLM integration](/docs/integrations-llm).

</details>

## Frequently asked questions

### What does it cost?

Your [VM plan](https://exe.dev/pricing) plus model usage. Background tasks can use tokens too; ask Shelley to adjust or turn off the heartbeat to reduce background usage.

### Can I use my own model or subscription?

Yes. See the [LLM integration's connection options](/docs/integrations-llm), or ask Shelley to help you switch providers.

### Can I use WhatsApp or Discord instead?

Yep. Telegram is optional, and OpenClaw supports [other chat apps](https://docs.openclaw.ai/channels), too.

### Is this the same as Clawdbot?

Yes—Clawdbot and Moltbot were earlier names for OpenClaw.


## Related

- [Run Claude Code on a remote server](https://exe.dev/deploy/claude-code.md): A computer for Claude. A breather for your laptop.
- [VS Code in your browser, with code-server](https://exe.dev/deploy/code-server.md): Your editor in a tab. Your projects right where you left them.
- [Self-host n8n](https://exe.dev/deploy/n8n.md): Connect your apps. Let the boring bits run themselves.
- [Self-host Uptime Kuma](https://exe.dev/deploy/uptime-kuma.md): A little lookout for your websites. Green bars encouraged.
