Deployment runbook: Standalone Mac mini (local-first, high privacy)
March 27, 2026 · View on GitHub
Note: This guide is for OpenClaw (formerly Moltbot/Clawdbot).
Table of contents (Explain OpenClaw)
- Home (README)
- Plain English
- Technical
- Privacy + safety
- Deployment
- Optimizations
- Reference
Goal: run OpenClaw on a dedicated Mac mini at home with minimal network exposure.
If you can, this is the safest default deployment: you control the hardware, disk encryption is easy, and “remote exposure” can be optional.
Related official docs:
- https://docs.openclaw.ai/start/getting-started
- https://docs.openclaw.ai/gateway/security
- https://docs.openclaw.ai/gateway/remote
- https://docs.openclaw.ai/gateway/tailscale
Recommended posture (summary)
gateway.bind: "loopback"(localhost only)- DM policy:
pairingorallowlist - Only enable the channels you actually need
- Avoid exposing browser control remotely
- Run
openclaw security audit --deepafter setup and after any config change
Step-by-step setup
1) Create a dedicated user (optional but recommended)
If you treat this Mac mini as an "assistant appliance", create a dedicated macOS user (e.g. moltbot) and run the service under that user. This reduces accidental data leakage into your main user's home directory.
Create the user via System Settings, or use dscl for scripted setup:
sudo dscl . -create /Users/moltbot
sudo dscl . -create /Users/moltbot UserShell /bin/zsh
sudo dscl . -create /Users/moltbot UniqueID 550
sudo dscl . -create /Users/moltbot PrimaryGroupID 20
sudo dscl . -create /Users/moltbot NFSHomeDirectory /Users/moltbot
sudo mkdir -p /Users/moltbot
sudo chown moltbot:staff /Users/moltbot
2) Install OpenClaw
curl -fsSL https://openclaw.ai/install.sh | bash
Or:
npm install -g openclaw@latest
Verify Node.js version (22.14.0+ required):
node --version # Should be v22.14.0 or later
3) Onboard and install the background service
openclaw onboard --install-daemon
This typically sets up a per-user service (launchd) and writes config under ~/.openclaw/.
For automated/headless setup with a custom LLM provider (Ollama, LM Studio, etc.):
export CUSTOM_API_KEY="your-api-key-here"
openclaw onboard --non-interactive --install-daemon \
--custom-base-url "http://localhost:11434/v1" \
--custom-model-id "llama3" \
--custom-compatibility openai
See Non-interactive onboarding flags for all options.
4) Verify basics
openclaw gateway status
openclaw status
openclaw health
openclaw security audit --deep
If the audit suggests fixes:
openclaw security audit --fix
5) Open the dashboard (Control UI)
Local (same machine):
If auth is enabled and you don’t have the token in the browser yet:
openclaw dashboard
Connecting messaging channels (high-level guidance)
OpenClaw supports many channels; two common ones:
- Uses WhatsApp Web / Baileys.
- Login flow typically uses QR code:
openclaw channels login
Docs: https://docs.openclaw.ai/channels/whatsapp
Telegram
- Uses a bot token created via @BotFather.
- DM pairing is commonly enabled by default; approve yourself:
openclaw pairing list telegram
openclaw pairing approve telegram <CODE>
Docs: https://docs.openclaw.ai/channels/telegram
Optional: remote access (still private)
Option A (universal): SSH tunnel
From your laptop:
ssh -N -L 18789:127.0.0.1:18789 user@mac-mini
Then open:
Option B (best UX): Tailscale Serve
Keep gateway.bind: "loopback" and use Tailscale Serve to publish the Control UI to your tailnet over HTTPS.
brew install tailscale
tailscale up
sudo tailscale serve --bg --https=443 127.0.0.1:18789
{
"gateway": {
"bind": "loopback",
"tailscale": { "mode": "serve" },
"auth": { "allowTailscale": true }
}
}
Access at https://<machine-name>.<tailnet>.ts.net/.
For shields-up, ACLs, and Funnel details, see VPS Tailscale section.
Docs: https://docs.openclaw.ai/gateway/tailscale
Post-Deployment: Read This First
Before you start using OpenClaw daily, read these operational gotchas from real users:
- The 60% Success Rule — Tasks with >10 steps fail 40% of the time due to context drift
- "Draft vs Send" Ambiguity — Agents may interpret "draft" as "create and send"
- Browser Profile Bleed — Using your daily Chrome profile gives agent access to ALL your logged-in accounts
- Dormancy Trap — Long sessions cause agent to freeze or lose track of context
- Always-On Cost — Running 24/7 costs more than expected (473 requests/day = $847/month in one case)
See: Operational Gotchas for 10 real-world usage patterns that go wrong and how to fix them.
Host hardening checklist (Mac mini)
Based on VibeProof Security Guide (uses legacy "Moltbot" name) and code review.
Operating System
- Enable FileVault (full disk encryption)
- Keep macOS updated:
softwareupdate -ia - Enable firewall: System Settings → Network → Firewall → Turn On
User Isolation
- Create a dedicated user (see Step 1 above)
- Run the gateway service under that user
Node.js Version
Ensure Node.js 22.14.0+ (minimum required per package.json engines field):
node --version # Should be v22.14.0 or later
Gateway Security
Set a gateway auth token for production:
export GATEWAY_AUTH_TOKEN="$(openssl rand -hex 32)"
# Add to ~/.zprofile or pass via config
Credential Protection
- Treat
~/.openclaw/as secret material (mode 0700) - Avoid installing random global npm packages
Protect shell history from credential leakage:
# Add to ~/.zshrc or ~/.zprofile
export HISTCONTROL=ignoreboth
export HISTFILESIZE=0
Sandbox Configuration
Enable Docker sandbox for code execution tools:
# In openclaw.json
# "agents.defaults.sandbox.mode": "all"
# "agents.defaults.sandbox.docker.network": "none"
This isolates any successful prompt injection to the container environment.
See: Prompt Injection Attacks for 30 examples of the attack patterns sandbox isolation defends against.
Backups (privacy-first)
If you back up anything, back up only what you understand, and encrypt it.
Consider backing up:
- your
openclaw.jsonconfig - only the credentials you are comfortable restoring
Avoid backing up:
- session transcripts (unless you explicitly need them)