Desktop (macOS): Update button loops back to old version, ShipIt aborts with "App Still Running Error"
Summary
The in-app Update button on Claude Desktop for macOS downloads the update, shows "Updating", then relaunches the old version. Clicking Update again repeats the loop. The Squirrel installer (ShipIt) aborts because the app is still running when installation starts, and the app relaunches before the bundle is replaced.
Manual workaround: fully quit the app (Cmd+Q), wait a few seconds, reopen. The already-downloaded update then installs in about 10 seconds.
Environment
- Claude Desktop 1.46388.4 updating to 2.37337.1 (universal/arm64 feed)
- macOS 26.6.2 (25G83), Apple Silicon
- App installed in /Applications/Claude.app, owned by the user, no quarantine attributes
Steps to reproduce
- Open Claude Desktop 1.46388.4. Banner: "Claude Haiku 5.5 needs the latest desktop app to run on this computer. Update".
- Click Update. App restarts and shows the same banner with the same old version.
- Click Update again. Status changes to "Updating", then returns to the banner. Version unchanged.
Logs
~/Library/Logs/Claude/main.log:
[updater] Feed arch arm64 (probe answered 200)
[updater] Checking for updates
[updater] Found an update, downloading
[updater] Update downloaded and ready to install { releaseName: 'Claude 2.37337.1' }
~/Library/Caches/com.anthropic.claudefordesktop.ShipIt/ShipIt_stderr.log (second attempt):
10:38:49 ShipIt[81198] Detected this as an install request
10:39:02 ShipIt[81198] Beginning installation
10:39:19 ShipIt[81198] Aborting update attempt because there are 1 running instances of the target app
10:39:19 ShipIt[81198] Installation cancelled: Error Domain=SQRLInstallerErrorDomain Code=-9 "App Still Running Error" UserInfo={NSLocalizedDescription=App Still Running Error, NSLocalizedRecoverySuggestion=All instances of the target application should be quit during the update process}
Third attempt: ShipIt[81732] started at 10:40:00 and sat waiting while the app (pid 81214) kept running. After osascript -e 'quit app "Claude"':
10:41:17 ShipIt[81732] Installation completed successfully
/Applications/Claude.app then reports 2.37337.1. The downloaded bundle in update.*/Claude.app passed codesign --verify --deep --strict (TeamIdentifier Q6L2SF6YDW), so this is not a signature problem.
Expected
Update should quit all app processes before ShipIt installs, or tell the user to quit the app, instead of silently relaunching the old version.