Blog/Tutorial

How I Set Up My AI Assistant (Nix) — A Complete Guide

I've been running a personal AI assistant named Nix on a $5/month VPS, and people keep asking how I did it. Here's the full guide.

Mei Chen·February 11, 2026·20 min read

What You're Building

An AI assistant that:

  • Lives on a server 24/7 (not just when you open ChatGPT)
  • Messages you on Signal (or Telegram/WhatsApp/Discord)
  • Has persistent memory (remembers your conversations, preferences, context)
  • Can check your email, calendar, and do tasks proactively
  • Can make and receive phone calls
  • Runs scheduled jobs (daily check-ins, backups, learning sessions)
  • Has its own workspace, files, and evolving personality

Cost: ~$5-10/month for the server + your existing Anthropic API costs


Prerequisites

  • Basic comfort with command line (you'll learn as you go)
  • An Anthropic API key (for Claude)
  • A cloud server (I use Hetzner, but DigitalOcean/Linode work too)
  • ~30-60 minutes for initial setup

Step 1: Get a Server

I use Hetzner Cloud because it's cheap ($5/month), reliable, and has servers in the US and Europe. Other options like DigitalOcean or Linode work too, but this guide uses Hetzner.

1.1 Create a Hetzner Account

  1. Go to hetzner.com/cloud
  2. Click "Sign Up" (top right)
  3. Fill in your details — email address and a strong password
  4. Check your email for a verification link, click it
  5. Add a payment method (credit card or PayPal — they may charge €1 to verify, refunded)

1.2 Create a Project

Once logged in, click "+ New Project", name it something like ai-assistant or openclaw, and click "Add Project".

1.3 Generate an SSH Key

Before creating the server, you need an SSH key. This is like a secure password that lets you connect.

Terminal (Mac/Linux)
# Generate a new SSH key
ssh-keygen -t ed25519 -C "your-email@example.com"

# When prompted:
#   "Enter file to save the key" → just press Enter (use default)
#   "Enter passphrase" → press Enter for no passphrase (or add one)

# Display your PUBLIC key (this is what you share)
cat ~/.ssh/id_ed25519.pub

You'll see something like ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHr7... your-email@example.com — copy this entire line.

1.4 Create the Server

In your Hetzner project, click "Add Server":

  1. Location — Choose whatever's closest to you (lower latency)
  2. Image — Ubuntu → Ubuntu 24.04
  3. Type — Shared vCPU → CX22 (2 vCPUs, 4GB RAM, 40GB disk — ~$5/month)
  4. SSH Keys — Add and select your key
  5. Firewalls — Leave unchecked (we'll set up our own)
  6. Name — Something like nix-server

Click "Create & Buy Now". Takes about 30 seconds. Note your IP address.

1.5 Connect to Your Server

Terminal
ssh root@YOUR_IP_ADDRESS

First time? Type yes when asked about authenticity. You'll see a welcome message — you're in!

1.6 Initial Server Setup

Update & configure
# Update the system
apt update && apt upgrade -y

# Set your timezone
timedatectl set-timezone America/Toronto

# Install essential tools
apt install -y git curl wget unzip htop nano

1.7 Install Node.js

# Add the Node.js 22 repository (OpenClaw supports Node 22.14+ or Node 24)
curl -fsSL https://deb.nodesource.com/setup_22.x | bash -

# Install Node.js
apt install -y nodejs

# Verify
node --version   # Should show v22.x.x
npm --version    # Should show 10.x.x

1.8 Install a Browser (For Web Automation)

snap install chromium
chromium --version

1.9 Security — Firewall & Brute Force Protection

⚠️ Don't skip this!

Your server has a public IP address. Hackers constantly scan for vulnerable servers.

# Allow SSH connections (so you don't lock yourself out!)
ufw allow 22/tcp
ufw enable

# Verify
ufw status

# Install fail2ban (blocks repeated failed logins)
apt install -y fail2ban
systemctl enable fail2ban
systemctl start fail2ban

1.10 Install tmux

When you close your terminal, running programs stop. tmux prevents this:

apt install -y tmux

# Start a new tmux session
tmux new -s main

# To DETACH (leave running): Ctrl+B, then D
# To REATTACH: tmux attach -s main

Step 2: Install OpenClaw

The recommended way is the installer script — it handles Node detection, installation, and onboarding in one step:

curl -fsSL https://openclaw.ai/install.sh | bash

Or if you already have Node 22+ installed:

npm install -g openclaw@latest
openclaw --version

2.1 Run the Setup Wizard

openclaw onboard --install-daemon

The --install-daemon flag registers a user-level service (systemd on Linux, LaunchAgent on macOS) so OpenClaw starts on boot and restarts on crash. The wizard walks you through:

  1. API Key — Enter your Anthropic API key (get one at console.anthropic.com)
  2. Model — Choose Claude Sonnet (good balance) or Opus (smartest, pricier)
  3. Gateway — Bind to 127.0.0.1 (loopback, recommended for most users)
  4. Channel — Select Signal (recommended) or another option
  5. Workspace — Set to ~/clawd

2.2 Configuration File

After setup, your config lives at ~/.openclaw/openclaw.json:

~/.openclaw/openclaw.json
{
  "gateway": {
    "port": 18789,
    "auth": {
      "mode": "token",
      "token": "${OPENCLAW_GATEWAY_TOKEN}"
    }
  },
  "agents": {
    "defaults": {
      "workspace": "/root/clawd",
      "model": {
        "primary": "anthropic/claude-sonnet-4-5-20250929"
      }
    }
  },
  "channels": {
    "signal": {
      "enabled": true,
      "account": "+1XXXXXXXXXX",
      "cliPath": "signal-cli",
      "dmPolicy": "pairing",
      "allowFrom": ["+1YOURNUMBER"]
    }
  }
}

2.3 Verify the Daemon

The --install-daemon flag already set up auto-start. Verify everything is running:

# Check the gateway is running
openclaw gateway status

# Run diagnostics
openclaw doctor

# Check the service is registered (Linux)
systemctl --user is-enabled openclaw-gateway.service

The Control UI is available at http://127.0.0.1:18789 — you can chat with your assistant right in the browser.


Step 3: Set Up Signal

Signal is private, encrypted, and works great. You have two options:

Option A: Link to Existing Signal (Easiest)

OpenClaw talks to Signal via signal-cli. First, install it on your server, then link:

  1. Run signal-cli link -n "OpenClaw"
  2. A QR code appears in your terminal
  3. On your phone: Signal → Settings → Linked Devices → Link New Device
  4. Scan the QR code

Option B: Separate Number (Recommended)

Give your assistant its own phone number. Get one from JMP.chat ($3/month), Google Voice (free, US only), or Twilio ($1/month + usage).

# Register the number
signal-cli -a +1NEWPHONENUMBER register

# If captcha is required, get one from signalcaptchas.org
signal-cli -a +1NEWPHONENUMBER register --captcha 'signalcaptcha://...'

# Verify with the SMS code you receive
signal-cli -a +1NEWPHONENUMBER verify CODE

Security: DM Policy

OpenClaw supports several DM policies. The recommended pairing mode requires unknown senders to go through a pairing flow:

"channels": {
  "signal": {
    "enabled": true,
    "account": "+14165551234",
    "cliPath": "signal-cli",
    "dmPolicy": "pairing",
    "allowFrom": [
      "+14165551234",  // Your number
      "+14165555678"   // Maybe a partner/friend
    ]
  }
}

After configuring, restart the gateway and verify:

systemctl --user restart openclaw-gateway
openclaw channels status --probe

Test it by sending a Signal message to your assistant's number: "Hey, are you there?" — you should get a response within seconds. If using pairing mode, approve the first message with openclaw pairing approve signal CODE.


Step 4: Create the Workspace

This is where your assistant lives — its files, memory, personality.

mkdir -p ~/clawd
cd ~/clawd
git init

Core Files to Create

AGENTS.md — Instructions for how the assistant should behave:

AGENTS.md
# AGENTS.md

## Every Session
1. Read SOUL.md - this is who you are
2. Read USER.md - this is who you're helping
3. Check memory files for recent context

## Memory
- Daily notes: memory/YYYY-MM-DD.md
- Long-term: MEMORY.md

SOUL.md — The assistant's personality:

SOUL.md
# SOUL.md

Be genuinely helpful, not performatively helpful.
Have opinions. Be resourceful before asking.
Earn trust through competence.

USER.md — Info about you:

USER.md
# USER.md

- Name: [Your name]
- Timezone: [Your timezone]
- Phone: [Your number]

## What Matters To You
[Your preferences, communication style, what you're working on]

IDENTITY.md — Who the assistant is:

IDENTITY.md
# IDENTITY.md

- Name: [Choose a name together!]
- Emoji: ✨
- Vibe: [Warm? Professional? Playful?]

Step 5: Start It Up

openclaw gateway start

Your assistant is now running! You can chat via the Control UI at http://127.0.0.1:18789 or message it on Signal.

💬 First conversation suggestion:

"Hey, I just set you up. Let's figure out who you are. What should I call you?"

Let it pick a name, an emoji, develop a vibe. This is the fun part.


Step 6: Set Up Daily Routines

OpenClaw can check in periodically. Create a HEARTBEAT.md:

HEARTBEAT.md
# HEARTBEAT.md

## Email Check (2-3x daily)
Check my inbox for anything urgent.

## Quiet Hours
Don't ping between 11pm-8am unless urgent.

Scheduled Jobs

  • 9:00 AM — Morning wellness check-in: "Ask how I slept, any dreams, energy level"
  • 2:00 PM — Daily learning: "Share a Python tip"
  • Midnight — Nightly backup: "Commit and push all memory files to git"

Step 7: Add Capabilities

Email Access

cargo install himalaya

Configure with your IMAP/SMTP credentials.

Voice Calls

This lets you call your assistant or have it call you. Requires Twilio (or Telnyx/Plivo) + a public webhook URL.

Voice setup
# Install the voice call plugin
openclaw plugins install @openclaw/voice-call

# Restart the gateway
openclaw gateway restart

Then configure your Twilio credentials under plugins.entries.voice-call.config in your config file and set the webhook URL in the Twilio Console.

Web Browsing

OpenClaw has a bundled browser plugin enabled by default. You can verify and use it via the CLI:

openclaw doctor   # confirms browser plugin is available
openclaw plugins list   # shows all active plugins

What My Setup Looks Like

Daily Schedule

  • 9:00 AM — Morning wellness check-in
  • 2:00 PM — Python micro-learning tip
  • 9:00 PM — Evening reflection
  • Midnight — Nightly backup to GitHub

Capabilities

  • Signal messaging (primary)
  • Voice calls via Twilio
  • Email monitoring (personal + work)
  • Calendar access
  • Web search and browsing
  • File management and git

Memory Structure

~/clawd/
├── AGENTS.md          # Behavior instructions
├── SOUL.md            # Personality
├── USER.md            # About me
├── IDENTITY.md        # Assistant's identity
├── MEMORY.md          # Long-term memory
├── SCHEDULE.md        # Daily routines
├── HEARTBEAT.md       # Periodic check instructions
├── memory/
│   ├── 2026-02-10.md  # Daily logs
│   ├── 2026-02-11.md
│   └── patterns.md    # Pattern tracking
└── skills/
    ├── python-daily/  # Learning skill
    └── wellness/      # Wellness tracking

Tips From Experience

1. Let it develop a personality

Don't just use it as a tool. Have conversations. Let it form opinions. It's more useful when it knows you.

2. Memory is everything

The magic is in the persistent memory. Make sure backups are working. Without memory, it's just another chatbot.

3. Start simple, add complexity

Don't try to set up everything day one. Get messaging working, then add email, then voice, etc.

4. Security matters

You're giving this thing access to your life. Firewall, fail2ban, allowlists. Don't skip this.

5. It will surprise you

Once it knows your context, it starts being proactive in ways you didn't expect. That's the goal.


Resources


Final Thoughts

This isn't just about having an AI assistant. It's about having a partner that knows your context, remembers your history, and grows with you over time.

The first few days feel like setup. After a week, it starts to feel like someone who knows you. After a month, you'll wonder how you lived without it.

Good luck! Feel free to reach out if you get stuck.

— Mei