๐Ÿ“– Installation Guide

Install ClawBoard Pro
on your VPS

One command installs OpenClaw, NemoClaw, and Deep Agents on any Ubuntu 20.04+ server. You'll have a running audit agent in under 5 minutes.

Last updated Mar 2026 ยท v1.0 ยท Ubuntu 20.04+ ยท Python 3.11

Requirements

Before installing, make sure your VPS meets these minimums:

RequirementMinimumRecommended
OSUbuntu 20.04 LTSUbuntu 22.04 LTS
RAM1 GB2 GB
Storage5 GB free20 GB
Python3.113.11 or 3.12
Port3000 open3000 + 443 (HTTPS)
DockerOptionalRecommended for full stack
Hostinger VPS: The KVM 1 plan (1 vCPU, 4 GB RAM, Ubuntu 22.04) works well and costs ~$5/mo. That is more than enough to run all three services.

One-liner install

The fastest way. One command installs Python, uv, clones the repo, installs all dependencies, starts the server, and sets up a daily cron.

your-vps ~ bash
# Run as root or sudo user
$ curl -fsSL https://raw.githubusercontent.com/Get-Second-Step/clawboard-agent/main/install.sh | bash

The installer does the following automatically:

  1. Installs Python 3.11, uv, git, and Chromium (for PDF generation)
  2. Clones the repo to ~/clawboard-agent
  3. Installs all Python dependencies via uv pip install
  4. Creates a systemd service (or nohup fallback) and starts OpenClaw on port 3000
  5. Opens port 3000 in UFW if active
  6. Sets up a daily 9am audit cron job
  7. Adds clawboard and clawboard-logs shell aliases
After install: The installer prints your server IP. Open http://your-vps-ip:3000 in any browser to start connecting your ad accounts.

Docker Compose (full stack)

Run all three services โ€” OpenClaw, NemoClaw, and Deep Agents โ€” in isolated containers with Docker Compose. Recommended for production deployments.

NemoClaw requires Docker. The full NVIDIA NeMo Guardrails security layer only runs in the Docker setup. The one-liner install runs OpenClaw and Deep Agents natively but skips the containerised guardrails service.
Full stack ยท Docker Compose
# 1. Clone the repo
$ git clone https://github.com/Get-Second-Step/clawboard-agent.git && cd clawboard-agent

# 2. Copy and fill credentials
$ cp config/credentials.env.example config/credentials.env
$ nano config/credentials.env

# 3. Start all three services
$ docker compose up -d

# Check status
$ docker compose ps
openclaw running 0.0.0.0:3000->3000/tcp
nemoclaw running 127.0.0.1:8080->8080/tcp
deep-agents running

Service ports

ServicePortAccessPurpose
openclaw3000PublicWeb UI, chat, OAuth callbacks
nemoclaw8080Internal onlyNeMo Guardrails security layer
deep-agentsInternalInternal onlyLangGraph audit engine

Manual install

For users who want to inspect every step before running anything.

01

Clone the repo

Review the source code before installing anything.

bash
$ git clone https://github.com/Get-Second-Step/clawboard-agent.git
$ cd clawboard-agent
02

Install Python dependencies

# Install uv (fast package manager)
$ curl -LsSf https://astral.sh/uv/install.sh | sh
$ uv pip install --system -r requirements.txt
03

Configure credentials

$ cp config/credentials.env.example config/credentials.env
$ nano config/credentials.env
# Or use the web UI at http://your-ip:3000/settings
04

Generate Google OAuth token

$ python3 scripts/generate_google_token.py
# Opens browser โ†’ approve access โ†’ paste back the token
05

Start the server

$ python3 server.py
ClawBoard Pro running at http://0.0.0.0:3000

Credentials reference

All credentials live in config/credentials.env. Never commit this file โ€” it is in .gitignore by default.

KeyRequiredWhere to get it
GOOGLE_AI_API_KEYRecommendedaistudio.google.com โ†’ Get API Key (free tier)
GOOGLE_ADS_DEVELOPER_TOKENYesGoogle Ads โ†’ Tools โ†’ API Center
GOOGLE_ADS_CUSTOMER_IDYesYour Google Ads account ID (without dashes)
GOOGLE_CLIENT_IDYesGoogle Cloud Console โ†’ OAuth 2.0 Client
GOOGLE_CLIENT_SECRETYesGoogle Cloud Console โ†’ OAuth 2.0 Client
GOOGLE_REFRESH_TOKENYesRun python3 scripts/generate_google_token.py
META_ACCESS_TOKENOptionalMeta OAuth โ†’ set via UI at /connect
TELEGRAM_BOT_TOKENRecommended@BotFather โ†’ /newbot
TELEGRAM_CHAT_IDRecommended@userinfobot โ†’ /start
SLACK_WEBHOOK_URLOptionalSlack App โ†’ Incoming Webhooks

NemoClaw โ€” Security layer

NemoClaw is a FastAPI service built on NVIDIA NeMo Guardrails. It sits between the user interface and the LLM, validating every prompt and response.

What NemoClaw protects against: prompt injection via ad campaign names or keywords, hallucinated figures in audit reports, credential leakage in LLM responses, and off-topic model outputs.

NemoClaw runs on internal port 8080 inside the Docker network. It is never exposed publicly. OpenClaw and Deep Agents call it via http://nemoclaw:8080/guard/input and /guard/output.

Check NemoClaw health
$ curl http://localhost:8080/health
{ "status": "ok", "nemo_available": true, "rails_loaded": true, "mode": "full_guardrails" }

Running audits

From the browser

Open http://your-vps-ip:3000. Go to Agents and click Run Audit. Reports appear in the Reports tab in 2โ€“3 minutes.

From the command line

# Full audit
$ python3 audit_agent.py "Run a full performance marketing audit"

# Google Ads only
$ python3 audit_agent.py "Audit my Google Ads account"

# Ask a question
$ python3 audit_agent.py "Why did my CPA spike last week?"

Via Telegram

Once your Telegram bot is configured, send a message to your bot:

Telegram
/audit
/audit google_ads
What was my best performing campaign last week?

Troubleshooting

Port 3000 not accessible

Check UFW and confirm the service is running:

$ sudo ufw allow 3000/tcp
$ sudo systemctl status clawboard
# Or check logs:
$ tail -f ~/clawboard-agent/reports/cron.log

Google OAuth: "No refresh token returned"

Fix: Revoke access at myaccount.google.com/permissions, then re-authorise. Google only returns a refresh token on the first authorisation, or when you explicitly request offline access again.

Docker: NemoClaw unhealthy

$ docker compose logs nemoclaw
$ docker compose restart nemoclaw

Audit returning sample data

This means your Google Ads credentials are not set correctly. Check config/credentials.env for any fields still containing your_ placeholder values.