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:
Architecture Overview
The setup consists of three layers:
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:
vmbr1, 10.10.10.0/24) with no direct LAN accessThis 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:
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:
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
# Node.js 22+
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt install -y nodejs gitpnpm
npm install -g pnpm
Install from Source
git clone https://github.com/openclaw/openclaw.git
cd openclaw
pnpm install
pnpm ui:build
pnpm build
Run the Onboarding Wizard
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:
# Start/stop
pnpm openclaw gateway start
pnpm openclaw gateway stopCheck 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/. Make sure it's using this binary, not the system-installed one, to ensure HTTP daemon support works correctly:
pnpm openclaw config set channels.signal.cliPath \
~/.openclaw/tools/signal-cli/0.13.24/signal-cli
Linking to Your Signal Account
# Stop the gateway first
pnpm openclaw gateway stopGenerate 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:
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:
# AGENTS.mdUser 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 backgroundBuilt-in Capabilities
Out of the box, the agent can:
Extending with Skills
OpenClaw has a skill registry at ClawHub. Install skills into your workspace:
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:
df -h and free -h, replies with resultsThe 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:
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.
