Downgrade Claude Code, and make the downgrade stick

A release broke something and you want the previous build back. The commands are simple; the part that catches people is that a native install updates itself in the background, so an unpinned downgrade quietly reverses itself within the hour.

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

Disable the auto-updater first with DISABLE_AUTOUPDATER in settings.json, then install the version you want: claude install 2.1.89 for a native install, npm install -g @anthropic-ai/claude-code@2.1.89 for npm. Homebrew and WinGet have no clean version pin, so switch those to the native installer. If you only want fewer regressions rather than a specific old build, switch to the stable channel instead.

What you need to know
  • Disable auto-updates before downgrading, or the update runs and undoes it.
  • Native: claude install 2.1.89. The installer takes a version or a channel.
  • npm: npm install -g @anthropic-ai/claude-code@2.1.89.
  • Often you want the stable channel, not a downgrade: about a week behind, regressions skipped.
  • minimumVersion is a floor, not a pin. It stops downgrades; it does not stop upgrades.

Why the downgrade did not stick

Native installations check for updates at startup and periodically while running, download in the background, and apply the new version the next time you start Claude Code. That is excellent default behaviour and exactly wrong when you are deliberately sitting on an older build. Install 2.1.89 without touching anything else and the updater treats it as a machine that has fallen behind.

So the order matters, and it is always the same three steps.

  1. Stop the updater. Otherwise everything after this is temporary.
  2. Install the version you want.
  3. Verify. claude --version should print the exact version you asked for.
Step one. ~/.claude/settings.json
{
  "env": {
    "DISABLE_AUTOUPDATER": "1"
  }
}

Native install

The native installer accepts a version number or a channel name, both at first install and afterwards through claude install.

01

Disable auto-updates

Add the DISABLE_AUTOUPDATER block above to ~/.claude/settings.json, then quit any running session.

02

Install the version you want

claude install 2.1.89

It accepts latest and stable as well as an exact version.

03

Verify

claude --version    # prints e.g. 2.1.89 (Claude Code)
claude doctor       # reports install health and the last update attempt

If claude is not currently runnable at all, because the broken release is broken enough to not launch, go through the install script instead, which takes the same argument.

macOS, Linux, WSL.
curl -fsSL https://claude.ai/install.sh | bash -s 2.1.89
Windows PowerShell. The script has to be turned into a scriptblock to take an argument.
& ([scriptblock]::Create((irm https://claude.ai/install.ps1))) 2.1.89
Windows CMD.
curl -fsSL https://claude.ai/install.cmd -o install.cmd && install.cmd 2.1.89 && del install.cmd

npm, Homebrew, and WinGet

npm

npm downgrades are the straightforward case, because the registry keeps every published version. At the time of writing there were 476 of them.

# list what exists, newest last
npm view @anthropic-ai/claude-code versions --json | tail -20

# what the dist-tags currently point at
npm view @anthropic-ai/claude-code dist-tags

# install an exact version
npm install -g @anthropic-ai/claude-code@2.1.89
claude --version

Homebrew

Homebrew casks do not offer a clean historical version pin. What they do offer is a channel choice by cask name: claude-code tracks stable and claude-code@latest tracks latest. If you are on the latest cask and hit a regression, moving to the stable cask is the supported move and is usually what you actually wanted.

brew uninstall --cask claude-code@latest
brew install --cask claude-code
claude --version

For an exact older build, uninstall the cask and use the native installer with a version argument instead. Mixing a pinned native install with an unpinned Homebrew cask on the same machine gives you two binaries and an unpredictable winner on PATH.

WinGet

winget install Anthropic.ClaudeCode --version 2.1.89

WinGet only serves versions that are still in its manifest history, so an old enough build may simply not be offered. The native installer has no such limit.

What you probably want instead: the stable channel

Most downgrades are not really "I need 2.1.89", they are "I keep getting bitten by new releases". There is a supported setting for exactly that. The stable channel serves a version that is typically about a week old and skips releases with major regressions. You stay current, just behind the wave.

~/.claude/settings.json. Or set it through /config, Auto-update channel.
{
  "autoUpdatesChannel": "stable"
}

The two channels, checked August 2026.

ChannelWhat it servesExample version at time of writing
latest (default)Every release as soon as it ships2.1.224
stableRoughly a week behind, regressions skipped2.1.220

The channel is honoured by background auto-updates and by claude update. Homebrew is the exception: there the channel is chosen by which cask you installed, not by this setting.

A floor set explicitly.
{
  "autoUpdatesChannel": "stable",
  "minimumVersion": "2.1.100"
}

Pinning a version range for a team

Individual settings are advisory. If the point is that nobody on the team runs a build you have not qualified, the enforcing mechanism is managed settings, which user and project settings cannot override.

SettingWhat it does
autoUpdatesChannelEnforces one release channel across the organisation
minimumVersionUpdates refuse to install below this. Does not stop Claude Code starting
requiredMinimumVersionClaude Code refuses to start below this
requiredMaximumVersionRefuses to start above this, and updates respect the ceiling

The pair to reach for when qualifying a release is requiredMinimumVersion and requiredMaximumVersion, because they constrain what actually runs rather than only what updates. A minimumVersion floor on its own will happily let the whole fleet move forward past the build you tested.

Finding the version you want, and getting back

You need a version number before any of this is useful, and Claude Code does not print a changelog at you.

  • npm view @anthropic-ai/claude-code versions --json lists every published version, including builds you never installed.
  • npm view @anthropic-ai/claude-code dist-tags shows what latest and stable currently resolve to.
  • claude doctor reports the result of the most recent update attempt, which tells you what you were on before it moved.
  • On macOS and Linux, ls ~/.local/share/claude/versions/ lists the builds still on disk, and a custom launcher keeps all of them.
Going back to current when the regression is fixed.
# 1. remove the pin from ~/.claude/settings.json (DISABLE_AUTOUPDATER, minimumVersion)
# 2. then
claude update
claude --version

Questions people ask

Disable the background updater by setting DISABLE_AUTOUPDATER to "1" in the env block of ~/.claude/settings.json, then run claude install 2.1.89 with the version you want. Verify with claude --version.

Native installations check for updates at startup and periodically while running, then apply them on the next start. An unpinned downgrade is treated as a machine that has fallen behind. Set DISABLE_AUTOUPDATER before you downgrade, not after.

npm install -g @anthropic-ai/claude-code@2.1.89, substituting the version you want. Use npm view @anthropic-ai/claude-code versions --json to see what exists.

Not to an arbitrary old version. Homebrew offers a channel choice instead: the claude-code cask tracks stable and claude-code@latest tracks latest. For an exact older build, uninstall the cask and use the native installer with a version argument.

minimumVersion is a floor for updates: nothing installs below it, but Claude Code still starts on any version. requiredMinimumVersion makes Claude Code refuse to start outside the range, and pairs with requiredMaximumVersion as a ceiling.

Set DISABLE_AUTOUPDATER to "1" in the env block of settings.json to stop the background check while leaving claude update working, or DISABLE_UPDATES to block every update path including the manual ones.

Switch channels unless you need one specific build. Setting autoUpdatesChannel to "stable" keeps you roughly a week behind and skips releases with major regressions, which is what most people wanting a downgrade actually want.

Remove DISABLE_AUTOUPDATER and any minimumVersion pin from settings.json, then run claude update. On npm, npm install -g @anthropic-ai/claude-code@latest, not npm update -g.

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 advanced setup release channels, version pinning, auto-update controls
  2. Claude Code CLI reference claude install and claude update
  3. @anthropic-ai/claude-code on npm published version history and dist-tags
Try it

Know what
changed.

Continuum records model, effort, and spend per session, so a behaviour change after an update is measurable rather than a hunch.

free app · your subscriptions · local-first