Native updater has no resume — on a metered connection, repeated failed 300 MB downloads cost tens of GB
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
- 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.
- 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.
- 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.
- 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
- Resumable downloads — keep the partial file and continue with
Rangeinstead of restarting. - A bandwidth cap — a setting like
updateMaxRateso the updater does not saturate a narrow link. - 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.
- Delta updates, if feasible — a patch release currently costs a full ~290 MB. This alone
would remove most of the problem.
- 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.