A lightweight Windows wrapper that turns the claude command into a version chooser — keeping a pinned stable version for daily work while giving you instant access to the latest release.
PS> claude
Choose Claude Code version:
1) v2.1.110 Pinned daily-work version
2) latest Current installed version
d) doctor Diagnostics
h) help Help
q) quit
Choose:
Anthropic ships Claude Code updates frequently. New versions bring access to newer models (e.g. Opus 4.7 requires v2.1.111+), but a recurring pattern in the Claude Code community is that certain updates change agentic behaviour in ways that feel less reliable for complex, multi-step work — things like long-horizon planning, context management across large codebases, following multi-part instructions without drift, and unexpectedly high token consumption within a single session.
v2.1.110 — best all-around. The last release before Opus 4.7 (introduced in v2.1.111), with all security and stability fixes from April 7–15 included. The effort default is high from v2.1.94, but /effort medium restores lighter behavior. Recommended for users who want a mature, well-tested binary without the Opus 4.7 transition and without sacrificing security hardening.
Important nuance: a majority of "worse planning / lazier / heavier" complaints in the community are actually tied to model and serving changes on Anthropic's side — changes that affect all CLI versions equally and cannot be avoided by pinning any specific binary. The CLI version controls defaults and tooling; it does not pin the model's reasoning behaviour. No pinned CLI version is a guarantee against model-level regressions.
This picker makes it easy to keep your preferred stable binary for day-to-day work while having the latest version available for when you need newer models or features — without any manual PATH swapping or re-installing.
Two files — claude.cmd and claude.ps1 — live in a folder placed first in your PATH. When you type claude, Windows finds the picker before the real binary, shows the menu, then launches whichever version you chose. The two versions live at completely separate paths and never interfere with each other.
- Windows — CMD or PowerShell (this tool is Windows-only)
- Git for Windows — recommended by Anthropic for Claude Code on Windows
- Claude Code installed at
%USERPROFILE%\.local\bin\claude.exe(the default native install path) - A saved copy of the older Claude Code version you want to pin (see Setup)
git clone https://github.com/REPOZY/claude-version-picker.git C:\Tools\claude-version-pickerYou can clone to any folder. The examples below use C:\Tools\claude-version-picker — adjust the path throughout if you choose differently.
You need a standalone .exe for the version you want to freeze. Place it in the versions\ folder as either:
versions\claude-v2.1.110.exe— versioned name (auto-detected, label shown in menu)versions\claude-old.exe— generic name (also auto-detected)
Option A — you already have the version installed right now
# Save your current install as the pinned binary
Copy-Item "$env:USERPROFILE\.local\bin\claude.exe" "C:\Tools\claude-version-picker\versions\claude-old.exe"
# Then update to the latest
irm https://claude.ai/install.ps1 | iex
# If the latest binary still reports the old version, force it
& "$env:USERPROFILE\.local\bin\claude.exe" install latest --forceThen skip to Step 3.
Option B — you need to retrieve a specific older version from scratch
# 1. Temporarily install the version you want to pin
# See the Why section above for guidance on which version to choose
& ([scriptblock]::Create((irm https://claude.ai/install.ps1))) -Target 2.1.110
# 2. Verify the version is correct before copying
& "$env:USERPROFILE\.local\bin\claude.exe" --version
# 3. Copy it to the versions folder (use the version number in the filename)
Copy-Item "$env:USERPROFILE\.local\bin\claude.exe" "C:\Tools\claude-version-picker\versions\claude-v2.1.110.exe"
# 4. Reinstall the latest
irm https://claude.ai/install.ps1 | iex
# 5. If the latest binary still reports the old version, force it
& "$env:USERPROFILE\.local\bin\claude.exe" install latest --forceThe
--forcestep in (5) is needed whenDISABLE_AUTOUPDATER=1is set in your Claude Codesettings.json. Without it the bootstrap reports success but the binary on disk is not replaced.
The picker folder must appear before %USERPROFILE%\.local\bin in your user PATH so Windows finds it first.
$pickerPath = 'C:\Tools\claude-version-picker' # adjust if you used a different folder
$current = [Environment]::GetEnvironmentVariable('Path', 'User')
if (-not (($current -split ';') -contains $pickerPath)) {
[Environment]::SetEnvironmentVariable('Path', "$pickerPath;$current", 'User')
Write-Host "PATH updated. Open a new terminal to apply."
} else {
Write-Host "Already in PATH."
}Close all open CMD and PowerShell windows after running this.
Open a fresh terminal and run all four checks:
where.exe claude # picker folder must appear first in the list
claude doctor # both binaries must be found with correct versions
claude old --version # must show your pinned version
claude latest --version # must show your current latest version
Then run claude to see the chooser menu.
claude Show the version picker menu
claude old Launch the pinned version directly (skip menu)
claude latest Launch the latest version directly (skip menu)
Any unrecognised arguments are passed through to the latest binary unchanged:
claude chat "hello" → runs: <latest binary> chat "hello"
claude --help → runs: <latest binary> --help
| Command | Description |
|---|---|
claude |
Show version picker menu |
claude old |
Launch pinned version directly |
claude latest |
Launch latest version directly |
claude doctor |
Show paths and detected versions for both binaries |
claude help |
Show help text |
The pinned binary in versions\ never changes automatically. The "latest" slot always reflects whatever is at %USERPROFILE%\.local\bin\claude.exe.
To update to a newer Claude Code release:
irm https://claude.ai/install.ps1 | iexIf you have DISABLE_AUTOUPDATER=1 in your settings.json, add --force:
& "$env:USERPROFILE\.local\bin\claude.exe" install latest --forceThe picker picks up the updated binary automatically — no other changes needed.
Two environment variables let you override the auto-detected paths:
| Variable | Purpose |
|---|---|
CLAUDE_SWITCHER_OLD |
Full path to your pinned binary |
CLAUDE_SWITCHER_LATEST |
Full path to your latest binary |
Set them for a single session:
$env:CLAUDE_SWITCHER_OLD = 'D:\backups\claude-v2.1.110.exe'Or add them permanently via System Properties → Environment Variables.
Pinned ("old") — first match wins:
CLAUDE_SWITCHER_OLDenvironment variable- First
versions\claude-v*.exefile found (sorted alphabetically) versions\claude-old.exe%APPDATA%\npm\claude.cmd(legacy npm install fallback)
Latest — first match wins:
CLAUDE_SWITCHER_LATESTenvironment variable%USERPROFILE%\.local\bin\claude.exe← default native install path%LOCALAPPDATA%\Claude Code\claude.exe
claude launches without showing the menu
The picker is not first in PATH. Run where.exe claude — if the picker folder is not the first result, re-run Step 3 and open a fresh terminal.
"Pinned binary not found" error
No matching file was found in versions\. Check that your binary is named claude-old.exe or claude-v<version>.exe and is inside the versions\ folder.
Latest binary still shows old version after reinstalling
Run & "$env:USERPROFILE\.local\bin\claude.exe" install latest --force. This happens when DISABLE_AUTOUPDATER=1 is set.
Diagnostics
Run claude doctor — it shows the exact paths and versions the picker has resolved, plus the output of where.exe claude.
The picker is entirely self-contained — removing it restores your terminal to using Claude Code directly, and your Claude Code installations are not touched at any point.
Step 1 — Remove the picker folder from PATH
$pickerPath = 'C:\Tools\claude-version-picker' # adjust if you used a different folder
$current = [Environment]::GetEnvironmentVariable('Path', 'User')
$updated = ($current -split ';' | Where-Object { $_ -ne $pickerPath }) -join ';'
[Environment]::SetEnvironmentVariable('Path', $updated, 'User')
Write-Host "Removed from PATH. Open a new terminal to apply."Close all open CMD and PowerShell windows after running this.
Step 2 — Optionally save your pinned binary elsewhere
The versions\ folder contains your pinned binary (e.g. claude-v2.1.110.exe). If you want to keep it as a backup before deleting the folder, copy it somewhere safe first:
Copy-Item 'C:\Tools\claude-version-picker\versions\claude-v2.1.110.exe' "$env:USERPROFILE\Desktop\claude-v2.1.110.exe"Skip this step if you don't need the backup.
Step 3 — Delete the picker folder
Remove-Item -Recurse -Force 'C:\Tools\claude-version-picker'Step 4 — Verify
Open a fresh terminal and run:
where.exe claude
It should now show only your Claude Code install at %USERPROFILE%\.local\bin\claude.exe. Running claude will launch Claude Code directly, with no version menu.