claude update on Windows reports success but never replaces the launcher (stays on old version)

Open 💬 1 comment Opened Jul 6, 2026 by ronnieshipman

Summary

On the Windows native install, claude update reports a successful update to the new version, but every new shell keeps launching the previous version. The download step works (the new versioned binary appears under .local/share/claude/versions/), but the final step - replacing the launcher copy at .local/bin/claude.exe - never happens, and the updater records and reports success regardless.

Environment

  • OS: Windows 11 Enterprise (26200)
  • Install type: native installer (launcher at ~/.local/bin/claude.exe)
  • Observed updating from 2.1.200 to 2.1.201

Steps / what happens

  1. Run claude update - it prints that it successfully updated to 2.1.201.
  2. ~/.claude/.last-update-result.json records {"outcome":"success","status":"success","version_from":"2.1.200","version_to":"2.1.201","error_code":null}.
  3. .local/share/claude/versions/ contains the freshly downloaded 2.1.201 build.
  4. But .local/bin/claude.exe is still the 2.1.200 build, so every new shell runs 2.1.200. Re-running claude update never makes progress.

Evidence

  • Only one claude.exe on PATH (~/.local/bin/claude.exe) - this is not a PATH collision.
  • The launcher is a full (~241 MB) copy of the exe, not a symlink.
  • SHA-256 of the launcher equalled the SHA-256 of versions/2.1.200 exactly, while versions/2.1.201 had a different hash. After manually copying versions/2.1.201 over the launcher, claude --version correctly reported 2.1.201.

Likely root cause

The updater is itself running from .local/bin/claude.exe, so Windows locks that file and it cannot be overwritten in place. The rename-then-copy pattern (rename the running exe aside, then copy the new build in - which Windows does permit) does not appear to be used on this path. The failure is also swallowed: the update reports success even though the swap did not occur.

Impact

Users believe they are up to date when they are not, with no signal unless they check claude --version in a fresh shell.

Suggested fixes

  1. Use rename-then-copy so a running launcher can be replaced.
  2. If the swap fails, report failure honestly instead of writing outcome "success".

Workaround

Manually copy the newest build over the launcher (with Claude closed, or via the rename trick if it is running):

Move-Item "$env:USERPROFILE/.local/bin/claude.exe" "$env:USERPROFILE/.local/bin/claude.exe.old" -Force
Copy-Item "$env:USERPROFILE/.local/share/claude/versions/<new-version>" "$env:USERPROFILE/.local/bin/claude.exe" -Force

View original on GitHub ↗

This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗