Installing Claude Code seems trivial, but behind it are several decisions that later affect reproducibility and updates. Officially supported are current versions of macOS, Windows and the main Linux distributions, x64 or ARM64 with a minimum of memory, one of the common shells and internet access from a supported country. It is worth understanding the requirements in advance: some first-run problems are not bugs but an unsupported environment.
The recommended way is native installation via the official install script: on macOS, Linux and WSL it is pulled with curl, on Windows via PowerShell or CMD. Right after installation you make two checks: claude --version answers "what is running", and claude doctor checks the installation itself, the validity of settings and known issues. The terminal doctor is read-only diagnostics; the in-session /doctor is already a bundled skill that can propose fixes.
There are package methods too - the Homebrew cask and WinGet - with their own update logic. The key difference: native installation updates itself in the background, while Homebrew, WinGet, apt, dnf and apk by default require updating through their package manager. For Homebrew and WinGet Claude Code can run the package update itself, but only if explicitly allowed by the CLAUDE_CODE_PACKAGE_MANAGER_AUTO_UPDATE variable. By default control stays with the manager.
The update channel is set consciously. In native installation the autoUpdatesChannel key accepts latest - new versions at once - or stable, which usually has about a week's delay and skips releases with major regressions. Next to it stands minimumVersion - a floor for updates: neither background auto-update nor claude update will install a version below it, so moving to stable does not downgrade you. It is easy to confuse with requiredMinimumVersion, which is a different thing: that key lives in managed settings only, does not constrain updates, and simply refuses to let Claude Code start on a version below the one given. For truly reproducible CI you rely not on the channel but on installing an explicit version or a pre-built image.
It helps to see the install commands and the channel setup side by side once. Below is the native script, the version and doctor checks, and a settings fragment with the channel and minimum version. You return to this map when setting up a new environment or switching between latest and stable: it shows exactly where the decision is made about which version runs for you.
Windows deserves separate attention because of the sandbox. Native Windows does not support sandboxed Bash: without Git for Windows Claude Code works through the PowerShell tool, and with Git for Windows the Bash tool appears. WSL2 supports sandboxing and is more convenient for a Linux toolchain, whereas WSL1 does not support the sandbox. If Git Bash is found somewhere other than expected, its path is set explicitly via the CLAUDE_CODE_GIT_BASH_PATH variable in settings.
Uninstalling is deliberately separated, and rightly so. Removing the binary does not remove user configuration: a reinstall must not destroy sessions and settings. So removing just the binary (rm from ~/.local/bin, brew uninstall, winget uninstall) is one action, and clearing configuration is quite another. The directories ~/.claude, ~/.claude.json, .claude/ and .mcp.json hold approvals, MCP, transcripts and project state, and deleting them is a separate destructive operation.
Hence a practical rule and typical failures. Do not delete configuration as part of an ordinary reinstall: a backup first, and for clearing one project's state there is claude project purge --dry-run. The typical mistakes are predictable: relying on the update channel instead of an explicit version in CI and getting different run behavior; forgetting that native Windows without Git for Windows gives no Bash tool; wiping ~/.claude together with the binary and losing approvals and sessions. Install consciously, pin the version explicitly, guard the configuration.
# Native installation (macOS, Linux, WSL)
curl -fsSL https://claude.ai/install.sh | bash
# Checks after installation
claude --version # what is running
claude doctor # installation, settings, known issues{
"$schema": "https://json.schemastore.org/claude-code-settings.json",
"autoUpdatesChannel": "stable",
"minimumVersion": "2.1.200"
}
// minimumVersion is an update floor, not a pin. For CI - an explicit version or image.
// requiredMinimumVersion is a different key: managed settings only, it blocks startup.