[BUG] Desktop SSH remote: CLI provisioning transfers far slower than the link allows, times out at 180s "Configuring machine"
Preflight Checklist
- [x] I have searched existing issues and this hasn't been reported yet
- [x] This is a single bug report (please file separate reports for different bugs)
- [x] I am using the latest version of Claude Code
What's Wrong?
On macOS, the Desktop SSH remote feature fails to complete first-time setup. SSH auth and connection succeed and the server binary deploys, but the CLI provisioning step transfers at only ~0.3 MB/s and never finishes inside the 180s idle timeout, so setup dies at "Configuring machine..." on every attempt.
The transfer is slow only through the desktop's provisioning path — the link and the remote's internet are both fast:
| Path | Throughput |
|------|-----------|
| Remote → downloads.claude.ai (CDN direct) | 6.8 MB/s |
| Mac → server (raw SSH / dd benchmark) | 28 MB/s |
| Desktop CLI provisioning (observed) | ~0.3 MB/s |
The desktop appears to push the ~235 MB CLI from the Mac over SFTP at 0.3 MB/s instead of having the remote pull it directly (which runs at 6.8 MB/s). The deployed server binary already exposes a -cli-url flag ("Download URL for the CLI .zst") — a direct-fetch path that isn't being used.
Not a dup of #46845 (ccd-cli interactive first-run wizard crashing with exit 1 — instant failure, no download) or the handshake-timeout reports #32734 / #35073 / #48259 (those fail at auth/handshake; this one authenticates and connects successfully, then stalls on the CLI transfer).
What Should Happen?
Provisioning should either (a) have the remote fetch the CLI directly via the existing -cli-url path (~6.8 MB/s, completes in well under the timeout), or (b) not let a slow-but-progressing transfer hit the idle reaper — e.g. a progress-aware timeout instead of a flat 180s idle cutoff. A multi-hundred-MB download pushed at 0.3 MB/s cannot finish in 180s, so setup should not depend on it doing so.
Error Messages/Logs
From ~/Library/Logs/Claude/ssh.log — repeated identical timeouts:
[RemoteServerController] Connection failed (201097ms): SSH connection setup timed out during "deploying: Configuring machine..." (idle 180003ms)
[RemoteServerController] Connection failed (181800ms): SSH connection setup timed out during "deploying: Configuring machine..." (idle 180000ms)
[RemoteServerController] Connection failed (182420ms): SSH connection setup timed out during "deploying: Configuring machine..." (idle 180001ms)
[RemoteServerController] Connection failed (181843ms): SSH connection setup timed out during "deploying: Configuring machine..." (idle 180001ms)
[RemoteServerController] Connection failed (181723ms): SSH connection setup timed out during "deploying: Configuring machine..." (idle 180001ms)
On the remote, the CLI sat as a partial download growing at ~0.3 MB/s:
~/.claude/remote/ccd-cli/.fetch-XXXXXXXX
(sampled twice: 178823168 → 179695616 bytes over 3s ≈ 0.28 MB/s)
It eventually completed to ~/.claude/remote/ccd-cli/2.1.187 (234874664 bytes) only by letting attempts accumulate the partial rather than restarting.
Throughput measurements taken the same session:
- Remote → CDN direct (curl): 7166865 bytes/sec ≈ 6.8 MB/s
- Mac → server (dd, 50MB in 1.77s): ≈ 28 MB/s
- Desktop provisioning (.fetch file growth): ≈ 0.3 MB/s
Steps to Reproduce
- On macOS Claude Desktop, add an SSH remote host (key-based auth, passphrase-free key set in the Identity File field). Confirm
ssh user@hostworks from Terminal. - Connect to a remote that has never been provisioned before (no ~/.claude/remote/ccd-cli binary yet).
- Observe the desktop reach "Configuring machine..." and sit there.
- On the remote, watch ~/.claude/remote/ccd-cli/.fetch-* grow slowly (~0.3 MB/s).
- After ~180s of idle, the desktop aborts with the "Configuring machine..." timeout above. Repeats on every reconnect.
Confirmed not network/server-bound: the remote pulls from downloads.claude.ai at 6.8 MB/s and the Mac↔server SSH channel benchmarks at 28 MB/s, yet provisioning runs at 0.3 MB/s.
Workaround: keep a session pointed at the connection and let the partial in .fetch-* accumulate across attempts until it completes; once cliWasPresent is true, later connects skip provisioning and succeed.
Claude Model
None
Is this a regression?
I don't know
Last Working Version
_No response_
Claude Code Version
Claude 1.15962.0 (039543) emote CLI that installed: 2.1.187. Remote server build: d20a77da22b7d4822f758654b226299ad7021c22]
Platform
Other
Operating System
macOS
Terminal/Shell
iTerm2
Additional Information
_No response_
This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗