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

Building a Self-Hosted AI Assistant with OpenClaw on Proxmox

Ricardo Gil
February 18, 2026
12 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.

    📬Weekly Newsletter

    Get the best home lab & AI content

    No spam. One email per week. Unsubscribe anytime.

    Share this article