The complete guide to setting up OpenClaw on a Mac mini (local, always-on, starts at boot) and deploying to fly.io (cloud, accessible from anywhere). Real commands. No hand-waving.
One-time payment · Instant PDF download
Install Node.js 24, OpenClaw, run the onboarding wizard, configure openclaw.json and the .env file. Set up launchd so it starts automatically on every boot.
Create the app and persistent volume, configure fly.toml correctly (including the settings that trip everyone up), set secrets, deploy, and create your config via SSH.
Create a bot via BotFather, connect it to your gateway, complete the pairing flow, and optionally set up group chats. Both long-polling and webhook modes covered.
Where to put API keys so the background service actually reads them (not .zshrc). Covers ~/.openclaw/.env on Mac and fly secrets on fly.io.
Configure Anthropic, OpenAI, Google, and OpenRouter. Set fallback models so your agent keeps working if one provider hits a rate limit.
Deploy to fly.io with no public IP using fly.private.toml. Access via fly proxy, WireGuard, or SSH only.
Every common error with the exact fix. Gateway lock files, memory issues, iCloud conflicts, Telegram privacy mode, port conflicts, state persistence — all covered.
All key files, environment variables, service commands, and in-chat commands on one page. Print it out or keep it open while you work.
OpenClaw's README gets you 70% of the way there. The other 30% — the fly.toml settings that trip people up, why launchd doesn't inherit your shell environment, the gateway lock file that silently blocks restarts — those live scattered across GitHub issues and closed Discord threads.
This guide is sourced from the official docs, the repo's source files, and the actual error messages you hit when deploying. Every command is tested. Every troubleshooting fix is real.
It covers Mac mini because that's the best always-on home server. It covers fly.io because that's what the official repo recommends for cloud. And it covers the mistakes so you don't have to make them.
Here's an example of the kind of gotcha this guide covers:
auto_stop_machines = true
If you leave this as the fly.io default, the machine will stop after a few minutes of inactivity. Your Telegram connection drops. Messages go undelivered. The machine restarts when fly.io gets a new request — but by then Telegram has given up polling.
auto_stop_machines = false
Always set this to false. The machine runs 24/7, Telegram polling stays alive, your agent is always there when you message it.
The guide has 14 of these — the exact errors with the exact fixes.
17 pages. Every setup step. Every common error. One payment, instant download.
Get the guide — $19One-time payment · PDF download · No subscription