claude update fails with GCS timeout, but direct curl download works

Resolved 💬 4 comments Opened Mar 23, 2026 by ahm3t0t Closed Apr 21, 2026

Bug Description

claude update fails with a 30-second timeout when trying to fetch the latest version from GCS, even though the same URL is reachable via direct curl.

Environment

  • OS: Ubuntu 24.04 (VPS)
  • Current version: 2.1.80 (native install)
  • Target version: 2.1.81
  • Install method: Native (curl -fsSL https://claude.ai/install.sh | bash)

Steps to Reproduce

  1. Run claude update
  2. Observe timeout error

Error Output

Current version: 2.1.80
Checking for updates to latest version...
Error: Failed to install native update
Error: Failed to fetch version from https://storage.googleapis.com/claude-code-dist-86c565f3-f756-42ad-8dfa-d59b1c096819/claude-code-releases/latest: timeout of 30000ms exceeded

Key Finding

The GCS bucket is reachable via direct curl:

# This works fine:
$ curl -fsSL https://storage.googleapis.com/claude-code-dist-86c565f3-f756-42ad-8dfa-d59b1c096819/claude-code-releases/latest
2.1.81

# Downloading the binary directly also works:
$ curl -fsSL -o /tmp/claude "https://storage.googleapis.com/claude-code-dist-86c565f3-f756-42ad-8dfa-d59b1c096819/claude-code-releases/2.1.81/linux-x64/claude"
# Successfully downloads ~227MB ELF binary

But the built-in updater (claude update) and the installer script (install.sh) both timeout at the version check step. This suggests the issue is in the internal HTTP client used by Claude Code (possibly Bun's fetch or a Node.js HTTP client), not a network connectivity problem.

Workaround

Manual native binary update:

# 1. Download the binary directly
VERSION="2.1.81"
PLATFORM="linux-x64"  # or linux-arm64, darwin-x64, darwin-arm64
curl -fsSL -o ~/.local/share/claude/versions/$VERSION \
  "https://storage.googleapis.com/claude-code-dist-86c565f3-f756-42ad-8dfa-d59b1c096819/claude-code-releases/$VERSION/$PLATFORM/claude"

# 2. Make it executable and update symlink
chmod +x ~/.local/share/claude/versions/$VERSION
ln -sf ~/.local/share/claude/versions/$VERSION ~/.local/bin/claude

# 3. Verify
claude --version

Suggestion

  • The 30s timeout may be too aggressive for some network conditions
  • Consider falling back to a system curl/wget download if the internal HTTP client fails
  • The install.sh script delegates to the Claude binary itself for the actual download — if the binary's internal HTTP client is the issue, the shell script could handle the download directly as a fallback

Additional Notes

  • The installer script (install.sh) also fails because it invokes the Claude binary to perform the download, which uses the same internal HTTP client
  • claude doctor requires interactive TTY and cannot be run in non-interactive mode for diagnostics
  • A 0-byte file was left at ~/.local/share/claude/versions/2.1.81 after the failed update attempt, which could confuse subsequent update checks

View original on GitHub ↗

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