Building a Self-Hosted AI Assistant with OpenClaw on Proxmox
Development

Building a Self-Hosted AI Assistant with OpenClaw on Proxmox

Ricardo Gil
February 18, 2026
7 min read
#Self-Hosting #Proxmox #AI #OpenClaw #Signal #Home Lab #Linux

Introduction

Cloud AI assistants are convenient, but they come with tradeoffs: your conversations go to third-party servers, you're locked into subscription pricing, and you have no control over the infrastructure. What if you could run your own AI assistant on hardware you already own, accessible from your phone via Signal, with no monthly fees beyond the LLM API calls?

That's exactly what I built using OpenClaw running on an isolated Ubuntu VM inside my Proxmox home lab. This guide walks through the full setup — from VM creation and network isolation to Signal integration and day-to-day usage.

What Is OpenClaw?

OpenClaw is an open-source personal AI agent framework. Unlike a simple chatbot, it's a full gateway that connects LLM providers (OpenAI, Anthropic, local models) to messaging channels like Signal, Telegram, Discord, and WhatsApp. You run it on your own infrastructure and interact with it through the messaging apps you already use.

Key characteristics:

  • Self-hosted — runs on your hardware, your network
  • Multi-channel — connects to Signal, Telegram, WhatsApp, Discord, and more
  • Extensible — add skills (plugins) to give it new capabilities
  • Tool-enabled — can run shell commands, read/write files, search the web

Architecture Overview

The setup consists of three layers:

code
Signal App (Phone)
       ↕ encrypted Signal protocol
signal-cli (linked device daemon)
       ↕ JSON-RPC HTTP
OpenClaw Gateway (Node.js)
       ↕ API calls
LLM Provider (OpenAI / Anthropic)

Everything except the LLM API calls stays on-premise. The LLM provider only sees your prompts — not your infrastructure, files, or personal data unless you explicitly send them.

Why an Isolated VM?

Running OpenClaw in an isolated Proxmox VM gives you several advantages:

  • Network isolation — the VM lives on its own bridge (vmbr1, 10.10.10.0/24) with no direct LAN access
  • NAT for internet — outbound internet works via iptables NAT on the Proxmox host, so the VM can reach LLM APIs but can't laterally access other VMs
  • Blast radius containment — if OpenClaw is compromised via prompt injection or a malicious skill, it can't reach your other machines
  • Clean rollback — snapshot the VM before major changes

This matters because OpenClaw can execute shell commands on the host VM. Isolation ensures that capability is scoped to a minimal environment.

Setting Up the Proxmox VM

Network Bridge

On the Proxmox host, create an isolated bridge in /etc/network/interfaces:

bash
auto vmbr1
iface vmbr1 inet static
    address 10.10.10.1/24
    bridge-ports none
    bridge-stp off
    bridge-fd 0
    post-up   echo 1 > /proc/sys/net/ipv4/ip_forward
    post-up   iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o vmbr0 -j MASQUERADE
    post-up   iptables -A FORWARD -i vmbr1 -o vmbr0 -j ACCEPT
    post-up   iptables -A FORWARD -i vmbr0 -o vmbr1 -m state --state RELATED,ESTABLISHED -j ACCEPT
    post-down iptables -t nat -D POSTROUTING -s 10.10.10.0/24 -o vmbr0 -j MASQUERADE

bridge-ports none means no physical NIC is attached — the VM can't reach your LAN directly. The iptables rules handle outbound NAT through your main interface.

VM Specs

For a lightweight OpenClaw deployment:

Setting Value
OS Ubuntu Server 24.04 (minimized)
CPU 2 cores
RAM 4GB
Disk 32GB
Network vmbr1 (isolated bridge)
Machine q35 + UEFI

Static IP Inside the VM

Configure netplan at /etc/netplan/50-cloud-init.yaml:

yaml
network:
  version: 2
  ethernets:
    enp6s18:
      addresses:
        - 10.10.10.10/24
      routes:
        - to: default
          via: 10.10.10.1
      nameservers:
        addresses:
          - 1.1.1.1
          - 8.8.8.8

Installing OpenClaw

Prerequisites

bash
# Node.js 22+
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt install -y nodejs git

# pnpm
npm install -g pnpm

Install from Source

bash
git clone https://github.com/openclaw/openclaw.git
cd openclaw
pnpm install
pnpm ui:build
pnpm build

Run the Onboarding Wizard

bash
pnpm openclaw onboard

The wizard walks through:

  1. LLM provider selection (OpenAI, Anthropic, local)
  2. Gateway configuration (port, bind address)
  3. Channel setup (Signal, Telegram, etc.)
  4. Skills configuration

Install as a System Service

The wizard installs a systemd user service automatically:

bash
# Start/stop
pnpm openclaw gateway start
pnpm openclaw gateway stop

# Check status
journalctl --user -u openclaw-gateway.service -f

Signal Integration

Signal is the most private channel option — end-to-end encrypted with minimal metadata. The integration uses signal-cli as a linked device on your existing Signal account.

Key Requirement: Native Binary

OpenClaw bundles its own signal-cli binary at ~/.openclaw/tools/signal-cli//signal-cli. Make sure it's using this binary, not the system-installed one, to ensure HTTP daemon support works correctly:

bash
pnpm openclaw config set channels.signal.cliPath \
  ~/.openclaw/tools/signal-cli/0.13.24/signal-cli

Linking to Your Signal Account

bash
# Stop the gateway first
pnpm openclaw gateway stop

# Generate a link URI
signal-cli link -n "OpenClaw"
# Outputs: sgnl://linkdevice?uuid=...

# In a second terminal, generate QR code
qrencode -t ansiutf8 "sgnl://linkdevice?uuid=..."

Scan the QR with Signal → Settings → Linked Devices → Link New Device. Keep the first terminal running until it confirms the link.

Important: Loop Protection

OpenClaw ignores messages from the same account it's running on (loop protection). This means you cannot message it from the same Signal number the bot is linked to. Use a different phone/number to send messages, or use a dedicated bot number registered separately.

Pairing

First message from a new number triggers a pairing flow. Approve it:

bash
pnpm openclaw pairing approve signal <CODE>

Once approved, that number can chat with the bot without further codes.

Personalizing the Assistant

AGENTS.md

The most impactful customization is ~/.openclaw/workspace/AGENTS.md. This file tells the agent who you are and how to behave. You can create it directly or tell the bot in chat to create it for you.

Example structure:

markdown
# AGENTS.md

## User Profile
- Name: [Your name]
- Profession: Software engineer
- Location: [City, State]
- Current Focus: [Job hunting / side projects / etc.]
- Infrastructure: Home lab on Proxmox

## Communication Style
- Be direct and technical
- Skip pleasantries
- Assume engineering background

Built-in Capabilities

Out of the box, the agent can:

  • Run bash commands on the VM
  • Read and write files in the workspace
  • Answer questions using its LLM
  • Check the weather (built-in skill)

Extending with Skills

OpenClaw has a skill registry at ClawHub. Install skills into your workspace:

bash
cd ~/.openclaw/workspace
npx clawhub search web
npx clawhub install web-pilot

Skills are markdown files with embedded instructions and optional scripts. They're picked up automatically when the gateway restarts.

Real-World Usage

Once set up, interaction is just Signal messages:

  • "Check my VM's disk and memory usage" → runs df -h and free -h, replies with results
  • "Search for .NET jobs in Fort Lauderdale" → uses web-pilot skill to search and summarize
  • "Draft a cover letter for this job posting: [URL]" → fetches the page, writes the letter
  • "What's the weather this week?" → uses built-in weather skill
  • "Create a bash script that..." → writes and saves to workspace

The assistant maintains conversation context per session. /new starts a fresh session, /model switches the LLM, /status shows system state.

Security Considerations

A few important hardening steps:

Network isolation — as described above, the VM has no direct LAN access. Even with bash tools enabled, lateral movement to other VMs isn't possible without explicitly routing through the Proxmox host.

Pairing + allowlists — configure channels.signal.allowFrom with only the phone numbers you trust. Unknown numbers get a pairing code that expires after 1 hour.

Skill vetting — treat community skills like untrusted npm packages. Read the source before installing. ClawHub flags suspicious skills but do your own review.

Run the security audit periodically:

bash
pnpm openclaw security audit --deep
pnpm openclaw security audit --fix

Conclusion

Self-hosting an AI assistant on Proxmox gives you a powerful, private, always-on agent accessible from anywhere via Signal — without routing your conversations through third-party infrastructure. The setup takes a few hours the first time, but once running it's low-maintenance and highly customizable.

The combination of Proxmox's VM isolation, signal-cli's end-to-end encryption, and OpenClaw's extensible skill system makes this a solid foundation for a personal AI workflow that you actually control.

If you're already running a Proxmox home lab, adding an OpenClaw VM is a natural next step.


Running a similar setup or have questions? Reach out or leave a comment below.

Want private AI running inside your business?

I deploy local LLMs (Ollama + Open WebUI) on your own hardware, so your data never leaves the building. Setup, hardening and team training included. See the Private AI Stack →

Have questions first? Book a free discovery call.

📬Weekly Newsletter

Get the best home lab & AI content

No spam. One email per week. Unsubscribe anytime.

Share this article