-
-
Notifications
You must be signed in to change notification settings - Fork 69.6k
BlueBubbles webhook route returns 404 on gateway port (v2026.3.13) #48624
Description
Bug Report
Version: OpenClaw 2026.3.13 (61d171a)
OS: macOS Tahoe 26.2 (Mac Mini M4)
Channel: BlueBubbles
Node: v25.5.0
Description
The BlueBubbles webhook handler logs BlueBubbles webhook listening on /bluebubbles-webhook during gateway startup, but HTTP POST requests to http://127.0.0.1:18789/bluebubbles-webhook return 404 Not Found.
The gateway's main listener binds as ws://127.0.0.1:18789 (WebSocket). It appears the plugin HTTP route registered by the BlueBubbles provider is never actually mounted on the HTTP server — incoming POST requests hit what looks like a static file/Control UI catch-all instead of the plugin route handler.
Steps to Reproduce
- Configure BlueBubbles channel with
webhookPath: "/bluebubbles-webhook" - Start gateway — logs confirm:
BlueBubbles webhook listening on /bluebubbles-webhook - Register a BlueBubbles webhook pointing to
http://127.0.0.1:18789/bluebubbles-webhook?password=<password> - Send an iMessage — BlueBubbles dispatches webhook to the URL
- Gateway returns 404 Not Found (HTML response:
Not Found)
Diagnostic Details
/hooks/bluebubbles-webhookreturns 401 (auth-gated hooks endpoint, different system)- Port 18789 is the main WS gateway listener
- Port 18791 is the browser control server (also no webhook route)
- Port 18792 returns 200 at root but 404 at webhook path
registerPluginHttpRoute()is called in the source but the route never appears on any HTTP listeneropenclaw agent --channel bluebubbles --to ... --deliverworks fine for outbound messages
Expected Behavior
POST to http://127.0.0.1:18789/bluebubbles-webhook?password=<password> should be handled by the BlueBubbles webhook handler and process incoming messages.
Workaround
Running a local Node.js proxy on port 18793 that receives BlueBubbles webhooks and injects messages via openclaw agent --channel bluebubbles --to <sender> --message <text> --deliver. This works but loses typing indicators and is fragile.
Config
{
"channels": {
"bluebubbles": {
"enabled": true,
"serverUrl": "http://127.0.0.1:1234",
"password": "***",
"webhookPath": "/bluebubbles-webhook",
"dmPolicy": "allowlist",
"allowFrom": ["+14452953152"]
}
}
}