claude update downloads full binary even when already up-to-date (~27s vs ~0.5s)
Resolved 💬 4 comments Opened Jan 25, 2026 by danielmstoffel Closed Feb 28, 2026
Summary
claude update downloads the entire binary (~172-232MB depending on platform) every time it runs, even when the user is already on the latest version. This makes a simple version check take ~27 seconds instead of <1 second.
Environment
- Claude Code version: 2.1.19
- Platform: macOS (darwin-arm64)
- Binary size: 172MB
Steps to Reproduce
- Ensure you're on the latest version:
claude --version→ 2.1.19 - Run
time claude update - Observe it takes ~27 seconds despite being up-to-date
Expected Behavior
When already on the latest version:
- Check
/latestendpoint → "2.1.19" (~0.3s) - Compare with local version
- If same → "Already up to date" (done in <0.5s)
Actual Behavior
Even when versions match:
- Check
/latest→ "2.1.19" (~0.3s) - Check
/latestagain (~0.2s) - redundant - Fetch
manifest.json(~0.1s) - Download full 172MB binary (~24s)
- Verify checksum (~2s)
Total: ~27 seconds
Evidence
Timing breakdown
$ time claude update
Current version: 2.1.19
Checking for updates to latest version...
Claude Code is up to date (2.1.19)
real 0m26.887s (13% CPU - mostly network I/O wait)
Direct API timing
$ time curl -s "https://storage.googleapis.com/.../latest"
2.1.19
real 0m0.343s
Binary download timing
$ time curl -s -o /dev/null "https://storage.googleapis.com/.../darwin-arm64/claude"
Size: 180852080 bytes
Time: 24.28s
Checksums match (no download needed)
Expected: d386ac8f6d1479f85d31f369421c824135c10249c32087017d05a5f428852c41
Actual: d386ac8f6d1479f85d31f369421c824135c10249c32087017d05a5f428852c41
Suggested Fix
The manifest already contains checksums and sizes:
{
"version": "2.1.19",
"platforms": {
"darwin-arm64": {
"checksum": "d386ac8f...",
"size": 180852080
}
}
}
Proposed logic:
GET /latest→ get latest version string- Compare with
claude --version - If same version → return immediately ("Already up to date")
- If different → fetch manifest → download binary → verify checksum
Alternative: Use HTTP HEAD request with If-None-Match/ETag headers to let the CDN return 304 Not Modified.
Impact
- Every user running
claude updatewastes ~25 seconds and ~172MB of bandwidth - Users on metered connections download unnecessary data
- Poor UX discourages checking for updates
Workaround
Users can check manually:
# Fast version check (~0.5s)
curl -s "https://storage.googleapis.com/claude-code-dist-86c565f3-f756-42ad-8dfa-d59b1c096819/claude-code-releases/latest"
Then only run claude update if versions differ.
This issue has 4 comments on GitHub. Read the full discussion on GitHub ↗