Updating Claude Code, and pinning it when you should not

Claude Code updates itself, which is right for a laptop and wrong for a pipeline. Since the release channel and the version floor became settings, stopping it is no longer one blunt environment variable.

By the Continuum team. We build a workbench that runs Claude Code, Codex, and their peers, so the model rates quoted here are the ones our own cost analytics ship with.

The short version

Run claude update to update any Claude Code install immediately. Native installs also update themselves in the background; Homebrew, WinGet, apt, dnf and apk installs do not unless you opt in. Choose how fast updates arrive with the autoUpdatesChannel setting: latest by default, or stable, which runs about a week behind and skips releases with major regressions. Stop the background check with DISABLE_AUTOUPDATER=1, or block every update path including manual ones with DISABLE_UPDATES. All accurate as of August 2026.

What you need to know
  • claude update works on every install method, including package managers.
  • Native and npm installs auto-update. Homebrew, WinGet, apt, dnf and apk do not.
  • autoUpdatesChannel picks latest (default) or stable, roughly a week behind.
  • DISABLE_AUTOUPDATER stops the background check. DISABLE_UPDATES blocks manual ones too.
  • claude install 2.1.89 pins an exact version without going through npm.
  • Check claude --version and claude doctor before reporting any bug.

Update it now

One command covers every install method, including the ones that do not auto-update.

The universal path.
claude update
claude --version

On success it prints Successfully updated from <old version> to version <new version>. If you are already current it prints Claude Code is up to date (<version>). Installs owned by Homebrew, WinGet or apk report Claude is up to date! instead, because the package manager is the one that moves the files. claude --version answers in the form 2.1.211 (Claude Code).

Update behaviour by install method, as of August 2026.

Install methodUpdate withAuto-updates?
Native installerclaude updateYes, in the background
Homebrewbrew upgrade claude-codeNo, opt in below
WinGetwinget upgrade Anthropic.ClaudeCodeNo, opt in below
apt (Debian, Ubuntu)sudo apt update && sudo apt upgrade claude-codeNo, needs elevation
dnf (Fedora, RHEL)sudo dnf upgrade claude-codeNo, needs elevation
apk (Alpine)apk update && apk upgrade claude-codeNo, needs elevation
npm globalnpm install -g @anthropic-ai/claude-code@latestYes, if the npm global dir is writable
Docker imageRebuild the imageNo, and that is the point

How auto-update actually works

A native install checks for updates at startup and periodically while running. New versions download and install in the background, then take effect the next time you start Claude Code. Nothing swaps underneath a running session, which is why a long agent run is never interrupted by an update and why the version you are running can be one behind the version on disk.

  • On macOS and Linux the launcher is ~/.local/bin/claude, a symlink into ~/.local/share/claude/versions/. Versions land in that directory; the symlink decides which one runs.
  • If you replace that launcher with your own script or symlink, the updater leaves it alone (from v2.1.207 onward) and keeps every installed version on disk, because it cannot tell which one your launcher needs.
  • claude doctor reports the result of the most recent update attempt, plus a launcher the installer did not create.
  • An npm global install that cannot write to the npm global directory shows a one-time notice at startup, and claude doctor lists the fixes.
A background update installs a new version and moves the launcher symlink onto it, while the session you are already in keeps executing the older version until you restart the session you are in started before the update landed ~/.local/bin/claude a symlink; decides the next start ~/.local/share/claude/versions/ 2.1.92 downloaded 2.1.89 executing 2.1.84 kept on disk in this session 2.1.89 on the next start 2.1.92 on your channel 2.1.94 claude --version starts a new process, so it reports the symlink, not your session.

Latest or stable: pick a channel

Auto-updates and claude update both follow a release channel. There are two, and the choice is a one-line setting.

ChannelWhat you getPick it for
latest (default)Every release as soon as it shipsPersonal machines; you want the fixes
stableA build typically about a week old, skipping releases with major regressionsTeam fleets; you want fewer surprises
~/.claude/settings.json
{
  "autoUpdatesChannel": "stable",
  "minimumVersion": "2.1.100"
}

You can also set the channel interactively with /config, under Auto-update channel. minimumVersion is a floor: background updates and claude update refuse to install anything below it, so switching from latest to stable cannot silently downgrade a machine that is already ahead. Switching channels in /config asks whether to stay put or allow the downgrade, and staying put writes that version into minimumVersion for you.

  • Homebrew picks the channel by cask name, not by this setting: claude-code tracks stable, claude-code@latest tracks latest.
  • The Linux repositories carry both channels in their URL path, so switching means editing the repository definition rather than a setting.
  • Enterprise fleets can enforce a channel through managed settings, and can make Claude Code refuse to start outside a version range with requiredMinimumVersion and requiredMaximumVersion. Those are a harder guarantee than minimumVersion, which only constrains updates.

Turning updates off

Two variables, and they are not interchangeable. Reaching for the wrong one is why people report that they disabled auto-update and it updated anyway.

VariableStopsLeaves working
DISABLE_AUTOUPDATER=1The background checkclaude update, claude install
DISABLE_UPDATES=1Every update pathNothing; you distribute versions yourself
Settings are the durable place for this. A shell export only covers shells that read that profile.
{
  "env": {
    "DISABLE_AUTOUPDATER": "1"
  }
}

Pinning a version for CI and images

In a pipeline, a self-updating agent means the tool that produced the last green build is not the tool running today. When something regresses you cannot bisect it, because one of the variables changed itself.

01

Install the exact version

The native installer takes a version or a channel as its argument, so you no longer have to route through npm to pin.

# native installer, exact version
curl -fsSL https://claude.ai/install.sh | bash -s 2.1.89

# or, on a machine that already has Claude Code
claude install 2.1.89

# npm, if your CI already caches an npm store
npm install -g @anthropic-ai/claude-code@2.1.89
02

Stop it moving

export DISABLE_AUTOUPDATER=1
claude --version   # assert this in the job if you want to be strict

The channel you pass at install time also becomes the default for future auto-updates, so bash -s stable is the softer version of this: current, but a week behind the churn.

03

Bake it into the image

Reproducible by construction.
FROM node:22-bookworm-slim
ARG CLAUDE_VERSION=2.1.89
RUN npm install -g @anthropic-ai/claude-code@${CLAUDE_VERSION}
ENV DISABLE_AUTOUPDATER=1

The Dev Container Feature always installs the newest release, so an image that must be reproducible installs the CLI itself rather than relying on the feature.

Rolling back a bad release

Downgrade, then stop it climbing straight back.
# what exists
npm view @anthropic-ai/claude-code versions --json | tail -20

# go back, native install
claude install 2.1.88
export DISABLE_AUTOUPDATER=1

claude --version

On Homebrew, the equivalent move is to switch casks rather than to name a version: claude-code is the stable channel and is the closest thing to a rollback the cask offers. Homebrew keeps old versions on disk after upgrades, so run brew cleanup occasionally to reclaim the space.

Before you blame a release

Most "the update broke it" reports are one of five things, and four of them are answered in under a minute.

CheckCommandWhat a bad answer looks like
Which version am I on?claude --versionOlder than you expected; the update never landed
Is the install healthy?claude doctorA failed last update attempt, or an unmanaged launcher
Am I running the binary I think?which claudeA second install shadowing the one you updated
Is it the service, not the CLI?Check the Anthropic status pageAn open incident that explains everything
Did my config change?git diff on your settings, if versionedA setting you changed and forgot

Questions people ask

Run claude update. It works on every install method, including Homebrew, WinGet and the Linux package repositories, and reports either the version it moved you to or that you are already current.

Native installs do: they check at startup and periodically while running, install in the background, and apply the new version the next time you start. Homebrew, WinGet, apt, dnf and apk installs do not update automatically unless you opt in, which is accurate as of August 2026.

Set DISABLE_AUTOUPDATER to 1 in the env block of your settings.json. That stops the background check while leaving claude update and claude install working. To block manual updates as well, set DISABLE_UPDATES instead.

latest is the default and gives you every release as it ships. stable gives you a build typically about a week old, skipping releases with major regressions. Set autoUpdatesChannel in settings.json, or pick it in /config.

Run claude install 2.1.89, or pass the version to the installer as curl -fsSL https://claude.ai/install.sh | bash -s 2.1.89. Both accept stable or latest in place of a version number.

Install the earlier version explicitly and set DISABLE_AUTOUPDATER=1 in the same step, otherwise the background check updates forward again. If you set a minimumVersion floor, clear it first, because it refuses the downgrade.

claude --version prints it in the form 2.1.211 (Claude Code). Do this before reporting any bug, since the answer is often that the issue is already fixed in a newer release.

For CI and container images, yes: an agent that changes underneath a pipeline makes failures impossible to bisect. For laptops, prefer the stable channel over a hard pin, because a frozen install accumulates missing fixes and costs more debugging time than the churn it avoided.

Sources

Every figure above was read from these pages on August 2026. Vendors reprice without notice; if you find a stale number, tell us.

  1. Claude Code setup and install
  2. Claude Code CLI reference
  3. Claude Code settings reference
  4. Anthropic status
Try it

Versions change.
Spend shows it.

Continuum charts tokens and dollars by day, repo and provider across Claude Code and Codex, so a behaviour change has a date attached. Free app, your own subscriptions.

free app · your subscriptions · local-first