openclaw - ✅(Solved) Fix [Bug]: BlueBubbles health check fails on LAN/private serverUrl in 2026.4.2, while actual messaging still works [2 pull requests, 1 participants]

Official PRs (…)
ON THIS PAGE

Recommended Tools

×6

Utilities matched from this issue’s tags and category — try them while you read without losing context.

GitHub issue graph ai analysis

Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.

The report is written in English Markdown for sharing and archival.

Helpful · Quick feedback

Loading…
GitHub stats
openclaw/openclaw#60715Fetched 2026-04-08 02:48:03
View on GitHub
Comments
0
Participants
1
Timeline
2
Reactions
0
Author
Participants
Timeline (top)
labeled ×1referenced ×1

After upgrading OpenClaw to 2026.4.2, openclaw health reports BlueBubbles as failed when channels.bluebubbles.serverUrl points to a private/LAN address (in my case http://172.31.100.1:1234).

The error is:

BlueBubbles: failed (unknown) - Blocked hostname or private/internal/special-use IP address

However, actual BlueBubbles messaging still works: inbound/outbound chat traffic continues normally through the same setup.

This looks like a regression or mismatch between the BlueBubbles health/probe path and the documented/recommended BlueBubbles LAN setup.

Error Message

The error is:

  • Suggests either a regression in the probe path or missing documented/private-network exception handling for BlueBubbles

Root Cause

After upgrading OpenClaw to 2026.4.2, openclaw health reports BlueBubbles as failed when channels.bluebubbles.serverUrl points to a private/LAN address (in my case http://172.31.100.1:1234).

The error is:

BlueBubbles: failed (unknown) - Blocked hostname or private/internal/special-use IP address

However, actual BlueBubbles messaging still works: inbound/outbound chat traffic continues normally through the same setup.

This looks like a regression or mismatch between the BlueBubbles health/probe path and the documented/recommended BlueBubbles LAN setup.

PR fix notes

PR #67510: fix(bluebubbles): restore inbound image attachments and accept updated-message events

Description (problem / solution / changelog)

Summary

Four interconnected fixes for BlueBubbles inbound media that together restore image attachment handling on Node 22+:

  1. Strip bundled-undici dispatcher from non-SSRF fetch pathblueBubblesFetchWithTimeout's non-SSRF fallback was spreading a bundled-undici dispatcher into globalThis.fetch(), which Node 22's built-in undici rejects with TypeError: invalid onRequestStart method. This silently broke ALL inbound attachment downloads. (#64105, #61861, #67241, #62530)

  2. Accept updated-message events carrying attachments — BlueBubbles fires updated-message when attachments are indexed after the initial new-message (which may arrive with attachments: []). The webhook handler was filtering these out as non-reaction events. (#65430)

  3. Event-type-aware dedup key — the persistent GUID dedup now suffixes updated-message keys with :updated so follow-up attachment events aren't rejected as duplicates of the already-committed new-message. (Relates to #52277)

  4. Retry attachment fetch for empty arrays — when the initial webhook arrives with empty attachments (image-only messages or updated-message events), waits 2s and re-fetches from the BB API as a fallback. (Relates to #67437)

Test plan

  • pnpm tsgo — no new type errors
  • pnpm test extensions/bluebubbles/ — 434 tests pass (9 new tests added)
  • Manual: send standalone image via iMessage → agent receives and processes it
  • Manual: send text + image together → agent receives both
  • pnpm build — verify no [INEFFECTIVE_DYNAMIC_IMPORT] warnings

Issues closed

Closes #64105, closes #61861, closes #65430, closes #67241, closes #62530.

Related issues (not fixed by this PR)

  • #34749 — image attachments blocked by SSRF guard (localhost URL) — partially addressed by the dispatcher fix, but the broader SSRF allowlist for localhost BB servers is a separate concern
  • #57181 — SSRF guard blocks BB plugin internal API calls to private IP — same broader SSRF allowlist issue
  • #59722 — SSRF allowlist doesn't cover reactions — separate SSRF scope gap
  • #60715 — BB health check fails on LAN/private serverUrl — separate SSRF/health-check issue

Superseded PRs

  • #66120 — accept updated-message events carrying attachments (fully subsumed by fix #2)
  • #67437 — retry attachment fetch when webhook arrives with empty array (fully subsumed by fix #4)
  • #66108 — route fetchImpl through bundled undici fetch on Node 24+ (different approach to same dispatcher issue, subsumed by fix #1)

Related PRs

  • #52277 — dedupe webhook replays without dropping edits (assigned to @omarshahine, complementary finer-grained edit dedup)

🤖 Generated with Claude Code

Changed files

  • CHANGELOG.md (modified, +1/-0)
  • extensions/bluebubbles/src/attachments.test.ts (modified, +88/-1)
  • extensions/bluebubbles/src/attachments.ts (modified, +52/-2)
  • extensions/bluebubbles/src/inbound-dedupe.test.ts (modified, +36/-0)
  • extensions/bluebubbles/src/inbound-dedupe.ts (modified, +15/-3)
  • extensions/bluebubbles/src/monitor-normalize.ts (modified, +5/-1)
  • extensions/bluebubbles/src/monitor-processing.ts (modified, +50/-6)
  • extensions/bluebubbles/src/monitor.ts (modified, +13/-3)
  • extensions/bluebubbles/src/types.ts (modified, +9/-1)
  • scripts/check-no-raw-channel-fetch.mjs (modified, +1/-1)

PR #68234: bluebubbles: consolidate HTTP traffic through typed BlueBubblesClient

Description (problem / solution / changelog)

Draft — not yet ready for merge. Opening for early review feedback; will also smoke-test on Lobster before marking ready.

Summary

All outbound BlueBubbles HTTP calls now route through a single typed BlueBubblesClient that resolves SSRF policy and auth material once at construction. Previously each of the 17 callsites computed its own SsrFPolicy and threaded it through blueBubblesFetchWithTimeout — the per-callsite divergence is what caused #34749 (image attachments blocked on localhost) and #59722 (reactions blocked on private IPs).

What closes

  • Closes #34749 — image attachments blocked by SSRF guard (localhost). downloadAttachment now threads this.ssrfPolicy to BOTH fetchRemoteMedia AND the fetchImpl callback, where the legacy helper silently omitted the policy on the callback path.
  • Closes #59722 — reactions not covered by allowlist. reactions.ts now uses the same policy as every other call; the asymmetric {} fallback that blocked private-IP BB deployments is gone.

How

New extensions/bluebubbles/src/client.ts:

  • BlueBubblesClient class with typed operations (request, requestJson, requestMultipart, ping, getServerInfo, react, getMessageAttachments, downloadAttachment).
  • createBlueBubblesClient({cfg, accountId, serverUrl, password, ...}) for full-config callers.
  • createBlueBubblesClientFromParts({baseUrl, password, allowPrivateNetwork, ...}) for low-level helpers that already have the resolved tuple.
  • Three-mode SSRF policy resolved once at construction (previously inlined in attachments.ts only):
    1. { allowPrivateNetwork: true } — user opted in
    2. { allowedHostnames: [trustedHost] } — narrow allowlist
    3. undefined — non-SSRF fallback path
  • Pluggable BlueBubblesAuthStrategy with blueBubblesQueryStringAuth (default, preserves current ?password=) and blueBubblesHeaderAuth so the #66869 header-auth cutover becomes a one-line default flip.

Migrated: attachments.ts, reactions.ts, probe.ts, chat.ts, send.ts, history.ts, catchup.ts, monitor-processing.ts all now route through the client. Public function signatures preserved for compatibility.

Test fixtures: monitor.test.ts and monitor.webhook-auth.test.ts install the shared SSRF-guard passthrough (createBlueBubblesFetchGuardPassthroughInstaller) — required because the consolidation moves callers from the unguarded fallback onto the mode-2 allowlist for self-hosted BB servers.

Size

+171 / -310 LOC across BB files (139-line net reduction). 28 new tests in client.test.ts, full BB suite stays at 462/462.

Verification

  • pnpm test extensions/bluebubbles — 22 files / 462 tests pass
  • pnpm lint extensions/bluebubbles/src/ — 0 warnings / 0 errors (82 files)
  • pnpm tsgo — pre-existing unrelated errors on origin/main (codex/discord/qa-lab/src/commands); none in bluebubbles
  • pnpm build — pre-existing amazon-bedrock-mantle runtime-deps staging error on clean main; unrelated
  • Smoke test on Lobster before marking ready for review

Deferred to follow-ups (intentionally NOT in this PR)

  • #66869 header auth cutoverAuthStrategy interface is in place; flipping the default requires BB Server coordination.
  • #67752 SSRF tightening — centralized policy resolution makes this a single-point-of-change follow-up.
  • Delete blueBubblesFetchWithTimeout / buildBlueBubblesApiUrl from types.ts — they're now private-to-client infrastructure; safe to remove once this lands.

Blocks #57181, #60715 (both become instance-level tests against BlueBubblesClient once this lands).

🤖 Generated with Claude Code

Changed files

  • extensions/bluebubbles/src/attachments.test.ts (modified, +5/-1)
  • extensions/bluebubbles/src/attachments.ts (modified, +32/-117)
  • extensions/bluebubbles/src/catchup.ts (modified, +17/-22)
  • extensions/bluebubbles/src/chat.ts (modified, +19/-49)
  • extensions/bluebubbles/src/client.test.ts (added, +613/-0)
  • extensions/bluebubbles/src/client.ts (added, +570/-0)
  • extensions/bluebubbles/src/history.ts (modified, +12/-9)
  • extensions/bluebubbles/src/monitor-processing.ts (modified, +13/-20)
  • extensions/bluebubbles/src/monitor.test.ts (modified, +11/-0)
  • extensions/bluebubbles/src/monitor.webhook-auth.test.ts (modified, +7/-0)
  • extensions/bluebubbles/src/multipart.ts (modified, +17/-3)
  • extensions/bluebubbles/src/probe.ts (modified, +15/-17)
  • extensions/bluebubbles/src/reactions.ts (modified, +9/-26)
  • extensions/bluebubbles/src/send.ts (modified, +33/-50)

Code Example

Relevant openclaw health output:
`text
BlueBubbles: failed (unknown) - Blocked hostname or private/internal/special-use IP address
Agents: main (default)
Heartbeat interval: 30m (main)
Session store (main): /Users/aiassistant/.openclaw/agents/main/sessions/sessions.json (2 entries)
- agent:main:bluebubbles:direct:[email protected] (12m ago)
- agent:main:main (...)
`

Relevant log line:
`text
blocked URL fetch (bluebubbles-api) target=http://172.31.100.1:1234/api/v1/ping reason=Blocked hostname or private/internal/special-use IP address
`

Official docs appear to recommend LAN/private BlueBubbles server URLs, e.g.:
`json
serverUrl: "http://192.168.1.100:1234"
RAW_BUFFERClick to expand / collapse

Bug type

Regression (worked before, now fails)

Beta release blocker

No

Summary

After upgrading OpenClaw to 2026.4.2, openclaw health reports BlueBubbles as failed when channels.bluebubbles.serverUrl points to a private/LAN address (in my case http://172.31.100.1:1234).

The error is:

BlueBubbles: failed (unknown) - Blocked hostname or private/internal/special-use IP address

However, actual BlueBubbles messaging still works: inbound/outbound chat traffic continues normally through the same setup.

This looks like a regression or mismatch between the BlueBubbles health/probe path and the documented/recommended BlueBubbles LAN setup.

Steps to reproduce

  1. Configure BlueBubbles with a private/LAN server URL, for example: ``json { "channels": { "bluebubbles": { "enabled": true, "serverUrl": "http://172.31.100.1:1234", "password": "<redacted>", "webhookPath": "/bluebubbles-webhook" } } } `
  2. Upgrade OpenClaw to 2026.4.2
  3. Run: bash openclaw health
  4. Observe that BlueBubbles health fails with: text BlueBubbles: failed (unknown) - Blocked hostname or private/internal/special-use IP address

Expected behavior

One of the following:

  • BlueBubbles health checks should allow the configured private/LAN serverUrl, since the official BlueBubbles docs show LAN examples such as http://192.168.1.100:1234; or
  • BlueBubbles should expose a documented allowPrivateNetwork-style configuration similar to Matrix if this is now intentionally restricted.

At minimum, openclaw health should not report the channel as failed if the actual BlueBubbles messaging path still works.

Actual behavior

openclaw health reports: text BlueBubbles: failed (unknown) - Blocked hostname or private/internal/special-use IP address

But actual BlueBubbles chat delivery still works in the same deployment.

OpenClaw version

2026.4.2 (d74a122)

Operating system

macOS 15.4.1 (24E263)

Install method

npm global install / update flow (openclaw update)

Model

Not relevant to reproduction

Provider / routing chain

BlueBubbles channel on local/LAN network

Additional provider/model setup details

Current BlueBubbles config uses:

Relevant behavior:

  • openclaw health fails for BlueBubbles
  • actual BlueBubbles chatting still works in practice

Logs, screenshots, and evidence

Relevant openclaw health output:
`text
BlueBubbles: failed (unknown) - Blocked hostname or private/internal/special-use IP address
Agents: main (default)
Heartbeat interval: 30m (main)
Session store (main): /Users/aiassistant/.openclaw/agents/main/sessions/sessions.json (2 entries)
- agent:main:bluebubbles:direct:[email protected] (12m ago)
- agent:main:main (...)
`

Relevant log line:
`text
blocked URL fetch (bluebubbles-api) target=http://172.31.100.1:1234/api/v1/ping reason=Blocked hostname or private/internal/special-use IP address
`

Official docs appear to recommend LAN/private BlueBubbles server URLs, e.g.:
`json
serverUrl: "http://192.168.1.100:1234"

Impact and severity

  • BlueBubbles health/status is misleading after upgrade
  • Makes openclaw health` look broken even when BlueBubbles messaging is still functional
  • Suggests either a regression in the probe path or missing documented/private-network exception handling for BlueBubbles

Additional information

I can still actively chat with my assistant over BlueBubbles after the upgrade, so this does not appear to be a complete channel failure. It seems limited to the health/probe path (GET /api/v1/ping) being blocked for private/internal IPs.

extent analysis

TL;DR

The issue can be resolved by configuring OpenClaw to allow private network URLs for BlueBubbles or by using a public URL for the BlueBubbles server.

Guidance

  • Verify that the BlueBubbles server is configured correctly and accessible via the private LAN URL.
  • Check the OpenClaw documentation for any configuration options that may allow private network URLs for BlueBubbles, such as an allowPrivateNetwork setting.
  • Consider using a public URL for the BlueBubbles server if possible, to avoid any potential issues with private network URLs.
  • Review the OpenClaw logs to ensure that there are no other errors or issues that may be contributing to the problem.

Example

No code example is provided as the issue appears to be related to configuration rather than code.

Notes

The issue may be related to a regression in the OpenClaw health check or a missing configuration option for allowing private network URLs for BlueBubbles. Further investigation is needed to determine the root cause of the issue.

Recommendation

Apply a workaround by configuring OpenClaw to use a public URL for the BlueBubbles server, if possible, to avoid any potential issues with private network URLs. This will allow the OpenClaw health check to pass and provide a more accurate status for the BlueBubbles channel.

Vote matrix · Quick signals

Works
Did the solution work? Tap to confirm.
Easy Fix
Was it a quick fix?
Time Saver
Did it save you time?
Blocking
Was it severely blocking?
Common Issue
Are others likely hitting this too?
Flaky / Intermittent
Is it intermittent?
Verified / Reproducible
Can you reproduce it reliably?
Loading…

FAQ

Expected behavior

One of the following:

  • BlueBubbles health checks should allow the configured private/LAN serverUrl, since the official BlueBubbles docs show LAN examples such as http://192.168.1.100:1234; or
  • BlueBubbles should expose a documented allowPrivateNetwork-style configuration similar to Matrix if this is now intentionally restricted.

At minimum, openclaw health should not report the channel as failed if the actual BlueBubbles messaging path still works.

Still need to ship something?

×6

Another batch ranked right after the header list — different links, same matching logic.

Back to top recommendations

TRENDING