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

  1. Ensure you're on the latest version: claude --version → 2.1.19
  2. Run time claude update
  3. Observe it takes ~27 seconds despite being up-to-date

Expected Behavior

When already on the latest version:

  1. Check /latest endpoint → "2.1.19" (~0.3s)
  2. Compare with local version
  3. If same → "Already up to date" (done in <0.5s)

Actual Behavior

Even when versions match:

  1. Check /latest → "2.1.19" (~0.3s)
  2. Check /latest again (~0.2s) - redundant
  3. Fetch manifest.json (~0.1s)
  4. Download full 172MB binary (~24s)
  5. 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:

  1. GET /latest → get latest version string
  2. Compare with claude --version
  3. If same version → return immediately ("Already up to date")
  4. 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 update wastes ~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.

View original on GitHub ↗

This issue has 4 comments on GitHub. Read the full discussion on GitHub ↗