Mainstream messaging
Afkomstig van BlueBubbles
BlueBubbles-ondersteuning is verwijderd. OpenClaw ondersteunt iMessage alleen via de meegeleverde imessage-Plugin, die steipete/imsg via JSON-RPC aanstuurt en toegang biedt tot hetzelfde private API-oppervlak als BlueBubbles (react, edit, unsend, reply, sendWithEffect, native peilingen, groepsbeheer, bijlagen). Eén CLI-binair bestand vervangt de BlueBubbles-server + client-app + webhook-infrastructuur: geen REST-eindpunt, geen webhookauthenticatie.
Deze handleiding migreert oude channels.bluebubbles-configuraties naar channels.imessage. Er is geen ander ondersteund migratiepad. In de huidige OpenClaw is een achtergebleven channels.bluebubbles-blok inert — geen enkele runtime leest het.
Migratiechecklist
Dit is het kortste veilige pad als je jouw oude BlueBubbles-configuratie al kent:
- Verifieer
imsgrechtstreeks op de Mac waarop Messages.app draait (imsg chats,imsg history,imsg send,imsg rpc --help). - Kopieer gedragssleutels van
channels.bluebubblesnaarchannels.imessage:dmPolicy,allowFrom,groupPolicy,groupAllowFrom,groups,includeAttachments,attachmentRoots,mediaMaxMb,textChunkLimitenactions. - Verwijder transportsleutels die niet meer bestaan:
serverUrl,password, webhook-URL's en de BlueBubbles-serverconfiguratie. - Als de Gateway niet op de Messages-Mac draait, stel je
channels.imessage.cliPathin op een SSH-wrapper en stel jeremoteHostin voor het op afstand ophalen van bijlagen. - Schakel
channels.imessagein, start de Gateway opnieuw en voer vervolgensopenclaw channels status --probe --channel imessageuit. - Test één privébericht, één toegestane groep, bijlagen als die zijn ingeschakeld en elke private API-actie die de agent naar verwachting zal gebruiken.
- Verwijder de BlueBubbles-server en de oude
channels.bluebubbles-configuratie nadat het iMessage-pad is geverifieerd.
Wat imsg doet
imsg is een lokale macOS-CLI voor Messages. OpenClaw start imsg rpc als onderliggend proces en communiceert via JSON-RPC over stdin/stdout. Er is geen HTTP-server, webhook-URL, achtergronddemon, launch agent of poort die moet worden opengesteld.
- Leesbewerkingen komen uit
~/Library/Messages/chat.dbvia een alleen-lezen SQLite-handle. - Live binnenkomende berichten komen uit
imsg watch/watch.subscribe, datchat.db-bestandssysteemgebeurtenissen volgt met polling als terugvaloptie. - Voor normale tekst- en bestandsverzending wordt automatisering van Messages.app gebruikt.
- Geavanceerde acties gebruiken
imsg launchom deimsg-helper in Messages.app te injecteren. Dit maakt leesbevestigingen, typindicatoren, uitgebreide verzendingen, bewerken, verzenden ongedaan maken, antwoorden in threads, tapbacks, peilingen en groepsbeheer mogelijk. - Linux-builds kunnen een gekopieerde
chat.dbinspecteren, maar kunnen niet verzenden, de live Mac-database bewaken of Messages.app aansturen. Voor OpenClaw iMessage voer jeimsguit op de aangemelde Mac of via een SSH-wrapper naar die Mac.
Voordat je begint
-
Installeer
imsgop de Mac waarop Messages.app draait:bash brew install steipete/tap/imsgbrew update && brew upgrade imsgimsg --versionimsg chats --limit 3Voor de gebruikelijke lokale configuratie kan de OpenClaw-configuratie na bevestiging door de gebruiker aanbieden om
imsgvia Homebrew te installeren of bij te werken op de aangemelde Messages-Mac. Handmatige configuraties en topologieën met een SSH-wrapper blijven onder beheer van de operator: herhaal de Homebrew-update in dezelfde lokale of externe gebruikerscontext waarinimsgwordt uitgevoerd. Alsimsg chatsmislukt metunable to open database file, lege uitvoer ofauthorization denied, verleen je volledige schijftoegang aan de terminal, editor, het Node-proces, de Gateway-service of het bovenliggende SSH-proces datimsgstart. Open dat bovenliggende proces daarna opnieuw. -
Verifieer de oppervlakken voor lezen, bewaken, verzenden en RPC voordat je de OpenClaw-configuratie wijzigt:
bash imsg chats --limit 10 --json | jq -simsg history --chat-id 42 --limit 10 --attachments --json | jq -simsg watch --chat-id 42 --reactions --jsonimsg send --chat-id 42 --text "OpenClaw imsg test"imsg rpc --helpVervang
42door een echte chat-id uitimsg chats. Voor verzenden is automatiseringsmachtiging voor Messages.app vereist. Als OpenClaw via SSH wordt uitgevoerd, voer je deze opdrachten uit via dezelfde SSH-wrapper of gebruikerscontext die OpenClaw zal gebruiken. Als lezen werkt maar verzenden mislukt met AppleEvents-1743, controleer je of de automatiseringsmachtiging aan/usr/libexec/sshd-keygen-wrapperis verleend; zie Verzenden via een SSH-wrapper mislukt met AppleEvents -1743. -
Schakel de private API-bridge in. Dit wordt sterk aanbevolen voor OpenClaw iMessage, omdat antwoorden, tapbacks, effecten, peilingen, antwoorden op bijlagen en groepsacties ervan afhankelijk zijn:
bash imsg launchimsg status --jsonVoor
imsg launchmoet SIP zijn uitgeschakeld (en op moderne macOS-versies moet bibliotheekvalidatie zijn versoepeld — zie De private API van imsg inschakelen). Basisfuncties voor verzenden, geschiedenis en bewaken werken zonderimsg launch; het volledige iMessage-actieoppervlak van OpenClaw niet. -
Nadat je
channels.imessagehebt ingeschakeld en de Gateway hebt gestart, verifieer je de bridge via OpenClaw:bash openclaw channels status --probeHet iMessage-account moet
worksrapporteren; met--jsonbevat de testpayloadprivateApi.available: true. Als hetfalserapporteert, los je dat eerst op — zie Detectie van mogelijkheden. Voor testen is een bereikbare Gateway nodig (anders valt de CLI terug op uitvoer die alleen op de configuratie is gebaseerd) en alleen geconfigureerde, ingeschakelde accounts worden getest. -
Maak een momentopname van je configuratie:
bash cp ~/.openclaw/openclaw.json ~/.openclaw/openclaw.json.bak
Configuratievertaling
iMessage en BlueBubbles delen de meeste gedragssleutels op kanaalniveau. Wat verandert, is het transport (REST-server tegenover lokale CLI) en de sleutelindeling van het groepsregister.
| BlueBubbles | gebundelde iMessage | Opmerkingen |
|---|---|---|
channels.bluebubbles.enabled |
channels.imessage.enabled |
Dezelfde semantiek (standaard true zodra het blok bestaat). |
channels.bluebubbles.serverUrl |
(verwijderd) | Geen REST-server — de plugin start imsg rpc via stdio. |
channels.bluebubbles.password |
(verwijderd) | Geen Webhook-authenticatie nodig. |
| (impliciet) | channels.imessage.cliPath |
Pad naar imsg (standaard imsg); gebruik een wrapperscript voor SSH. |
| (impliciet) | channels.imessage.dbPath |
Optionele overschrijving van chat.db voor Messages.app; automatisch gedetecteerd wanneer weggelaten. |
| (impliciet) | channels.imessage.remoteHost |
host of user@host — alleen nodig wanneer cliPath een SSH-wrapper is en je bijlagen via SCP wilt ophalen. |
channels.bluebubbles.dmPolicy |
channels.imessage.dmPolicy |
Dezelfde waarden (pairing / allowlist / open / disabled); standaard pairing. |
channels.bluebubbles.allowFrom |
channels.imessage.allowFrom |
Dezelfde indelingen voor handles (+15555550123, user@example.com). Goedkeuringen uit de koppelingsopslag worden niet overgedragen — zie hieronder. |
channels.bluebubbles.groupPolicy |
channels.imessage.groupPolicy |
Dezelfde waarden (allowlist / open / disabled); standaard allowlist. |
channels.bluebubbles.groupAllowFrom |
channels.imessage.groupAllowFrom |
Hetzelfde. Wanneer niet ingesteld, valt iMessage terug op allowFrom; een expliciet lege groupAllowFrom: [] blokkeert alle groepen onder groupPolicy: "allowlist". |
channels.bluebubbles.groups |
channels.imessage.groups |
Kopieer de jokertekenvermelding "*" letterlijk; geef vermeldingen per groep nieuwe sleutels op basis van de numerieke iMessage-chat_id — zie 'Valkuil bij het groepsregister'. requireMention, tools, toolsBySender, systemPrompt worden overgenomen. |
channels.bluebubbles.sendReadReceipts |
channels.imessage.sendReadReceipts |
Standaard true. Met de gebundelde plugin wordt dit alleen geactiveerd wanneer de controle van de privé-API actief is. |
channels.bluebubbles.includeAttachments |
channels.imessage.includeAttachments |
Dezelfde vorm, eveneens standaard uitgeschakeld. Als bijlagen via BlueBubbles binnenkwamen, stel dit dan expliciet in — inkomende foto's/media worden stilzwijgend verwijderd (geen Inbound message-logregel) totdat je dat doet. |
channels.bluebubbles.attachmentRoots |
channels.imessage.attachmentRoots |
Lokale hoofdmappen; dezelfde jokertekenregels. |
| (n.v.t.) | channels.imessage.remoteAttachmentRoots |
Alleen gebruikt wanneer remoteHost is ingesteld voor ophalen via SCP. |
channels.bluebubbles.mediaMaxMb |
channels.imessage.mediaMaxMb |
Standaard 16 MB op iMessage (de standaard van BlueBubbles was 8 MB). Stel dit expliciet in om de lagere limiet te behouden. |
channels.bluebubbles.textChunkLimit |
channels.imessage.textChunkLimit |
Standaard 4000 op beide. |
channels.bluebubbles.coalesceSameSenderDms |
(verwijderd) | Migreer deze sleutel niet. imsg 0.13.1 en nieuwer voegt gesplitste verzendingen van Apple-URL-voorbeelden samen voordat OpenClaw ze ontvangt; openclaw doctor --fix verwijdert een verouderde iMessage-sleutel. |
channels.bluebubbles.enrichGroupParticipantsFromContacts |
(n.v.t.) | imsg toont al de weergavenamen van afzenders uit chat.db. |
channels.bluebubbles.actions.* |
channels.imessage.actions.* |
Dezelfde schakelaars per actie (reactions, edit, unsend, reply, sendWithEffect, renameGroup, setGroupIcon, addParticipant, removeParticipant, leaveGroup, sendAttachment) plus de nieuwe polls. Ze zijn allemaal standaard ingeschakeld; acties via de privé-API vereisen nog steeds de bridge. |
Configuraties met meerdere accounts (channels.bluebubbles.accounts.*) worden één-op-één omgezet naar channels.imessage.accounts.*.
Valkuil bij het groepsregister
De gebundelde iMessage-plugin voert twee groepscontroles direct na elkaar uit. Een groepsbericht moet beide doorstaan om de agent te bereiken:
- Toegestane afzenders/chatdoelen (
channels.imessage.groupAllowFrom) — komt overeen met de afzenderhandle of het chatdoel (vermeldingenchat_id:,chat_guid:,chat_identifier:). WanneergroupAllowFromniet is ingesteld, valt deze controle terug opallowFrom; een explicietegroupAllowFrom: []schakelt die terugval uit en verwijdert elk groepsbericht ondergroupPolicy: "allowlist". - Groepsregister (
channels.imessage.groups) — gebruikt de numerieke iMessage-chat_idals sleutel:- Geen
groups-blok (of een leeg blok): groepen doorstaan deze controle zolang controle 1 een effectieve, niet-lege lijst met toegestane afzenders heeft; afzenderfiltering bepaalt de toegang en er verschijnt bij het opstarten geen waarschuwing dat alles wordt verwijderd. groupsmet vermeldingen maar zonder"*": alleen de vermeldechat_id-sleutels worden doorgelaten. Zodra een groep wordt vermeld, verandert het register in een lijst met toegestane groepen, zelfs ondergroupPolicy: "open".groups: { "*": { ... } }: elke groep doorstaat deze controle.
- Geen
De migratievalkuil: BlueBubbles gebruikte de chat-GUID/chat-ID als sleutel voor groups-vermeldingen, terwijl het iMessage-register de numerieke chat_id als sleutel gebruikt. Letterlijk gekopieerde vermeldingen per groep maken een niet-leeg register waarvan de sleutels nooit overeenkomen, waardoor elk groepsbericht bij controle 2 wordt verwijderd. Kopieer het jokerteken "*" letterlijk; geef specifieke groepsvermeldingen nieuwe sleutels met chat_id-waarden uit imsg chats.
Beide verwijderingspaden zijn op het standaardlogniveau zichtbaar via warn-regels:
- Eenmaal per account bij het opstarten, wanneer
groupPolicy: "allowlist"is ingesteld en de effectieve lijst met toegestane groepsafzenders leeg is:imessage: groupPolicy="allowlist" for account "<id>" but no group sender allowlist is configured .... StelgroupAllowFrom(ofallowFrom) in om afzenders toe te laten; alleengroupstoevoegen voldoet niet aan de afzendercontrole. - Eenmaal per
chat_idtijdens runtime, wanneer het register een groep verwijdert:imessage: dropping group message from chat_id=<id> ... not in channels.imessage.groups allowlist, met de exacte sleutel die moet worden toegevoegd.
Privéberichten blijven in beide gevallen werken — ze volgen een ander codepad, dus succesvolle privéberichten bewijzen niet dat groepsroutering werkt.
De minimale afzendergebonden configuratie met groupPolicy: "allowlist":
{ channels: { imessage: { groupPolicy: "allowlist", groupAllowFrom: ["+15555550123", "chat_guid:any;-;..."], }, },}Hiermee worden de geconfigureerde afzenders in elke groep toegelaten. Voeg groups-vermeldingen toe om toegestane chats te beperken of opties per chat in te stellen, zoals requireMention; kopieer de BlueBubbles-vermelding "*" letterlijk, maar geef specifieke vermeldingen nieuwe sleutels met numerieke iMessage-chat_id-waarden.
Stap voor stap
-
Zet de configuratie om. Houd het nieuwe blok uitgeschakeld tijdens het bewerken; het oude
channels.bluebubbles-blok wordt door de huidige OpenClaw genegeerd en kan ernaast blijven staan als referentie:json5 { channels: { imessage: { enabled: false, // zet op true wanneer je klaar bent om over te schakelen cliPath: "/opt/homebrew/bin/imsg", dmPolicy: "pairing", allowFrom: ["+15555550123"], // kopieer uit bluebubbles.allowFrom groupPolicy: "allowlist", groupAllowFrom: [], // kopieer uit bluebubbles.groupAllowFrom groups: { "*": { requireMention: true } }, // jokerteken wordt letterlijk gekopieerd; geef vermeldingen per chat nieuwe sleutels op basis van chat_id // acties zijn standaard ingeschakeld; stel afzonderlijke schakelaars in op false om ze uit te schakelen }, },} -
Schakel over en voer een controle uit. Stel
channels.imessage.enabled: truein, start de Gateway opnieuw en controleer of het kanaal een gezonde status meldt:bash openclaw gateway restartopenclaw channels status --probe --channel imessage # verwacht "works"; --json toont privateApi.available: trueDe probe vereist een bereikbare Gateway en controleert alleen geconfigureerde, ingeschakelde accounts. Gebruik de directe
imsg-opdrachten in Voordat je begint om de Mac zelf te valideren. -
Controleer DM's. Stuur de agent een direct bericht en bevestig dat het antwoord aankomt.
-
Controleer groepen afzonderlijk. DM's en groepen gebruiken verschillende codepaden — een geslaagde DM bewijst niet dat groepen correct worden gerouteerd. Stuur een bericht in een toegestane groepschat en bevestig dat het antwoord aankomt. Als de groep stil blijft (geen antwoord van de agent, geen fout), controleer dan het Gateway-logboek op de twee
warn-regels uit 'Group registry footgun' hierboven. De opstartwaarschuwing betekent dat de effectieve afzenderstoestaanlijst leeg is; een waarschuwing perchat_idbetekent dat een gevuldegroups-registratie die chat niet bevat. -
Controleer de beschikbare acties. Vraag de agent vanuit een gekoppelde DM om een reactie toe te voegen, een bericht te bewerken, het verzenden ongedaan te maken, te antwoorden, een foto te sturen en (in een groep) de groep te hernoemen of een deelnemer toe te voegen of te verwijderen. Elke actie moet als systeemeigen actie in Messages.app aankomen. Als een actie
iMessage <action> requires the imsg private API bridgeoplevert, voer jeimsg launchopnieuw uit en vernieuw je metopenclaw channels status --probe. -
Verwijder de BlueBubbles-server en het
channels.bluebubbles-blok zodra iMessage-DM's, groepen en acties zijn gecontroleerd. OpenClaw leestchannels.bluebubblesniet.
Actiepariteit in één oogopslag
| Actie | verouderde BlueBubbles | meegeleverde iMessage |
|---|---|---|
| Tekst verzenden / terugvallen op sms | ✅ | ✅ |
| Media verzenden (foto, video, bestand, spraak) | ✅ | ✅ |
Antwoord in thread (reply_to_guid) |
✅ | ✅ (sluit #51892) |
Tapback (react) |
✅ | ✅ |
| Bewerken / verzenden ongedaan maken (ontvangers met macOS 13+) | ✅ | ✅ |
| Verzenden met schermeffect | ✅ | ✅ (sluit een deel van #9394) |
| Tekst vet / cursief / onderstreept / doorgestreept opmaken | ✅ | ✅ (opmaak met getypeerde runs via attributedBody) |
| Systeemeigen peilingen in Messages (maken en stemmen) | ❌ | ✅ (actions.polls; ontvangers hebben iOS/macOS 26+ nodig voor systeemeigen weergave) |
| Groep hernoemen / groepspictogram instellen | ✅ | ✅ |
| Deelnemer toevoegen / verwijderen, groep verlaten | ✅ | ✅ |
| Leesbevestigingen en typindicator | ✅ | ✅ (afhankelijk van de probe van de private API) |
| Samenvoeging van opgesplitste Apple URL-voorvertoningen | ✅ | ✅ (upstream afgehandeld door imsg 0.13.1 en nieuwer; geen OpenClaw-instelling) |
| Herstel van inkomende berichten na een herstart | ✅ | ✅ (automatisch: since_rowid opnieuw afspelen + deduplicatie op GUID; ruimer venster bij lokale installatie) |
iMessage herstelt berichten die zijn gemist terwijl de Gateway niet actief was: bij het opstarten worden ze vanaf de laatst verzonden rowid opnieuw afgespeeld via imsg watch.subscribe since_rowid, op GUID gededupliceerd en onderdrukt een leeftijdsgrens voor verouderde achterstand de 'backlog bomb' van de Push-flush. Dit verloopt via de imsg-RPC-verbinding, waardoor het ook werkt voor externe SSH-configuraties met cliPath; lokale configuraties krijgen een ruimer herstelvenster omdat ze chat.db kunnen lezen. Zie Herstel van inkomende berichten na een herstart van een bridge of Gateway.
Koppeling, sessies en ACP-bindingen
- Toestaanlijsten worden per handle overgenomen.
channels.imessage.allowFromherkent dezelfde+15555550123- /user@example.com-tekenreeksen die BlueBubbles gebruikte — kopieer ze letterlijk. - Goedkeuringen uit de koppelingsopslag worden niet overgedragen. De koppelingsopslag is per kanaal en niets migreert de oude BlueBubbles-opslag. Afzenders die uitsluitend via koppeling waren goedgekeurd, moeten nogmaals onder iMessage koppelen, of je voegt hun handles toe aan
allowFrom. - Sessies blijven beperkt tot één agent en chat. DM's worden met de standaardwaarde
session.dmScope=mainsamengevoegd in de hoofdsessie van de agent; groepssessies blijven afzonderlijk perchat_id(agent:<agentId>:imessage:group:<chat_id>). Oude gespreksgeschiedenis onder BlueBubbles-sessiesleutels wordt niet overgenomen in iMessage-sessies. - ACP-bindingen die naar
match.channel: "bluebubbles"verwijzen, moeten worden gewijzigd in"imessage". Dematch.peer.id-vormen (chat_id:,chat_guid:,chat_identifier:, alleen de handle) zijn identiek.
Geen kanaal om terug te draaien
Er is geen ondersteunde BlueBubbles-runtime om naar terug te schakelen. Als de iMessage-controle mislukt, stel je channels.imessage.enabled: false in, herstart je de Gateway, verhelp je het imsg-blokkerende probleem en probeer je de migratie opnieuw.
De antwoordcache bevindt zich in de SQLite-status van de Plugin. openclaw doctor --fix importeert en archiveert het oude imessage/reply-cache.jsonl-zijbestand wanneer dit aanwezig is.
Gerelateerd
- Verwijdering van BlueBubbles en het imsg-pad voor iMessage — korte aankondiging en samenvatting voor beheerders.
- iMessage — volledige naslag voor het iMessage-kanaal, inclusief configuratie van
imsg launchen detectie van mogelijkheden. /channels/bluebubbles— verouderde URL die doorverwijst naar deze migratiehandleiding.- Koppeling — DM-authenticatie en koppelingsproces.
- Kanaalroutering — hoe de Gateway een kanaal kiest voor uitgaande antwoorden.