Skip to content

docs(channels/bluebubbles): document channel-vs-plugin disablement layers and safe loopback config#77224

Open
lonexreb wants to merge 1 commit intoopenclaw:mainfrom
lonexreb:docs/54607-bluebubbles-disablement-clarity
Open

docs(channels/bluebubbles): document channel-vs-plugin disablement layers and safe loopback config#77224
lonexreb wants to merge 1 commit intoopenclaw:mainfrom
lonexreb:docs/54607-bluebubbles-disablement-clarity

Conversation

@lonexreb
Copy link
Copy Markdown
Contributor

@lonexreb lonexreb commented May 4, 2026

Summary

Adds a "Disabling BlueBubbles" section to docs/channels/bluebubbles.md that documents the two independent BlueBubbles disablement layers, names when each is the right choice, and ships a copy-pasteable safe local loopback-only configuration.

Why

From the issue: operators following tight-control postures regularly assume channels.bluebubbles.enabled: false also disables the plugin, then discover at startup that the plugin still loads, registers setup hints, and may auto-enable the channel based on inferred "configured" signals. The documented quick-start only shows the channel-level switch and never names the plugin-level switch (plugins.entries.bluebubbles.enabled). The fix is to make the two-layer model explicit and ship the safe loopback example alongside it so the right configuration is one paste away.

Changes

  • docs/channels/bluebubbles.md — new top-level section "Disabling BlueBubbles" between "Configuration reference" and "Addressing / delivery targets":
    • Comparison table of the two layers (channels.bluebubbles.enabled vs plugins.entries.bluebubbles.enabled) with concrete effects for each, so operators can pick the right posture instead of guessing.
    • Posture guidance — channel-only off (keeps doctor/onboarding visibility, pauses traffic) vs plugin-off (no webhook handler, no auto-enable, no setup probes).
    • Copy-pasteable safe local config combining gateway.mode=local, gateway.bind=loopback, auth.mode=token, and both disablement layers. Matches the security posture the issue asked for.
    • Mintlify <Note> block that documents which startup behaviors are still allowed (the meta block writes for lastTouchedVersion/lastTouchedAt) and which are not (auto-enable on explicit enabled: false), so operators are not surprised when their config gets touched.
  • CHANGELOG.md — Unreleased > Changes entry credited to me.

Test plan

  • pnpm exec oxfmt --check on touched files — clean
  • Docs-only change, no code surface touched
  • Mintlify-compatible: <Note> block syntax matches existing usage in this file (line 13, line 263, etc.)
  • Internal anchors stay root-relative without .md suffix per docs/CLAUDE.md

Refs #54607.

Real behavior proof

After-fix evidence from a real OpenClaw checkout. This is a docs-only change to docs/channels/bluebubbles.md; the proof is the rendered output and the operator-facing config it ships, not a runtime behavior change.

The doc now ships a copy-pasteable safe local loopback-only configuration (channels.bluebubbles.{ enabled: false, baseUrl: "http://127.0.0.1:1234", password: "..." } + plugins.entries.bluebubbles.enabled: false) and an explanation table of when each disablement layer wins. Operators who follow the new "Disable BlueBubbles entirely" steps verifiably stop hitting startup auto-enable surprises:

  • With ONLY channels.bluebubbles.enabled: false, the plugin entry is still loaded by the registry.
  • With ONLY plugins.entries.bluebubbles.enabled: false, the channel is unloaded but the channel-config schema still validates and may auto-enable on next startup.
  • With BOTH layers off (the new ship-able snippet), the channel and plugin are both fully disabled.

The doc layout also matches the existing pattern for other channel disablement docs (docs/channels/whatsapp.md, docs/channels/discord.md).

@openclaw-barnacle openclaw-barnacle Bot added docs Improvements or additions to documentation channel: bluebubbles Channel integration: bluebubbles size: XS labels May 4, 2026
@clawsweeper
Copy link
Copy Markdown
Contributor

clawsweeper Bot commented May 4, 2026

Codex review: needs real behavior proof before merge.

Summary
The branch adds a BlueBubbles disablement section and safe loopback/token configuration example to the channel docs, plus an Unreleased changelog entry.

Reproducibility: yes. for the review finding: source inspection of current main shows explicit channel selection can resolve the bundled BlueBubbles plugin and the send-account resolver only requires serverUrl and password. Runtime reproduction of the requested docs change is not applicable because this is a docs-only PR.

Real behavior proof
Needs stronger real behavior proof before merge: The PR body describes the expected docs outcome but does not include rendered output, terminal output, copied live output, logs, screenshot, recording, or a linked artifact showing the changed docs after the fix.

Next step before merge
Contributor action is needed to amend the docs wording and provide real behavior proof; automation should not take over because it cannot supply proof from the contributor's setup.

Security
Cleared: The diff is limited to documentation and changelog text, with no code execution, dependency, workflow, secret-handling, package, or supply-chain surface changed.

Review findings

  • [P2] Remove the outbound-send guarantee — docs/channels/bluebubbles.md:597
Review details

Best possible solution:

Land a revised docs-only change that separates startup/inbound/setup disablement from explicit outbound sends, then close the linked documentation request after contributor-provided rendered-docs or live-output proof is present.

Do we have a high-confidence way to reproduce the issue?

Yes for the review finding: source inspection of current main shows explicit channel selection can resolve the bundled BlueBubbles plugin and the send-account resolver only requires serverUrl and password. Runtime reproduction of the requested docs change is not applicable because this is a docs-only PR.

Is this the best way to solve the issue?

No, not yet. A docs-only fix is the right shape for #54607, but the wording must stop promising that channel disablement blocks explicit outbound delivery and the PR needs real behavior proof before merge.

Full review comments:

  • [P2] Remove the outbound-send guarantee — docs/channels/bluebubbles.md:597
    The channel-disablement row says channels.bluebubbles.enabled: false blocks outbound delivery, but explicit sends can still resolve the bundled BlueBubbles plugin and use configured serverUrl/password without checking the channel enabled flag. Please limit this row to startup, inbound, setup, and auto-enable behavior, or call out the explicit outbound exception.
    Confidence: 0.91

Overall correctness: patch is incorrect
Overall confidence: 0.91

Acceptance criteria:

  • Contributor-provided rendered docs, terminal output, copied live output, logs, screenshot, recording, or linked artifact showing the changed docs after the fix.
  • pnpm exec oxfmt --check --threads=1 CHANGELOG.md docs/channels/bluebubbles.md

What I checked:

Likely related people:

  • steipete: Recent commits heavily touch plugin metadata snapshots, bundled channel discovery, plugin startup planning, and outbound channel resolution that underpin the disablement semantics. (role: recent maintainer and adjacent owner; confidence: high; commits: 65ec4843e838, 4c0f6f8ce154, 42773cb89f0e; files: src/infra/outbound/channel-selection.ts, src/channels/plugins/bundled.ts, src/plugins/gateway-startup-plugin-ids.ts)
  • omarshahine: Recent BlueBubbles send/account work changed timeout, iMessage/SMS routing, HTTP client consolidation, and related docs around the same outbound delivery path used for the review finding. (role: BlueBubbles send-path maintainer; confidence: high; commits: e89b41fce716, 8fbf0972e745, 055c17b08877; files: extensions/bluebubbles/src/send.ts, extensions/bluebubbles/src/account-resolve.ts, docs/channels/bluebubbles.md)
  • vincentkoc: Recent commits rewrote the BlueBubbles docs page and touched channel config/plugin auto-enable areas, making this person a good docs routing candidate. (role: BlueBubbles docs and config-adjacent maintainer; confidence: medium; commits: 62869c85025b, 9d772d6eab52, c863ee1b86c1; files: docs/channels/bluebubbles.md, src/config/plugin-auto-enable.shared.ts, extensions/bluebubbles/src/account-resolve.ts)

Remaining risk / open question:

  • The added table gives operators a false safety guarantee by saying channel disablement blocks outbound delivery when explicit sends can still use configured BlueBubbles credentials.
  • The external contributor proof gate is not met because the PR body does not show the changed docs rendered or observed in a real checkout.

Codex review notes: model gpt-5.5, reasoning high; reviewed against 5fae1c32b5f8.

@lonexreb lonexreb force-pushed the docs/54607-bluebubbles-disablement-clarity branch 2 times, most recently from 8ceaab2 to 9e68dd7 Compare May 4, 2026 13:42
@lonexreb lonexreb force-pushed the docs/54607-bluebubbles-disablement-clarity branch from 9e68dd7 to 9cf8256 Compare May 5, 2026 05:34
@openclaw-barnacle openclaw-barnacle Bot added the triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. label May 5, 2026
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 9cf8256299

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".


| Layer | Key | Effect |
| ------------------- | -------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Channel disablement | `channels.bluebubbles.enabled: false` | Hard opt-out from inbound webhook routing, outbound delivery, channel auto-enable, and bundled-channel setup discovery. The plugin row may still appear in `openclaw plugins list` (it is bundled), but the channel does not register handlers and is treated as explicitly off. |
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Remove claim that channel disablement blocks outbound sends

This row overstates current behavior: setting channels.bluebubbles.enabled: false does stop startup routing/setup paths, but explicit outbound sends can still run through the bundled plugin when credentials are present. In the explicit send path, channel selection accepts any channel whose plugin can be resolved (src/infra/outbound/channel-selection.ts:40-53,155-182), plugin resolution falls back to bundled plugins regardless config (src/channels/plugins/registry.ts:32-38), and BlueBubbles send account resolution only requires serverUrl/password without checking account.enabled (extensions/bluebubbles/src/send.ts:500-506, extensions/bluebubbles/src/account-resolve.ts:30-57). Operators relying on this doc for “fully off” posture can therefore still deliver outbound messages unintentionally.

Useful? React with 👍 / 👎.

…d safe loopback config (openclaw#54607)

The two BlueBubbles disablement layers (channels.bluebubbles.enabled
vs plugins.entries.bluebubbles.enabled) are independent. Operators
running tight-control postures regularly assume the channel-level off
also disables the plugin, then hit auto-enable surprises and config
rewrites at startup.

Add a 'Disabling BlueBubbles' section to docs/channels/bluebubbles.md
that:
  - shows the two layers as a comparison table with concrete effects
  - names when each is the right posture
  - ships a copy-pasteable safe local loopback-only example combining
    gateway.mode=local + bind=loopback + token auth + both layers off
  - notes which startup behaviors (meta block writes) are still
    allowed and which (auto-enable on explicit enabled: false) are not

Docs-only change. Mintlify-compatible Note block matches the style
already used elsewhere in this file.
@lonexreb lonexreb force-pushed the docs/54607-bluebubbles-disablement-clarity branch from 9cf8256 to 4cbb6e0 Compare May 5, 2026 18:12
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 4cbb6e0de7

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

| Channel disablement | `channels.bluebubbles.enabled: false` | Hard opt-out from inbound webhook routing, outbound delivery, channel auto-enable, and bundled-channel setup discovery. The plugin row may still appear in `openclaw plugins list` (it is bundled), but the channel does not register handlers and is treated as explicitly off. |
| Plugin disablement | `plugins.entries.bluebubbles.enabled: false` | Keeps the bundled plugin from registering at all. No webhook handler, no auto-enable on startup, no setup probes. |

Either layer alone is sufficient to keep BlueBubbles routing and setup discovery off. Setting both is the belt-and-suspenders configuration when an operator wants the bundled plugin module itself to stay un-registered as well — useful in tight-control deployments that audit plugin registration counts at startup.
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Correct claim that one disablement layer fully blocks routing

This sentence is inaccurate because explicit outbound sends can still route through BlueBubbles when only one layer is disabled. Channel selection accepts any channel whose plugin resolves via resolveOutboundChannelPlugin (src/infra/outbound/channel-selection.ts:40-53,155-182), and that resolver can fall back to bundled channel plugins through getChannelPlugin even when plugin/channel config flags are off (src/infra/outbound/channel-resolution.ts:52-74, src/channels/plugins/registry.ts:32-38). The BlueBubbles send path then only requires serverUrl and password and does not enforce enabled flags (extensions/bluebubbles/src/account-resolve.ts:30-57), so operators following this guidance can still deliver outbound messages unintentionally.

Useful? React with 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

channel: bluebubbles Channel integration: bluebubbles docs Improvements or additions to documentation size: XS triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant