claude update on Windows reports success but never replaces the launcher (stays on old version)
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
- Run
claude update- it prints that it successfully updated to 2.1.201. ~/.claude/.last-update-result.jsonrecords{"outcome":"success","status":"success","version_from":"2.1.200","version_to":"2.1.201","error_code":null}..local/share/claude/versions/contains the freshly downloaded 2.1.201 build.- But
.local/bin/claude.exeis still the 2.1.200 build, so every new shell runs 2.1.200. Re-runningclaude updatenever makes progress.
Evidence
- Only one
claude.exeon 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.200exactly, whileversions/2.1.201had a different hash. After manually copyingversions/2.1.201over the launcher,claude --versioncorrectly 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
- Use rename-then-copy so a running launcher can be replaced.
- 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" -ForceThis issue has 1 comment on GitHub. Read the full discussion on GitHub ↗