Self-Hosting an AI Assistant: Part 3 - Installing OpenClaw
Installing Node.js 22 and OpenClaw on WOPR to bring Joshua to life.
With WOPR hardened, it’s time to install OpenClaw - the framework that will power Joshua, my self-hosted AI assistant.
Why OpenClaw
I wanted an AI assistant I could interact with naturally via Discord - something that runs 24/7 on my own hardware, uses my own API keys, and gives me full control. OpenClaw fits that niche. It’s essentially a bridge between chat platforms and LLM APIs, with the ability to execute tasks, manage files, and run automation.
The name Joshua comes from WarGames, naturally. “Shall we play a game?”
Node.js 22
OpenClaw requires Node.js 22+. Ubuntu’s default repos have an older version, so we’ll use NodeSource:
1
2
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt install -y nodejs
Verify the installation:
1
2
node --version
npm --version
You should see something like:
1
2
v22.22.0
10.9.4
Install OpenClaw
With Node.js in place, install OpenClaw globally:
1
sudo npm install -g openclaw@latest
Then run the onboarding wizard with the daemon flag to set it up as a background service:
1
openclaw onboard --install-daemon
This walks you through initial configuration and installs a systemd service so Joshua starts automatically when WOPR boots.
Daemon Management
Once installed, you can manage Joshua with these commands:
| Task | Command |
|---|---|
| Start daemon | openclaw daemon start |
| Stop daemon | openclaw daemon stop |
| Check status | systemctl status openclaw |
| View logs | openclaw logs |
| Check model status | openclaw models status |
The config lives in ~/.openclaw/:
1
2
3
~/.openclaw/
├── openclaw.json # Main config
└── agents/main/agent/auth-profiles.json # API credentials
Dashboard Access
OpenClaw runs a local dashboard on port 18789. Since WOPR is headless, use an SSH tunnel to access it:
1
ssh -N -L 18789:127.0.0.1:18789 lightman@192.168.2.89
Then open http://localhost:18789 in your browser. The onboarding process will give you a token to append to the URL for authentication.
Next Up
Joshua is installed but not yet connected to anything useful. Next post covers setting up a Discord bot so I can actually talk to him. “Greetings, Professor Falken.”
This post was co-written with Claude, who will soon be the brain behind Joshua.