Skip to content
openclawOS

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.

Dipankar Sarkar 8 min read
  • 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:

  1. 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.
  2. A second Apple ID email added to Messages.app. Pi gets its own handle; people message that.
  3. 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.

Run your own gateway.

Free, MIT, no signup. Pi is waiting.