← Blog · 2026-10-28
Claude Code Not Updating? 12 Causes and Fixes for claude update and Auto-Update
30-second test: in your shell (not inside a session), run
claude --version, thenclaude update, thenclaude --versionagain. Ifclaude updateprintsSuccessfully updated from <old> to version <new>but sessions still show the old version, start at cause 1. If it printsClaude is up to date!, you're on Homebrew, WinGet or apk: go to cause 2. If it prints an error, find it in the table below.
Native installs of Claude Code update themselves: Claude Code checks for updates on startup and periodically while running, downloads and installs the new version in the background, and the update takes effect the next time you start it. Homebrew, WinGet, apt, dnf and apk installs don't auto-update by default. So "it never updates" usually means a missing restart, an install method that doesn't self-update, or a setting that switched updates off.
Two commands that tell you most of it
claude doctorprints read-only installation and settings diagnostics without starting a session. Look at theAuto-updatesline (it showsenabled, ordisabled (set by env: DISABLE_AUTOUPDATER)when that's set) and theLast update attemptline, which records the result of the last background update.claude updateapplies an update right away. It reportsSuccessfully updated from <old> to version <new>, orClaude Code is up to date (<version>)if you already have the newest one. Installs managed by Homebrew, WinGet or apk reportClaude is up to date!instead.
Match your error
| You see | Go to |
|---|---|
Auto-update failed · Run claude doctor in red in the session footer |
The section right below |
Claude is up to date! but you're behind |
Causes 2 and 3 |
Auto-updates: disabled (set by env: ...) in claude doctor |
Cause 5 |
A one-time notice that the npm global install can't auto-update, or EACCES |
Cause 7 |
npm error code ENOTEMPTY |
Cause 7 |
The connection dropped while downloading the update or Download timed out: exceeded the total deadline |
Cause 9 |
Release verification failed for Claude Code <version> (<reason>). The update was not installed. |
Cause 10 |
claude update hangs after Checking for updates |
Cause 11 |
'claude' is not recognized right after an update on Windows |
Cause 12 |
Auto-update failed · Run claude doctor in the footer
This red line means Claude Code tried to update itself in the background and the update didn't install. You can keep working; nothing is broken. claude doctor will only show Last update attempt: failed (install_failed) with a date and no cause, so skip it: run claude update in your shell instead. That either finishes the update or prints the real error, which you can match in the table above.
12 causes, in the order to check them
- The update installed, but you haven't restarted. Background updates take effect the next time you start Claude Code, so a session that's been open for days keeps running the old version. Exit the session and start
claudeagain, then checkclaude --version. - Your install method doesn't auto-update. Only native installs (the
curl ... install.sh,install.ps1orinstall.cmdinstaller) update in the background. Upgrade the others yourself:brew upgrade claude-code(orbrew upgrade claude-code@latest),winget upgrade Anthropic.ClaudeCode,sudo apt update && sudo apt upgrade claude-code,sudo dnf upgrade claude-code, orapk update && apk upgrade claude-code. For Homebrew and WinGet you can opt in to automatic upgrades by settingCLAUDE_CODE_PACKAGE_MANAGER_AUTO_UPDATE=1: Claude Code then runs the upgrade in the background when a new version is available and shows a restart prompt on success. On WinGet that upgrade can fail while Claude Code is running because Windows locks the executable, and Claude Code shows you the manual command instead. apt, dnf and apk always need a manual upgrade because they need elevated privileges. Known issue: Claude Code can tell you about an update before the package manager has it, so if an upgrade fails, wait and try later. - You're on the stable channel, on purpose or not. Native installs follow the
latestchannel by default. Thestablechannel serves a version that's typically about a week old and skips releases with major regressions, so being "behind" is expected there. Check/config→ Auto-update channel, or look for"autoUpdatesChannel": "stable"in your settings files;claude install stablealso saves that choice. On Homebrew the cask name decides instead:claude-codetracks stable andclaude-code@latesttracks latest, and theautoUpdatesChannelsetting is ignored. Ifbrew upgrade --cask claude-code@latestsaysCask 'claude-code@latest' is not installed, runbrew list --cask | grep claude-codeand upgrade the cask it prints. An older version than expected right afterbrew installusually means a stale cask index: runbrew updatefirst. A newly launched model can need a version newer than stable serves; switch to latest to use it right away. - A
minimumVersionor managed version range is in play.minimumVersionis a floor: background updates andclaude updaterefuse to install anything below it. Claude Code writes it for you when you switch from latest to stable in/configand choose to stay on your current version, and clears it when you switch back to latest. In an organization, the managed settingsrequiredMinimumVersionandrequiredMaximumVersionmake Claude Code refuse to start outside a version range, and updates skip versions above the ceiling. If your company set a ceiling, staying below it is the intended behavior; ask your admin. - Something switched updates off. Check your shell profile and the
envblock of every settings file (user, project, local and managed) for three variables.DISABLE_AUTOUPDATER=1stops background updates only;claude updateandclaude installstill work.DISABLE_UPDATES=1blocks every update path, including manualclaude updateandclaude install; teams that ship Claude Code through their own channel set it.CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFICdisables nonessential network traffic, and auto-updates are part of that; setting it to0orfalsestill disables it, so unset the variable instead. On a native or npm install,claude doctorshows which variable turned auto-updates off. - Two installs, and the updated one isn't the one you run. An npm global install, a legacy
~/.claude/local/install, Homebrew and the native installer can all sit on your PATH at once. Updating one leavesclaudepointing at another. Runwhich -a claude(Windows:where.exe claude), plusls -la ~/.local/bin/claude,ls -la ~/.claude/local/andnpm -g ls @anthropic-ai/claude-code. Keep one, ideally the native install, and remove the rest (npm uninstall -g @anthropic-ai/claude-code,rm -rf ~/.claude/local). The command not found guide walks through the cleanup for each method. - npm can't write its global folder. If the npm global directory isn't writable, an npm install can't auto-update: Claude Code shows a one-time notice at startup and
claude doctorlists the available fixes. Don't usesudo npm install -g; Anthropic warns it causes permission issues and security risks. The documented fix for npm permission errors is to switch to the native installer (curl -fsSL https://claude.ai/install.sh | bash) and then remove the npm copy (cause 6). If you stay on npm, upgrade withnpm install -g @anthropic-ai/claude-code@latest, notnpm update -g, which respects the original semver range and may not move you to the newest release.npm error code ENOTEMPTYduring an update means a leftover folder: delete the directory named on thenpm error pathline and any.claude-code-*folders next to it (rm -rf "$(npm root -g)/@anthropic-ai/claude-code"andrm -rf "$(npm root -g)/@anthropic-ai/.claude-code-"*), then reinstall. - You replaced the native launcher. On macOS and Linux the native installer manages
~/.local/bin/claudeas a symlink into~/.local/share/claude/versions/. If you swapped it for your own script or symlink, updates still install new versions underversions/, but your launcher decides which one runs, and Claude Code keeps every installed version on disk.claude doctorreports a launcher the installer didn't create. To hand control back, remove~/.local/bin/claudeand runclaude update. If native-install folders aren't writable (~/.local/bin,~/.local/share/claude,~/.claude), check withtest -w ~/.local/bin && echo writable, and fix ownership withsudo mkdir -p ~/.local/binandsudo chown -R $(whoami) ~/.local. - The download dropped or timed out.
The connection dropped while downloading the update (attempt 3/3: ...)means the connection to the download server closed and three attempts didn't recover;Download timed out: exceeded the total deadlinemeans the download didn't finish within 10 minutes. Runclaude updateagain, ideally on a faster network. Test the host withcurl -sI https://downloads.claude.ai/claude-code-releases/latest(Windows:curl.exe -sI ...):200means reachable,403usually means a proxy or filter, and no output means your network blocks it. Behind a corporate proxy, setHTTPS_PROXY(andHTTP_PROXY) before runningclaude update, and ask your network team to allow the full download fromdownloads.claude.ai; proxies sometimes cut off large downloads. Our proxy and SSL certificate errors guide covers the rest of the proxy setup. Release verification failed. Claude Code couldn't confirm the release was genuine, so it installed nothing and your current version keeps working. If the reason in parentheses starts withsidecar_fetch_, run the same command again from your shell. For any other reason, try again later. If it keeps happening, report it with the full message.claude updatehangs afterChecking for updates. Before v2.1.214,claude updateandclaude doctorhung when one of your shell config paths (~/.zshrc,~/.bashrc,~/.config/fish/config.fish, or on macOS~/.bash_profile,~/.bash_login,~/.profile) was a directory instead of a file. Find it withls -ld ~/.zshrc ~/.bashrc ~/.bash_profile ~/.bash_login ~/.profile ~/.config/fish/config.fish(a line starting withdis the culprit) and move it aside. Sinceclaude updateitself hangs on those versions, update by rerunning the install script instead.- Windows and WSL quirks. On Windows, Claude Code updates by renaming
claude.exeto a backup and moving the new one in. If that fails,%USERPROFILE%\.local\bincan be left with onlyclaude.exe.old.<timestamp>. Restore it in PowerShell withGet-ChildItem "$env:USERPROFILE\.local\bin\claude.exe.old.*" | Sort-Object Name | Select-Object -Last 1 | Rename-Item -NewName claude.exe, or rerunirm https://claude.ai/install.ps1 | iexif there's no backup. In WSL, install, run and update Claude Code inside the WSL terminal, not from PowerShell or CMD. If you used npm inside WSL and it reports a platform mismatch, WSL is picking up the Windowsnpm: runnpm config set os linux, thennpm install -g @anthropic-ai/claude-code --force(nosudo).which npmandwhich nodepaths starting with/mnt/c/mean you're using Windows Node; install Node inside Linux with your package manager or nvm.
Staying on a version on purpose
Sometimes you want the opposite: hold a version that works while a new release settles.
- Follow stable instead of latest:
/config→ Auto-update channel, or"autoUpdatesChannel": "stable"in settings.json. - Install an exact version:
claude install 2.1.89(orcurl -fsSL https://claude.ai/install.sh | bash -s 2.1.89; PowerShell:& ([scriptblock]::Create((irm https://claude.ai/install.ps1))) 2.1.89).claude --versionshould then print2.1.89 (Claude Code). - Then keep it there: add
"env": { "DISABLE_AUTOUPDATER": "1" }to settings.json so background updates don't move you forward. Remember to remove it later, or you'll be back at cause 5.
If claude isn't found at all after an update or reinstall, see Claude Code command not found. If the update worked but you now get errors on every turn, Claude Code API errors and Claude Code stuck or not responding cover the usual causes.
Facts on this page come from Anthropic's Claude Code docs on advanced setup and updates, troubleshooting installation and login, the CLI reference, environment variables and the settings reference. This guide isn't affiliated with Anthropic.