Skip to content

BlueBubbles webhook route returns 404 on gateway port (v2026.3.13) #48624

@KingIVthe1st

Description

@KingIVthe1st

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

  1. Configure BlueBubbles channel with webhookPath: "/bluebubbles-webhook"
  2. Start gateway — logs confirm: BlueBubbles webhook listening on /bluebubbles-webhook
  3. Register a BlueBubbles webhook pointing to http://127.0.0.1:18789/bluebubbles-webhook?password=<password>
  4. Send an iMessage — BlueBubbles dispatches webhook to the URL
  5. Gateway returns 404 Not Found (HTML response: Not Found)

Diagnostic Details

  • /hooks/bluebubbles-webhook returns 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 listener
  • openclaw agent --channel bluebubbles --to ... --deliver works 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"]
    }
  }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions