Native updater has no resume — on a metered connection, repeated failed 300 MB downloads cost tens of GB

Status Open
Reported on v2.1.228
Maintainer reply None cached
Activity 0 comments · opened Aug 15, 2026

Summary

The native updater downloads the ~300 MB binary in a single stream with no resume support. On a
slow connection it drops before finishing, and every retry starts from zero. Over the past month
this consumed tens of gigabytes of a limited data plan without a single successful update —
most of my monthly allowance.

$ claude update
Current version: 2.1.228
Checking for updates to latest version...
Updating to 2.1.233...
Error: Failed to install native update
TelemetrySafeError: Download timed out: exceeded the total deadline

Why this is expensive rather than just annoying

  1. No resume. A failure at 90% costs the full 300 MB again. Nothing is kept —

~/.claude/downloads/ is empty after a failure, and versions/<v> is left as a 0-byte file.

  1. No rate limit. The download saturates the link, latency spikes, and the connection then

times out — the downloader triggers the very failure that restarts it. It also makes the
machine unusable for work while it runs.

  1. No way to control how often this happens. Releases ship almost daily, and each one is a

full download — there are no delta updates, so a patch release costs the same ~290 MB as a
fresh install. From the release manifests, 7–14 Aug 2026:

| version | build date | darwin-x64 size |
|---------|-----------|-----------------|
| 2.1.225 | 2026-08-07 | 276 MB |
| 2.1.226 | 2026-08-08 | 276 MB |
| 2.1.227 | 2026-08-10 | 281 MB |
| 2.1.228 | 2026-08-11 | 285 MB |
| 2.1.229 | 2026-08-12 | 289 MB |
| 2.1.231 | 2026-08-13 | 289 MB |
| 2.1.232 | 2026-08-13 | 300 MB |
| 2.1.233 | 2026-08-14 | 301 MB |

(2.1.230 is omitted — its manifest is no longer served, so the real count is higher.)

That is 8 releases in 7 days — ~2.3 GB per week to stay current, and that is the
best case where every download succeeds. The binary also grew 276 → 301 MB in that week.
The only control available is DISABLE_AUTOUPDATER, which is all-or-nothing: either
download every release, or track releases manually and never get updates.

  1. No visibility. No progress, no ETA, no byte counter. On a metered plan you learn the cost

from your carrier.

With the auto-updater retrying in the background (see #79942), a machine left running overnight
can burn tens of GB without ever completing an update. The move to a ~300 MB native binary made
this dramatically worse — with the npm package this was never a problem.

The capability is already there

The release bucket supports range requests:

$ curl -sI https://downloads.claude.ai/claude-code-releases/2.1.233/darwin-x64/claude
HTTP/2 200
accept-ranges: bytes
content-length: 315654448

So resume is a Range header plus opening the target file for append — the server side needs no
change at all.

Requests

  1. Resumable downloads — keep the partial file and continue with Range instead of restarting.
  2. A bandwidth cap — a setting like updateMaxRate so the updater does not saturate a narrow link.
  3. Update policy settings, between "every release" and "never". Something like an update

frequency (check for updates every N days), a monthly data budget the updater will not
exceed, and an option to update only on unmetered networks. Users on limited plans do not
need every daily patch release — updating once or twice a week is fine, but today that
requires disabling updates entirely and watching the changelog by hand.

  1. Delta updates, if feasible — a patch release currently costs a full ~290 MB. This alone

would remove most of the problem.

  1. Visible progress — percentage, speed, ETA, and bytes transferred, so metered users can see

what an update costs while it happens rather than afterwards.

Environment

  • Claude Code 2.1.228 → 2.1.233, native install (installMethod: native)
  • macOS, x64
  • Metered connection on a limited data plan, frequent drops

Workaround

DISABLE_AUTOUPDATER=1 in settings.json stops the background bleed. For actually updating I
wrote a small resumable updater that fetches the same official binary from the same bucket and
verifies the manifest checksum: https://github.com/isisprog77/claude-update — with Range resume
and a rate cap, a 300 MB update finally completes over many short sessions. Sharing it as evidence
that the fix is cheap, not as a substitute for one.

View original on GitHub ↗