The Claude Code setup I want is boring: one command, one owner, one update path.
On September 3, 2026, this machine looked like this:
$ command -v claude
/home/kahwee/.local/bin/claude
$ claude --version
2.1.231 (Claude Code)
claude doctor filled in the useful part. It reported a native installation, background updates enabled on the latest channel, and no installation issues.
Looking back The first version of this post drew the wrong line. I described the native installer as the way to remove Node from Claude Code itself. Anthropic now says its npm package installs the same platform-native binary; Node is part of that package’s installation path, not the CLI’s runtime. The reason I prefer the native installer is simpler ownership and updates.
Check which install wins
I wouldn’t start by uninstalling anything. First, find every copy that could win the PATH lookup:
which -a claude
ls -la ~/.local/bin/claude
ls -la ~/.claude/local/
npm -g ls @anthropic-ai/claude-code 2>/dev/null
The paths tell different stories. ~/.local/bin/claude is Anthropic’s native installer. ~/.claude/local/ is an older local npm installation. The npm listing catches a global package.
On my machine, ~/.local/bin/claude points into ~/.local/share/claude/versions/2.1.231, and the global npm check is empty. That is one installer owning one executable.
Windows uses the same idea with different commands. Run where.exe claude; the native executable normally lives at %USERPROFILE%\.local\bin\claude.exe.
Install the copy you plan to keep
For macOS, Linux, and WSL, Anthropic’s current native installer is:
curl -fsSL https://claude.ai/install.sh | bash
In Windows PowerShell:
irm https://claude.ai/install.ps1 | iex
Those commands install the latest channel. The native installer checks for updates in the background, and this applies one immediately:
claude update
Anthropic also offers a stable channel that usually trails by about a week and skips releases with major regressions. The current installation guide has the commands for stable, pinned versions, Homebrew, WinGet, apt, dnf, apk, and npm.
The update owner changes with the installation method. Native installs update through Claude Code. Homebrew, WinGet, and Linux package-manager installs require their package manager by default. npm updates through npm. Mixing those methods is how an old executable quietly stays ahead of the one you meant to run.
Remove only the copies you found
If the inventory showed a global npm install, remove that copy:
npm uninstall -g @anthropic-ai/claude-code
If it showed the legacy ~/.claude/local/ directory, remove that exact directory:
rm -rf ~/.claude/local
Homebrew and WinGet have their own uninstall commands. I would use the matching command from Anthropic’s conflicting-installations guide, then open a fresh terminal. Removing a package that wasn’t in the inventory fixes nothing.
Verify the result
Clear the shell’s remembered command location and check again:
hash -r
which -a claude
claude --version
claude doctor
The command is claude doctor, not claude /doctor. It runs read-only installation and settings checks without starting a session. /doctor belongs inside an interactive Claude Code session.
I care less about which installer wins an argument and more about knowing which installer owns the next update. Once that answer is obvious, installation is done. The harder part is deciding what I actually use Claude Code for.
One quick signal
Did this earn your time?
Thanks. That gives me something concrete to check.


