A self-hosted iMessage AI assistant on a Mac mini
How to turn a Mac mini into a 24/7 iMessage AI assistant — blue bubbles, group chats, vision, voice, all self-hosted with openclawOS.
- imessage
- mac mini
- tutorial
- apple
iMessage is a status symbol on the consumer internet. Blue bubbles, tapbacks, end-to-end encryption (within Apple’s stack), the lot. Self-hosting an AI assistant inside iMessage used to be more pain than fun. Mac mini + openclawOS makes it surprisingly clean.
The hardware play
Pick a base-model Mac mini. The M4 at $599 is the sweet spot. 16GB RAM, 256GB SSD, fanless, draws ~5W at idle. Plug it in behind your TV. Sign into iCloud with your Apple ID. Enable Continuity so SMS forwarding works too. Done.
Install openclawOS
npm install -g openclawos@latest
openclawos onboard --install-daemon
The first run prompts you to grant Full Disk Access (so it can read ~/Library/Messages/chat.db) and Automation permission (so it can send via Messages.app via AppleScript). Both are normal macOS privacy grants.
Pair iMessage
openclaw apps install imessage
The CLI walks you through. There is no QR code — your Mac is already signed into iMessage; openclawOS just plugs in.
Choose Pi’s “handle”
You have three options:
- Your own number with a sentinel. Pi only responds when a message starts with
^^(or whatever you pick). Good if you don’t want a separate identity. - A second Apple ID email added to Messages.app. Pi gets its own handle; people message that.
- A FaceTime number if you have one available. Same idea.
Option 2 is what most people end up doing. It separates “you texting” from “Pi’s identity” cleanly.
Bindings
The default iMessage binding listens to DMs:
trigger:
channel: imessage
match:
not:
isGroup: true
agent: pi
session:
scope: user
Group chats: by default Pi ignores them unless @-mentioned. Customize by editing ~/.openclaw/bindings/imessage.yaml.
Voice notes
Voice notes are transcribed via Whisper. Pi treats them as text. If you want Pi to reply with voice, configure a TTS provider in ~/.openclaw/config.yaml:
tts:
provider: openai
voice: nova
triggerFor: imessage
Tapbacks as quick commands
Apple’s tapback reactions (heart, thumbs-up, etc.) can trigger Pi actions. Common use: react with 👍 to a Pi reply and Pi remembers “this answer was good”; react with 👎 and Pi notes “this approach didn’t work”.
The morning brief setup
A favourite openclawOS recipe: a cron binding that fires at 7am, asks Pi to gather your calendar + weather + GitHub activity + Hacker News, and ships the result as an iMessage to your phone. You wake up, glance at iMessage, you’re caught up.
trigger:
cron: "0 7 * * *"
agent: pi
prompt: |
Pull my Google Calendar for today.
Weather in Berlin.
Top three Hacker News stories.
Any open PRs needing review at neullabs/openclawos.
Reply as a single iMessage, no preamble.
output:
channel: imessage
to: "+49 ..."
Privacy reality
Messages stay on the Mac. The chat.db is encrypted-at-rest if you have FileVault on (you do, right?). Pi’s outbound LLM call carries only the active turn. No cloud middleman.
The compound effect
The Mac mini quickly stops being “the iMessage server” and becomes “the household AI server”. You’ll add a WhatsApp pairing, a Telegram bot, an iOS node. One little box, one consistent agent, every messenger.
Frequently asked
Because iMessage is macOS-only at the protocol layer. A base-model M4 Mac mini ($599) is the cheapest 24/7 macOS box you can buy. It runs cool, uses ~5W idle, and handles the full openclawOS stack with room to spare.
Related reading
Self-hosted openclawOS vs Claude.ai: the real cost difference
Honest math on what a self-hosted multi-channel AI agent costs vs Claude.ai or ChatGPT Plus — for personal, family, and small-team use cases.
How to build a self-hosted WhatsApp AI bot in 2026
A practical walkthrough of pairing WhatsApp to a self-hosted AI agent powered by Claude or GPT — using openclawOS, no Meta Business API, no cloud SaaS in the middle.