[BUG] Account-level plugins never sync to Claude Code on the web (plugins_sync count: 0) while account skills sync fine
Preflight Checklist
- [x] I have searched existing issues and this hasn't been reported yet
- [x] This is a single bug report (please file separate reports for different bugs)
- [x] I am using the latest version of Claude Code
What's Wrong?
Plugins installed at the account level (claude.ai -> Settings -> Customize -> Plugins)
never reach Claude Code on the web / remote cloud sessions.
Account-level SKILLS sync into the same session correctly, so the transport works.
Only the plugin half comes back empty. The sync runs, no gate closes, and the server
returns an empty plugin list.
Net effect: there is no way to enable a plugin for all projects without owning a
computer that runs the Claude Code CLI or desktop app. Phone-only users cannot use
plugins at all, and someone with two computers has to repeat the setup on each.
What Should Happen?
An enabled account-level plugin should be available in Claude Code web/cloud sessions,
the same way account-level skills already are.
Error Messages/Logs
plugins_sync_starting
plugins_sync_no_changes {"count":0,"duration_ms":600,"list_ms":177,"had_manifest":false}
[DEBUG] installed_plugins.json doesn't exist, returning empty V2 object
[DEBUG] Found 0 plugins (0 enabled, 0 disabled)
[DEBUG] Total plugin skills loaded: 0
[DEBUG] Registered 0 hooks from 0 plugins
Same session, same sync pass, skills succeed:
skills_sync_starting
skills_sync_complete {"downloaded":9,"removed":0,"duration_ms":1867}
Repository-settings workaround, on the session's own branch:
installPluginsForHeadless: starting
installPluginsForHeadless: no marketplaces declared
Steps to Reproduce
- claude.ai -> Settings -> Customize -> Plugins -> Add -> Add marketplace ->
Add from a repository -> https://github.com/DietrichGebert/ponytail
- Install the
ponytailplugin. Its page shows 6 skills, 3 hooks, toggle ON. - Open a NEW Claude Code session on the web (claude.ai/code).
- Run: ls -la ~/.claude/plugins/synced/*/
-> empty
- Run: grep -h '"event":"plugins_sync' /tmp/claude-code-*.diag.log | tail -5
-> plugins_sync_no_changes {"count":0,"had_manifest":false}
- Call ListPlugins -> {"results":[]}
- Compare: ls ~/.claude/skills/synced/*/ -> all 9 account skills present.
Claude Model
Opus
Is this a regression?
No, this never worked
Last Working Version
_No response_
Claude Code Version
2.1.260
Platform
Anthropic API
Operating System
Windows
Terminal/Shell
Other
Additional Information
Workarounds tried, all fail:
- Settings -> Claude Code: no plugin toggle exists anywhere on that page.
- Plugin page's ... menu: only "Remove". No per-surface option.
- Repository .claude/settings.json with extraKnownMarketplaces + enabledPlugins,
verified on the session's own branch: "no marketplaces declared", logged in the
same millisecond as "starting". Project settings appear not to be read, which
contradicts the settings docs describing extraKnownMarketplaces as
repository-level.
- /cloud-plugins consent: needs a machine running the CLI or desktop app, and the
prompt is scoped to "cloud sessions you run from this machine" - so it does not
cover a second computer, and never covers a phone.
Why this looks like a gap rather than a design choice: the account-level plugin sync
path already exists and mirrors the skills one exactly.
{ settingKey: "syncClaudeAiPlugins",
policyKey: "allow_account_plugins_sync",
flagName: "tengu_account_plugins_sync_enabled" }
Skills use allow_account_skills_sync and work. Same architecture, same
/api/oauth/organizations/:orgUUID/plugins/list-plugins endpoint shape. One half
delivers, the other returns nothing.
No gate ever closed - no flag_off, org_denied, gate_closed or policy_verdict_pending
in the diagnostics log.
Environment: CLAUDE_CODE_ENTRYPOINT=remote,
CLAUDE_CODE_REMOTE_ENVIRONMENT_TYPE=cloud_default, personal account, no org admin
access, no machine has ever run /cloud-plugins.
Request: make account-level plugins sync to web/cloud sessions the way account-level
skills already do. Failing that, document that plugins require a computer, and make
extraKnownMarketplaces in repository settings work for cloud sessions.
Showing cached comments. Read the full discussion on GitHub ↗
3 Comments
Running into the same issue, Claude wrote this as additional info to contribute, hopefully this gets fixed soon, because this bug is seriously obnoxious, and the observed behavior does not match what the docs say:
Root cause:
SKIP_PLUGIN_MARKETPLACE=truein the container environmentI hit this same issue and traced it to the source. The
cloud_defaultremote environment injectsSKIP_PLUGIN_MARKETPLACE=trueinto the parent process environment (theclaudelauncher, PID 1's child). This kills the entire plugin marketplace sync pipeline before it evaluates any plugin config.Diagnostic evidence
Process environment chain:
Note:
CLAUDE_CODE_SYNC_SKILLS=1exists and works. There is noCLAUDE_CODE_SYNC_PLUGINSequivalent.Skills vs plugins - same bucket UUID, different outcomes:
The bucket marker file (
.bucket-...) is created in both directories, indicating the sync infrastructure knows about the plugin bucket; it just never populates it.ListPluginsreturns[];ListSkillsreturns all 13 skills correctly.Additional finding: undocumented
reachfieldEvery plugin in the
SearchPluginsAPI has areachfield ("remote"or"contained"), but this field is absent from the plugin.json schema documentation. It's unclear whether this is author-set or computed server-side, and whether it plays a role in the sync decision alongside or independently ofSKIP_PLUGIN_MARKETPLACE. These may be layered blockers.Environment details
CLAUDE_CODE_REMOTE_ENVIRONMENT_TYPE=cloud_defaultCLAUDE_CODE_ENTRYPOINT=remoteCLAUDE_CODE_VERSION=2.1.42SKIP_PLUGIN_MARKETPLACE=) has no effect; the parent process already consumed the flag before shell-level overrides applyWhat the docs say
plugins-reference.md:
cloud-environments.md:
The documented behavior and the actual behavior directly contradict.
+1
Reproduced today with a different marketplace and a Team plan account.
Setup
https://github.com/mnmkng/Claude(.claude-plugin/marketplace.json, one pluginpersonal-productivitywith one skilltodoist).claude plugin validatepasses on both manifests. Inside the same cloud container image,claude plugin marketplace add mnmkng/Claude+claude plugin install personal-productivity@mnmkng-personalsucceed andclaude plugin detailslists the skill. So the marketplace itself is fine.I tested the
/todoistskill's availability in Chat and on mobile and both work, but never in Claude Code cloud.Result in a fresh cloud session started after enabling
~/.claude/plugins/synced/<bucket>/contains only the bucket marker.claude plugin listreports no plugins and no "Synced from claude.ai" heading. The skill is absent from the system prompt.In the same session, account skills sync works:
skills_sync_complete {"downloaded":13}on first start, and it re-runs every ~10 minutes. Plugin sync runs only once at session start.Side note on UX that cost me an hour: the Desktop app's Code tab has its own Customize → Plugins page, but it manages the local
~/.claudestore only ("Marketplaces added with Claude Code on this computer"). Plugins enabled there are invisible to cloud sessions by design. The account-level page is under the Chat and Cowork tab. That is not obvious when you are configuring Claude Code and running it in the cloud.+1, reproduced 2026-09-22 on a Max plan, Claude Code 2.1.278.
Probe: a minimal plugin (one skill, one subagent, a SessionStart hook that prints a
marker, a PreToolUse hook that denies one sentinel command).
claude plugin validatepasses, and it works end to end locally with --plugin-dir.
Uploaded via claude.ai (Chat tab) > Customize > Plugins; it lands in "My Uploads"
with account scope. A terminal session on the same account syncs it
(
claude plugin listshows it under "Synced from claude.ai"), along with twoAnthropic plugins.
A fresh cloud session started ~11 min after upload:
So the local terminal gets all three account plugins, and the cloud session on the
same version gets none. This also blocks plugins in Claude Code Projects, since
every thread is a cloud session.