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.
- 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.
minimumVersionis 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.
- Stop the updater. Otherwise everything after this is temporary.
- Install the version you want.
- Verify.
claude --versionshould print the exact version you asked for.
{
"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.
Disable auto-updates
Add the DISABLE_AUTOUPDATER block above to ~/.claude/settings.json, then quit any running session.
Install the version you want
claude install 2.1.89
It accepts latest and stable as well as an exact version.
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.
curl -fsSL https://claude.ai/install.sh | bash -s 2.1.89
& ([scriptblock]::Create((irm https://claude.ai/install.ps1))) 2.1.89
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.
{
"autoUpdatesChannel": "stable"
}
The two channels, checked August 2026.
| Channel | What it serves | Example version at time of writing |
|---|---|---|
latest (default) | Every release as soon as it ships | 2.1.224 |
stable | Roughly a week behind, regressions skipped | 2.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.
{
"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.
| Setting | What it does |
|---|---|
autoUpdatesChannel | Enforces one release channel across the organisation |
minimumVersion | Updates refuse to install below this. Does not stop Claude Code starting |
requiredMinimumVersion | Claude Code refuses to start below this |
requiredMaximumVersion | Refuses 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 --jsonlists every published version, including builds you never installed.npm view @anthropic-ai/claude-code dist-tagsshows whatlatestandstablecurrently resolve to.claude doctorreports 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.
# 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.
- Claude Code advanced setup release channels, version pinning, auto-update controls
- Claude Code CLI reference claude install and claude update
- @anthropic-ai/claude-code on npm published version history and dist-tags