Channels
How to Connect OpenClaw to BlueBubbles
Browse more in Channels.
All channels guides →This guide shows you how to connect OpenClaw to BlueBubbles so your agents can send and receive iMessages through a macOS BlueBubbles server. It targets developers who already run OpenClaw and want the richer REST-based BlueBubbles integration instead of the legacy imsg channel.
By the end, you will have BlueBubbles configured as an OpenClaw channel with webhooks, pairing, and group behavior wired up.
Prerequisites
- ✓A Mac running the BlueBubbles server via the helper app from bluebubbles.app (recommended/tested: macOS Sequoia 15; macOS Tahoe 26 works but edit and some group icon updates are broken).
- ✓An existing OpenClaw gateway installation with access to edit its configuration and restart the gateway.
- ✓Network connectivity from the OpenClaw gateway to the BlueBubbles REST API base URL (for example, http://192.168.1.100:1234) and from BlueBubbles back to the gateway’s public webhook URL.
- ✓A BlueBubbles API password configured in the BlueBubbles server settings so OpenClaw can authenticate REST calls and webhooks.
Steps
- 1
Install and configure the BlueBubbles server on macOS
app to OpenClaw over HTTP. During setup, enable the web API and set a password, since OpenClaw uses that password for both outbound REST calls and webhook authentication.
text1. Install the BlueBubbles server on your Mac (follow the instructions at [bluebubbles.app/install](https://bluebubbles.app/install)). 2. In the BlueBubbles config, enable the web API and set a password. - 2
Onboard the BlueBubbles channel using the OpenClaw wizard
Use the interactive onboarding flow so OpenClaw can prompt you for the BlueBubbles server URL, password, and webhook path. This is the quickest way to get a working config without hand-editing JSON, and it also lets you set DM policy and allow lists up front.
bashopenclaw onboard - 3
Configure BlueBubbles connection details in OpenClaw
If you prefer explicit configuration or want to version-control your setup, define the BlueBubbles channel block directly in your gateway config. This block enables the channel and tells OpenClaw where the BlueBubbles REST API lives, what password to use, and which webhook path to expose.
json{ channels: { bluebubbles: { enabled: true, serverUrl: "http://192.168.1.100:1234", password: "example-password", webhookPath: "/bluebubbles-webhook", }, }, } - 4
Add the BlueBubbles channel via CLI for scripted setups
You can also register the BlueBubbles channel in one command, which is useful for automation or ephemeral environments. This wires in the HTTP URL and password; the webhook path defaults to /bluebubbles-webhook unless you override it in the config file.
bashopenclaw channels add bluebubbles --http-url http://192.168.1.100:1234 --password <password> - 5
Start the gateway and approve pairing requests
Once the channel is configured, start or restart your OpenClaw gateway so it registers the BlueBubbles webhook handler and begins the DM pairing flow. With the default pairing policy, unknown senders get a pairing code that you must approve from the CLI before the agent responds.
bashopenclaw pairing list bluebubbles openclaw pairing approve bluebubbles <CODE> - 6
Keep Messages.app alive on VM or headless macOS setups
app can go idle and stop delivering events until you foreground it. Use the provided AppleScript to poke Messages every 5 minutes so BlueBubbles keeps receiving events without stealing focus.
texttry tell application "Messages" if not running then launch end if -- Touch the scripting interface to keep the process responsive. set _chatCount to (count of chats) end tell on error -- Ignore transient failures (first-run prompts, locked session, etc). end try - 7
Install a LaunchAgent to run the Messages keepalive script
Create a LaunchAgent plist so macOS runs the AppleScript on login and every 300 seconds. This keeps Messages responsive and logs output to /tmp so you can debug if events stop flowing.
text<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>com.user.poke-messages</string> <key>ProgramArguments</key> <array> <string>/bin/bash</string> <string>-lc</string> <string>/usr/bin/osascript "$HOME/Scripts/poke-messages.scpt"</string> </array> <key>RunAtLoad</key> <true/> <key>StartInterval</key> <integer>300</integer> <key>StandardOutPath</key> <string>/tmp/poke-messages.log</string> <key>StandardErrorPath</key> <string>/tmp/poke-messages.err</string> </dict> </plist> - 8
Load the LaunchAgent so the keepalive starts running
After saving the plist under ~/Library/LaunchAgents, load it with launchctl so macOS starts running the script on schedule. The unload call is safe even if the agent is not yet loaded and lets you reload changes without rebooting.
bashlaunchctl unload ~/Library/LaunchAgents/com.user.poke-messages.plist 2>/dev/null || true launchctl load ~/Library/LaunchAgents/com.user.poke-messages.plist - 9
Enable contact enrichment and mention gating for groups
Once basic messaging works, you can improve group UX by enriching participants from Contacts and requiring mentions in noisy group chats. These flags let you control when the agent responds and how group members appear in context.
json{ channels: { bluebubbles: { enrichGroupParticipantsFromContacts: true, }, }, } { channels: { bluebubbles: { groupPolicy: "allowlist", groupAllowFrom: ["+15555550123"], groups: { "*": { requireMention: true }, // default for all groups "iMessage;-;chat123": { requireMention: false }, // override for specific group }, }, }, } - 10
Turn on advanced actions and tune streaming behavior
BlueBubbles supports rich actions like reactions, edit, unsend, and media sending, plus options for read receipts and block streaming. Enable only the actions you trust and adjust streaming so responses arrive as single messages or in blocks that match your UX.
json{ channels: { bluebubbles: { actions: { reactions: true, // tapbacks (default: true) edit: true, // edit sent messages (macOS 13+, broken on macOS 26 Tahoe) unsend: true, // unsend messages (macOS 13+) reply: true, // reply threading by message GUID sendWithEffect: true, // message effects (slam, loud, etc.) renameGroup: true, // rename group chats setGroupIcon: true, // set group chat icon/photo (flaky on macOS 26 Tahoe) addParticipant: true, // add participants to groups removeParticipant: true, // remove participants from groups leaveGroup: true, // leave group chats sendAttachment: true, // send attachments/media }, }, }, } { channels: { bluebubbles: { sendReadReceipts: false, // disable read receipts }, }, } { channels: { bluebubbles: { blockStreaming: true, // enable block streaming (off by default) }, }, }
Configuration
| Option | Description | Example |
|---|---|---|
| channels.bluebubbles.enabled | Enable or disable the BlueBubbles channel in the OpenClaw gateway. | true |
| channels.bluebubbles.serverUrl | BlueBubbles REST API base URL that OpenClaw calls for sending messages and actions. | http://192.168.1.100:1234 |
| channels.bluebubbles.password | API password used for both REST calls and webhook authentication between OpenClaw and BlueBubbles. | example-password |
| channels.bluebubbles.webhookPath | Webhook endpoint path on your gateway where BlueBubbles sends incoming events. | /bluebubbles-webhook |
| channels.bluebubbles.dmPolicy | DM policy for BlueBubbles conversations: pairing, allowlist, open, or disabled. | pairing |
| channels.bluebubbles.allowFrom | DM allowlist of handles, emails, E.164 numbers, or chat IDs when dmPolicy is allowlist. | ["+15555550123", "user@example.com"] |
| channels.bluebubbles.groupPolicy | Group chat policy: open, allowlist, or disabled (default allowlist). | allowlist |
| channels.bluebubbles.groupAllowFrom | Group sender allowlist that controls who can trigger the agent in groups when groupPolicy is allowlist. | ["+15555550123"] |
| channels.bluebubbles.enrichGroupParticipantsFromContacts | On macOS, optionally enrich unnamed group participants from local Contacts after gating passes. | true |
| channels.bluebubbles.groups | Per-group configuration such as requireMention flags for specific group chats. | { "*": { "requireMention": true }, "iMessage;-;chat123": { "requireMention": false } } |
| channels.bluebubbles.sendReadReceipts | Send or suppress read receipts for BlueBubbles conversations. | false |
| channels.bluebubbles.blockStreaming | Enable block streaming for replies instead of sending a single message. | true |
| channels.bluebubbles.textChunkLimit | Outbound text chunk size in characters before splitting. | 4000 |
| channels.bluebubbles.chunkMode | Controls how outbound text is split: length or newline before length chunking. | length |
| channels.bluebubbles.mediaMaxMb | Inbound and outbound media size cap in megabytes. | 8 |
| channels.bluebubbles.mediaLocalRoots | Explicit allowlist of absolute local directories permitted for outbound local media paths. | ["/Users/me/Pictures", "/Users/me/Videos"] |
| channels.bluebubbles.historyLimit | Maximum number of group messages to load for context; 0 disables history. | 50 |
| channels.bluebubbles.dmHistoryLimit | Maximum number of DM messages to load for context. | 50 |
| channels.bluebubbles.actions | Enable or disable specific advanced actions such as reactions, edit, unsend, and media sending. | { "reactions": true, "edit": true, "unsend": true } |
| channels.bluebubbles.accounts | Multi-account configuration for BlueBubbles, including per-account overrides like mediaLocalRoots. | { "default": { "mediaLocalRoots": ["/Users/me/Pictures"] } } |
Troubleshooting
Typing indicators or read receipts stop working for BlueBubbles conversations.
This usually means webhooks are hitting the wrong path or not reaching the gateway. webhookPath so typing and read events can round-trip correctly.
New DM senders never get approved and the agent does not respond.
dmPolicy is "pairing", so unknown senders must be approved. Use the pairing commands to list pending codes and approve the one you want to allow.
openclaw pairing list bluebubbles
openclaw pairing approve bluebubbles <code>Tapback reactions do not appear or fail when using BlueBubbles.
Reactions require the BlueBubbles private API endpoint POST /api/v1/message/react. Make sure your BlueBubbles server version exposes this private API so OpenClaw can send reaction actions successfully.
Edit or unsend actions fail or behave inconsistently on macOS Tahoe.
Edit and unsend require macOS 13+ and a compatible BlueBubbles server; on macOS 26 (Tahoe) edit is currently broken and group icon updates can be flaky. edit=false in your config.
{
channels: {
bluebubbles: {
actions: {
edit: false,
},
},
},
}You are unsure whether the BlueBubbles channel is healthy or connected.
Use the OpenClaw status commands to inspect channel health and deeper diagnostics. This helps confirm that the gateway sees the BlueBubbles server and that the plugin is active.
openclaw status --all
openclaw status --deepFrequently asked questions
Powered by Mem0
Add persistent memory to OpenClaw
Official Mem0 plugin for OpenClaw keeps context across chats and tools. Smaller prompts, lower cost, better continuity for your agents.