[BUG] Desktop SSH remote: CLI provisioning transfers far slower than the link allows, times out at 180s "Configuring machine"

Open 💬 1 comment Opened Jun 26, 2026 by TrigsC

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

  1. On macOS Claude Desktop, add an SSH remote host (key-based auth, passphrase-free key set in the Identity File field). Confirm ssh user@host works from Terminal.
  2. Connect to a remote that has never been provisioned before (no ~/.claude/remote/ccd-cli binary yet).
  3. Observe the desktop reach "Configuring machine..." and sit there.
  4. On the remote, watch ~/.claude/remote/ccd-cli/.fetch-* grow slowly (~0.3 MB/s).
  5. 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_

View original on GitHub ↗

This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗