AO

2026-10-08 · claude-code · plugins · desktop-app

In the Claude desktop app, plugins do not auto-update unless you force it

The Claude desktop app starts every Claude Code chat with DISABLE_AUTOUPDATER=1, which also switches off plugin auto-update, even for a marketplace set to autoUpdate. FORCE_AUTOUPDATE_PLUGINS=1 in settings brings it back. Measured by AO, 2026-10-06.

On 2026-10-06 the AIsle plugin on AO's own PC was still version 0.2.1. Its marketplace had "autoUpdate": true in ~/.claude/settings.json, and Claude Code had already fetched the new catalog: the copy on disk had held 0.3.5 for three days. The install record had not changed since 2026-09-19, and every new chat kept loading 0.2.1.

Why. The desktop app starts a fresh Claude Code process for every chat, and puts DISABLE_AUTOUPDATER=1 in its environment. That makes sense for Claude Code itself: the app brings its own copy and updates it. But Claude Code's docs say the same variable switches off the plugin auto-update pass as well, so the marketplace's autoUpdate is never acted on. A chat's debug log says it in one line:

Plugin autoupdate: skipped (auto-updater disabled)

You can see the variable from inside any desktop chat:

$ env | grep -E '^(DISABLE_AUTOUPDATER|CLAUDE_CODE_ENTRYPOINT)='
DISABLE_AUTOUPDATER=1
CLAUDE_CODE_ENTRYPOINT=claude-desktop

Three ways that did update it, each measured on the same PC on 2026-10-06:

  • The force setting. Add "env": {"FORCE_AUTOUPDATE_PLUGINS": "1"} to ~/.claude/settings.json. The next chat updated the plugin 7 min 48 s after its first message, inside the docs' random delay of up to ten minutes. It turns updates on for every marketplace whose autoUpdate is on, not only yours.
  • The app's own Claude Code, by hand. With only the desktop app installed, claude is not on the PATH. The app keeps its copy at %APPDATA%\Claude\claude-code\<version>\<id>\claude.exe, and inside a chat CLAUDE_CODE_EXECPATH names it. Running it with plugin update aisle@aisle --scope user took under 5 s.
  • The plugin updates itself. A hooks module in the plugin can run that same command when a chat starts: 2.3 s, with no setting and nothing to paste. Claude Code calls that API early access, so keep one of the other two as the way back.

In all three, the new version loads in the next chat, not in the one that ran the update.

How to check your own machine. Print what is installed and when it last changed:

node -e "const p=require(require('os').homedir()+'/.claude/plugins/installed_plugins.json').plugins; for (const [k,v] of Object.entries(p)) console.log(k, v[0].version, v[0].lastUpdated)"

If the date is older than your last release and the chats run in the desktop app, this is the likely cause. A plugin author cannot fix it from the marketplace side: marketplace.json has no field that turns auto-update on.

Not measured. macOS, Linux, and Claude Code versions other than 2.1.286. All of the above was measured on one Windows PC.

The numbers

  • On 2026-10-06 the AIsle plugin on AO's PC was still 0.2.1, its install record last changed on 2026-09-19, while its marketplace was set to "autoUpdate": true and the copy of the marketplace Claude Code had fetched held 0.3.5 since 2026-10-03 (AO's own log)
  • The app starts each chat's Claude Code (2.1.286) with DISABLE_AUTOUPDATER=1 in its environment, next to CLAUDE_CODE_ENTRYPOINT=claude-desktop (AO, from the app's process list on 2026-10-06, and from inside a desktop chat on 2026-10-08)
  • A chat started the way the app starts one logged "Plugin autoupdate: skipped (auto-updater disabled)" 2 s after it started (AO's own log, 2026-10-06)
  • With "env": {"FORCE_AUTOUPDATE_PLUGINS": "1"} added to ~/.claude/settings.json, the same kind of chat logged "Plugin autoupdate: updated aisle@aisle from 0.2.1 to 0.3.5", 7 min 48 s after its first message (AO's own log, 2026-10-06)
  • The app's own claude.exe, run by hand as "plugin update aisle@aisle --scope user", went from 0.2.1 to 0.3.5 in under 5 s and said "Restart to apply changes." (AO's own log, 2026-10-06)
  • A hooks module inside the plugin that runs the same update when a chat starts did it in 2.3 s, with no setting changed; Claude Code's own reference calls that API early access (AO, 2026-10-06)
  • Claude Code's docs: DISABLE_UPDATES=1, DISABLE_AUTOUPDATER=1, or the variable that turns off nonessential traffic, turn the whole plugin auto-update pass off, unless FORCE_AUTOUPDATE_PLUGINS=1 is also set (Plugin loading reference, read 2026-10-08)
  • Claude Code's docs: the pass starts after a random delay of up to ten minutes after the first message; the running session keeps the versions it loaded, and the new ones load on the next launch (Plugin loading reference, read 2026-10-08)
stored on your device — like everything here

← All knowledge · machine version (.md)