### Summary
Add a setting to disable the hosted plugin catalog feed.
### Problem to solve
The gateway fetches `https://clawhub.ai/v1/feeds/plugins` when it lists or inspects plugins, and there's no way to turn that off. The URL is hardcoded in `official-external-plugin-catalog-source.ts`, and `OPENCLAW_CLAWHUB_URL` doesn't cover it.
### Proposed solution
A config key, e.g. `plugins.catalog.hosted: false`, that skips the hosted feed and uses only the bundled catalog metadata.
### Alternatives considered
Blocking the host at the network layer, which works but leaves the request firing.
### Impact
Deployments that pin their plugins and restrict egress don't need the feed.
### Do you plan to open a PR for this?
Maybe, with maintainer guidance
Codex review: this still needs some work. _Reviewed October 3, 2026, 7:43 PM ET / 23:43 UTC._
**Summary**
The requested deployment control is still missing. Marketplace entries support a command-specific offline mode, but Gateway listing and inspection still load the hosted catalog; a new persistent control needs maintainer agreement.
Reproducibility: not applicable. as a bug reproduction: source confirms the missing configuration capability and the Gateway’s hosted-loader call; no runtime execution was performed.
**Maintainer decision needed**
| Question | Recommendation |
|---|---|
| Should OpenClaw expose a persistent bundled-only plugin catalog setting that suppresses hosted requests and previously cached hosted catalog data? | **Support persistent bundled-only mode:** Approve a default-preserving catalog setting shared by Gateway and CLI consumers, with explicit refresh behavior documented. |
Why: Existing offline behavior retains hosted snapshots; choosing bundled-only semantics and the scope of explicit refresh commands creates a new operator-facing contract.
**Next step**
Confirm bundled-only semantics and refresh scope before assigning a focused implementation; a new configuration contract is ineligible for strict bug automation.
<details>
<summary>Review details</summary>
Best possible solution:
Use one catalog-owner policy to provide a documented bundled-only mode across Gateway listing, inspection, and CLI callers, preserving current defaults and invalidating cached hosted presentation when the policy changes.
Do we have a high-confidence way to reproduce the issue?
Not applicable as a bug reproduction: source confirms the missing configuration capability and the Gateway’s hosted-loader call; no runtime execution was performed.
Is this the best way to solve the issue?
Unclear until maintainers choose the contract. A policy at the existing catalog owner is the narrowest path; reusing offline mode unchanged would still expose cached hosted metadata.
AGENTS.md: found and applied where relevant.
Codex review notes: model internal, reasoning medium; reviewed against [89c984736562](https://github.com/openclaw/openclaw/commit/89c984736562959b3e6160dc118d4b84e18aabe6).
</details>
<details>
<summary>Label changes</summary>
Label changes:
- add `P2`: This is a bounded deployment-control improvement without evidence of a broken core workflow.
- add `impact:other`: Pinned-plugin deployments cannot suppress optional hosted catalog egress through a persistent supported setting.
- add `issue-rating: 🌊 off-meta tidepool`: Current issue advisory state selects this label.
- add `clawsweeper:no-new-fix-pr`: Current issue advisory state selects this label.
- add `clawsweeper:needs-maintainer-review`: Current issue advisory state selects this label.
- add `clawsweeper:needs-product-decision`: Current issue advisory state selects this label.
Label justifications:
- `P2`: This is a bounded deployment-control improvement without evidence of a broken core workflow.
- `impact:other`: Pinned-plugin deployments cannot suppress optional hosted catalog egress through a persistent supported setting.
</details>
<details>
<summary>Evidence reviewed</summary>
What I checked:
- **Gateway catalog requests remain enabled:** loadOfficialCatalog calls the hosted loader without an offline or disable parameter and caches its result. listManagedPlugins and inspectManagedPlugin consume this owner at lines 242 and 588. ([`src/plugins/management-catalog.ts:273`](https://github.com/openclaw/openclaw/blob/89c984736562959b3e6160dc118d4b84e18aabe6/src/plugins/management-catalog.ts#L273), [89c984736562](https://github.com/openclaw/openclaw/commit/89c984736562959b3e6160dc118d4b84e18aabe6))
- **Existing offline behavior has a narrower contract:** The hosted loader checks an explicit offline parameter before network I/O, but offline mode selects an accepted hosted snapshot before bundled fallback. It therefore differs from the requested persistent bundled-only mode. ([`src/plugins/official-external-plugin-catalog-hosted.ts:425`](https://github.com/openclaw/openclaw/blob/89c984736562959b3e6160dc118d4b84e18aabe6/src/plugins/official-external-plugin-catalog-hosted.ts#L425), [89c984736562](https://github.com/openclaw/openclaw/commit/89c984736562959b3e6160dc118d4b84e18aabe6))
- **Documented command-specific workaround:** Marketplace documentation describes entries --offline as reading the latest accepted snapshot without fetching. This is useful for that CLI command but does not establish a deployment-wide Gateway setting. Public docs: [`docs/cli/plugins/marketplace.md`](https://docs.openclaw.ai/cli/plugins/marketplace). ([`docs/cli/plugins/marketplace.md:28`](https://docs.openclaw.ai/cli/plugins/marketplace), [89c984736562](https://github.com/openclaw/openclaw/commit/89c984736562959b3e6160dc118d4b84e18aabe6))
- **No persistent catalog configuration:** The strict plugins schema supports loading, allow/deny lists, slots, and entries, but has no catalog configuration. The proposed key would introduce a new supported configuration surface. ([`src/config/zod-schema.root-shape.ts:579`](https://github.com/openclaw/openclaw/blob/89c984736562959b3e6160dc118d4b84e18aabe6/src/config/zod-schema.root-shape.ts#L579), [89c984736562](https://github.com/openclaw/openclaw/commit/89c984736562959b3e6160dc118d4b84e18aabe6))
- **Catalog feed and registry overrides are separate:** The feed source supplies the default clawhub.ai feed independently of the ClawHub client’s registry URL resolver. OPENCLAW_CLAWHUB_URL changes the latter and is not a hosted-feed disable control. ([`src/plugins/official-external-plugin-catalog-source.ts:24`](https://github.com/openclaw/openclaw/blob/89c984736562959b3e6160dc118d4b84e18aabe6/src/plugins/official-external-plugin-catalog-source.ts#L24), [89c984736562](https://github.com/openclaw/openclaw/commit/89c984736562959b3e6160dc118d4b84e18aabe6))
- **Latest release also lacks the proposed setting:** GitHub contents reads at v2026.9.8 confirmed the public feed default and a strict plugins schema without a catalog setting. Local historical blob reads failed because the remote rejected retrieval; release inspection was completed through GitHub’s read API. ([`src/config/zod-schema.root-shape.ts`](https://github.com/openclaw/openclaw/blob/fc23bc864e4553c2d215e479eeec47b67a0bf943/src/config/zod-schema.root-shape.ts), [fc23bc864e45](https://github.com/openclaw/openclaw/commit/fc23bc864e4553c2d215e479eeec47b67a0bf943))
Likely related people:
- **steipete:** Suggested for follow-up; no historical authorship or introduction is verified. (role: unverified routing candidate; confidence: low)
</details>
<details>
<summary>How this review workflow works</summary>
- ClawSweeper keeps one durable marker-backed review comment per issue or PR.
- Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
- A fresh review can be triggered by eligible `@clawsweeper re-review` comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
- PR/issue authors and users with repository write access can comment `@clawsweeper re-review` or `@clawsweeper re-run` on an open PR or issue to request a fresh review only.
- Maintainers can also comment `@clawsweeper review` to request a fresh review only.
- Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
- Maintainer-only repair and merge flows require explicit commands such as `@clawsweeper autofix`, `@clawsweeper automerge`, `@clawsweeper fix ci`, or `@clawsweeper address review`.
- Maintainers can comment `@clawsweeper explain` to ask for more context, or `@clawsweeper stop` to stop active automation.
</details>
<!-- clawsweeper-review-version item=164620 reviewed_at=2026-10-03T23:43:46.135Z sha=na source_revision=17865610350c2d901ba53017ab07090460525ae27ec4100a1a29e3e7ea1c8d96 lease_owner=github-run-37162492974-1 lease_comment_id=5974681143 v=1 -->
<!-- clawsweeper-review item=164620 -->
Same problem from a fake-IP environment (Clash/mihomo, `198.18.0.0/15` + `fc00::/7`) — supporting this request with an additional reason.
On this host `https://clawhub.ai/v1/feeds/plugins` is **refused by the SSRF guard** (`Blocked: resolves to private/internal/special-use IP address`) on every plugin list/inspect and at gateway startup — 20 blocked lines in one day — and the skill-icon fetches (`/api/v1/skill-icons/...`) each burn a 5 s timeout. So on fake-IP networks the feed isn't just unnecessary, it actively fails and spams the log.
Related same-class issues: #152765 (remote model catalog refresh ignores `ssrfPolicy.allowRfc2544BenchmarkRange`) and #168356 (provider discovery hardcodes ~5 s and ignores `models.providers.<id>.timeoutSeconds`).
One more data point: fake-IP handling in OpenClaw feels **regressive** — earlier releases handled several of these paths (there are closed issues like #68192, #88984, #55058 for web_fetch/QQ/auth paths), but recent versions re-introduced the same failure shape on the catalog/discovery/plugin-feed paths. A `plugins.catalog.hosted: false`-style toggle — or consistently honoring the `allowRfc2544BenchmarkRange` / `allowIpv6UniqueLocalRange` flags on all three paths — would resolve this class once instead of per-path regressions.