Desktop auto-update ("stealth update") quits and relaunches the app while the user is away, dropping every Remote Control session
Environment
- Claude Desktop 2.2553.1 (macOS 26.6.2, Apple Silicon)
- Bundled Claude Code 2.1.275
- Remote Control in use daily from
claude.ai/codewhile away from the machine
Summary
When an update is staged, the app waits for a short idle window and then quits and relaunches itself. It logs this as [stealth-update]. The relaunch stops every running Code session and drops each session's Remote Control link.
For a user sitting at the machine this is nearly invisible, which is presumably the intent. For a user working remotely it is the opposite of invisible: the restart fires precisely when nobody is at the keyboard, which is exactly when Remote Control is the only way in. Every time I open my laptop while travelling, Remote Control has disconnected and the app has restarted itself.
What the app logs
From ~/Library/Logs/Claude/main.log, one complete cycle:
09:47:53 [info] [updater] Update downloaded and ready to install { releaseName: 'Claude 2.2553.1' }
10:21:28 [info] [stealth-update] Triggering stealth update after idle timeout
10:21:28 [info] [remote-tools-device] close
10:21:28 [info] [CCD] Stopping 3 active session(s) on quit
10:21:30 [info] [CCD] CLI exit before update: 3 of 3 exited within 1772ms
10:21:31 [info] beforeQuitForUpdate handler fired, going down for update
10:21:54 [info] Starting app { ... }
10:21:54 [info] [updater] Version changed since last launch: 2.2553.0 → 2.2553.1
Squirrel's own log for the same moment (~/Library/Caches/com.anthropic.claudefordesktop.ShipIt/ShipIt_stderr.log):
10:21:31 Beginning installation
10:21:40 Moved bundle contents ... to file:///Applications/Claude.app/
10:21:49 Successfully launched application at file:///Applications/Claude.app/
Trigger conditions
The updater's own gate lists four things that block a stealth update:
- the same version having failed to install repeatedly
- an actively running session
- the window being focused
- the window being fullscreen
None present → a timeout starts, and the update fires when it elapses. Measured on this machine: the update was staged at 09:47:53, the last session activity was at 10:11:39, and the update fired at 10:21:28 — roughly ten minutes after the machine went quiet.
Those three blockers are exactly the conditions that are absent for a remote user. An idle-but-connected Remote Control session is, from the updater's point of view, indistinguishable from an abandoned machine.
Regression window and frequency
Every Triggering stealth update across all retained logs on this machine:
2026-08-27 04:43:59
2026-08-28 19:24:07
2026-09-01 22:06:16
2026-09-03 07:39:40
2026-09-08 22:03:42
2026-09-15 22:23:46
2026-09-17 07:35:19
2026-09-18 03:46:49
2026-09-18 10:21:28
The oldest retained log begins 2026-08-12 and contains no stealth updates before 2026-08-27. So the behaviour appears to have started around 27 August, and the rate has risen since: nine restarts in 22 days, two of them on a single day.
Impact
- Every running Code session is stopped mid-flight.
- Per-session Remote Control connections are dropped and do not come back after the relaunch, even with "Connect new sessions to Remote Control" set to On — restored sessions are not treated as new. (The device-level bridge does reconnect on its own; it is the per-session links that are lost.)
- MCP servers are torn down and some fail to reconnect on the way back up, producing a cluster of error notifications on each relaunch.
- The user has no way to know it happened until they try to reconnect and find the session gone.
Suggested fixes, in order of preference
- Add "any session connected to Remote Control" to the blocker list. A machine with a live Remote Control link is not idle; someone is just not physically present. This alone would resolve the reported problem.
- Re-establish per-session Remote Control after a stealth relaunch. The app already restores navigation history and window state across the relaunch, so the session identifiers are available.
- Offer a user setting to defer stealth updates, comparable to the existing keep-awake and notification preferences. There is currently no supported way to turn this off or postpone it.
Fix 1 is the smallest and addresses the asymmetry directly: the feature is named for being unobtrusive, and the one class of user it obtrudes on is the one who cannot see the machine.
Showing cached comments. Read the full discussion on GitHub ↗
3 Comments
Still reproduces on the latest build: Claude Desktop 2.2553.13 → 2.7032.0 (bundled Claude Code 2.1.280), macOS 26, on 2026-09-22. I was driving 9 local Code sessions from the iOS app, and every one of them showed as closed on the phone at the same moment.
A detail from the 2.7032.0 bundle that may help with fix 1: the gate already has a
remote_clientactivity kind, but it's narrower than it looks.sessionActivityKind()returns"remote_client"only whenremoteControlSpawnis set (the session was started from a remote device) and a process is live. Sessions started on the desktop with Remote Control on, including ones auto-enabled by "Connect new sessions to Remote Control", fall through to theturncheck and count as idle between turns.losableWorkKind()does countremoteControlEnabled && !remoteControlAutoEnabledas"remote_control". But the stealth updater goes throughrestartLosesWorkKind()→sessionActivityKind(), so it never sees that either. Broadening theremote_clientcheck to any session with a live bridge looks like the smallest fix.Confirming this on macOS — Claude Desktop 2.7032.0 (Code tab). A silent
"stealth" auto-update on idle quits and relaunches the app while I'm away, and
Remote Control is not restored afterward, so every session drops off the
phone (Disconnected → Archived) and can't be revived remotely.
main.logfrom the event:After the relaunch the sessions are restored, but there is no subsequent
Enabling remote controlline until I manually reopen a session at the Machours later — i.e. RC re-arms on session focus/open, not on the post-update
background restore. From the user's side the window comes back visible, so it
looks like the app never restarted, which makes the drop invisible and hard to
diagnose.
Repro
steerable from the phone.
(
[stealth-update] Triggering stealth update after idle timeout).bridge is not re-armed; the phone shows those sessions Disconnected/Archived
with no way to revive them remotely.
Impact: Remote Control is unusable for exactly its main use case (stepping
away and steering from the phone), because an unattended auto-update reliably
severs it and it never comes back on its own.
Requested fix: after a stealth-update relaunch, automatically re-arm Remote
Control for any session that had it enabled (restore the RC hold), and/or defer
the stealth update while sessions are actively hosting Remote Control.
(Looks like the same root cause as #95491, #95276, #92207 and #92010 — might be
worth consolidating these.)
This be crazyyyyyy
"Use our desktop app" for remote work JK JK