
























@@ -1,47 +1,74 @@
11---
2-summary: "Switch from the BlueBubbles plugin to the bundled iMessage plugin without losing pairing, allowlists, or group bindings."
2+summary: "Migrate old BlueBubbles configs to the bundled iMessage plugin without losing pairing, allowlists, or group bindings."
33read_when:
44 - Planning a move from BlueBubbles to the bundled iMessage plugin
55 - Translating BlueBubbles config keys to iMessage equivalents
6- - Rolling back a partial iMessage cutover
6+ - Verifying imsg before enabling the iMessage plugin
77title: "Coming from BlueBubbles"
88---
991010The bundled `imessage` plugin now reaches the same private API surface as BlueBubbles (`react`, `edit`, `unsend`, `reply`, `sendWithEffect`, group management, attachments) by driving [`steipete/imsg`](https://github.com/steipete/imsg) over JSON-RPC. If you already run a Mac with `imsg` installed, you can drop the BlueBubbles server and let the plugin talk to Messages.app directly.
111112-This guide is opt-in. BlueBubbles still works and remains the right choice if you cannot run `imsg` on the host where the Mac signs into iMessage (for example, if the Mac is unreachable from the gateway).
12+BlueBubbles support was removed. OpenClaw supports iMessage through `imsg` only. This guide is for migrating old `channels.bluebubbles` configs to `channels.imessage`; there is no other supported migration path.
13131414## When this migration makes sense
15151616- You already run `imsg` on the same Mac (or one reachable over SSH) where Messages.app is signed in.
1717- You want one fewer moving part — no separate BlueBubbles server, no REST endpoint to authenticate, no webhook plumbing. Single CLI binary instead of a server + client app + helper.
1818- You are on a [supported macOS / `imsg` build](/channels/imessage#requirements-and-permissions-macos) where the private API probe reports `available: true`.
191920-## When to stay on BlueBubbles
20+## What imsg does
212122-- The Mac with Messages.app is on a network the gateway cannot reach via SSH.
23-- You depend on BlueBubbles features the bundled plugin does not yet cover (rich text formatting attributes beyond bold/italic/underline/strikethrough, BlueBubbles-specific webhook integrations).
24-- Your current setup hard-codes BlueBubbles webhook URLs into other systems that you cannot rewire.
22+`imsg` is a local macOS CLI for Messages. OpenClaw starts `imsg rpc` as a child process and talks JSON-RPC over stdin/stdout. There is no HTTP server, webhook URL, background daemon, launch agent, or port to expose.
23+24+- Reads come from `~/Library/Messages/chat.db` using a read-only SQLite handle.
25+- Live inbound messages come from `imsg watch` / `watch.subscribe`, which follows `chat.db` filesystem events with a polling fallback.
26+- Sends use Messages.app automation for normal text and file sends.
27+- Advanced actions use `imsg launch` to inject the `imsg` helper into Messages.app. That is what unlocks read receipts, typing indicators, rich sends, edit, unsend, threaded reply, tapbacks, and group management.
28+- Linux builds can inspect a copied `chat.db`, but cannot send, watch the live Mac database, or drive Messages.app. For OpenClaw iMessage, run `imsg` on the signed-in Mac or through an SSH wrapper to that Mac.
25292630## Before you start
273128321. Install `imsg` on the Mac that runs Messages.app:
29333034```bash
3135 brew install steipete/tap/imsg
32- imsg launch
36+ imsg --version
37+ imsg chats --limit 3
38+```
39+40+ If `imsg chats` fails with `unable to open database file`, empty output, or `authorization denied`, grant Full Disk Access to the terminal, editor, Node process, Gateway service, or SSH parent process that launches `imsg`, then reopen that parent process.
41+42+2. Verify the read, watch, send, and RPC surfaces before changing OpenClaw config:
43+44+```bash
45+ imsg chats --limit 10 --json | jq -s
46+ imsg history --chat-id 42 --limit 10 --attachments --json | jq -s
47+ imsg watch --chat-id 42 --reactions --json
48+ imsg send --chat-id 42 --text "OpenClaw imsg test"
3349 imsg rpc --help
3450```
355136-2. Verify the private API bridge:
52+ Replace `42` with a real chat id from `imsg chats`. Sending requires Automation permission for Messages.app. If OpenClaw will run through SSH, run these commands through the same SSH wrapper or user context that OpenClaw will use.
53+54+3. Enable the private API bridge when you need advanced actions:
55+56+```bash
57+ imsg launch
58+ imsg status --json
59+```
60+61+`imsg launch` requires SIP to be disabled. Basic send, history, and watch work without `imsg launch`; advanced actions do not.
62+63+4. Verify the bridge through OpenClaw:
37643865```bash
3966 openclaw channels status --probe
4067```
41684269 You want `imessage.privateApi.available: true`. If it reports `false`, fix that first — see [Capability detection](/channels/imessage#private-api-actions).
437044-3. Snapshot your config so you can roll back:
71+5. Snapshot your config:
45724673```bash
4774 cp ~/.openclaw/openclaw.json5 ~/.openclaw/openclaw.json5.bak
@@ -116,7 +143,7 @@ If the gateway logs `imessage: dropping group message from chat_id=<id>` or the
116143117144## Step-by-step
118145119-1. Add an iMessage block alongside the existing BlueBubbles block. Do not delete BlueBubbles yet:
146+1. Add an iMessage block alongside the existing BlueBubbles block. Keep the old block only as a copy source until the new path is verified:
120147121148```json5
122149 {
@@ -146,7 +173,7 @@ If the gateway logs `imessage: dropping group message from chat_id=<id>` or the
146173 }
147174```
148175149-2. **Dry-run probe** — start the gateway and confirm both channels report healthy:
176+2. **Dry-run probe** — start the gateway and confirm iMessage reports healthy:
150177151178```bash
152179 openclaw gateway
@@ -156,12 +183,11 @@ If the gateway logs `imessage: dropping group message from chat_id=<id>` or the
156183157184 Because `imessage.enabled` is still `false`, no inbound iMessage traffic is routed yet — but `--probe` exercises the bridge so you catch permission/install issues before the cutover.
158185159-3. **Cut over.** Disable BlueBubbles and enable iMessage in one config edit:
186+3. **Cut over.** Remove the BlueBubbles config and enable iMessage in one config edit:
160187161188```json5
162189 {
163190 channels: {
164- bluebubbles: { enabled: false }, // keep the rest of the block for rollback
165191 imessage: { enabled: true /* ... */ },
166192 },
167193 }
@@ -175,11 +201,11 @@ If the gateway logs `imessage: dropping group message from chat_id=<id>` or the
1752011762026. **Verify the action surface** — from a paired DM, ask the agent to react, edit, unsend, reply, send a photo, and (in a group) rename the group / add or remove a participant. Each action should land natively in Messages.app. If any throws "iMessage `<action>` requires the imsg private API bridge", run `imsg launch` again and refresh `channels status --probe`.
177203178-7. **Stop the BlueBubbles server** once you have run on iMessage for at least a few hours of normal traffic. Remove the BlueBubbles block from config and restart the gateway.
204+7. **Remove the BlueBubbles server and config** once iMessage DMs, groups, and actions are verified. OpenClaw will not use `channels.bluebubbles`.
179205180206## Action parity at a glance
181207182-| Action | BlueBubbles | bundled iMessage |
208+| Action | legacy BlueBubbles | bundled iMessage |
183209| ---------------------------------------------------------- | ----------------------------------- | ------------------------------------------------------------------------------------ |
184210| Send text / SMS fallback | ✅ | ✅ |
185211| Send media (photo, video, file, voice) | ✅ | ✅ |
@@ -194,33 +220,23 @@ If the gateway logs `imessage: dropping group message from chat_id=<id>` or the
194220| Same-sender DM coalescing | ✅ | ✅ (DM-only; opt-in via `channels.imessage.coalesceSameSenderDms`) |
195221| Catchup of inbound messages received while gateway is down | ✅ (webhook replay + history fetch) | _(not yet — tracked at [#78649](https://github.com/openclaw/openclaw/issues/78649))_ |
196222197-The catchup gap is the most operationally significant one for production deployments: planned restarts, mac sleep, or an unexpected gateway crash that takes more than a few seconds will silently drop any inbound iMessage traffic that arrives during the gap when running on bundled iMessage. BlueBubbles' webhook + history-fetch flow recovers those messages on reconnect. If your deployment is sensitive to that, stay on BlueBubbles until [#78649](https://github.com/openclaw/openclaw/issues/78649) lands.
223+The catchup gap is the most operationally significant one for production deployments: planned restarts, mac sleep, or an unexpected gateway crash that takes more than a few seconds will silently drop any inbound iMessage traffic that arrives during the gap when running on bundled iMessage. BlueBubbles' webhook + history-fetch flow recovered those messages on reconnect, but BlueBubbles is no longer supported. There is no supported migration path that preserves catchup today; wait for [#78649](https://github.com/openclaw/openclaw/issues/78649).
198224199225## Pairing, sessions, and ACP bindings
200226201227- **Pairing approvals** carry over by handle. You do not need to re-approve known senders — `channels.imessage.allowFrom` recognizes the same `+15555550123` / `user@example.com` strings BlueBubbles used.
202228- **Sessions** stay scoped per agent + chat. DMs collapse into the agent main session under default `session.dmScope=main`; group sessions stay isolated per `chat_id`. The session keys differ (`agent:<id>:imessage:group:<chat_id>` vs the BlueBubbles equivalent) — old conversation history under BlueBubbles session keys does not carry into iMessage sessions.
203229- **ACP bindings** referencing `match.channel: "bluebubbles"` need to be updated to `"imessage"`. The `match.peer.id` shapes (`chat_id:`, `chat_guid:`, `chat_identifier:`, bare handle) are identical.
204230205-## Running both at once
206-207-You can keep both `bluebubbles` and `imessage` enabled during cutover testing. BlueBubbles' manifest still declares `preferOver: ["imessage"]`, so the auto-enable resolver continues to prefer BlueBubbles when both channels are configured — the bundled iMessage plugin will not pick up traffic until BlueBubbles is disabled (`channels.bluebubbles.enabled: false`) or removed from config.
208-209-If you want both channels to run simultaneously instead of in cutover mode, that is not currently supported through plugin auto-enable; use one channel at a time.
210-211-## Rollback
212-213-Because you kept the BlueBubbles config block:
231+## No rollback channel
214232215-1. Set `channels.bluebubbles.enabled: true` and `channels.imessage.enabled: false`.
216-2. Restart the gateway.
217-3. Inbound traffic returns to BlueBubbles. Reply caches and ACP bindings on the iMessage side stay on disk under `~/.openclaw/state/imessage/` and resume cleanly if you re-enable later.
233+There is no supported BlueBubbles runtime to switch back to. If iMessage verification fails, set `channels.imessage.enabled: false`, restart the Gateway, fix the `imsg` blocker, and retry the cutover.
218234219235The reply cache lives at `~/.openclaw/state/imessage/reply-cache.jsonl` (mode `0600`, parent dir `0700`). It is safe to delete if you want a clean slate.
220236221237## Related
222238223239- [iMessage](/channels/imessage) — full iMessage channel reference, including `imsg launch` setup and capability detection.
224-- [BlueBubbles](/channels/bluebubbles) — full BlueBubbles channel reference for the legacy path.
240+- `/channels/bluebubbles` — legacy URL that redirects to this migration guide.
225241- [Pairing](/channels/pairing) — DM authentication and pairing flow.
226242- [Channel Routing](/channels/channel-routing) — how the gateway picks a channel for outbound replies.
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。