[BUG] Windows: "Another program is using this file" after in-app update — happens even when quitting cleanly from the system tray (1.25927.0.0 → 1.26832.0.0)
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?
Updating the Claude desktop app on Windows fails with a Windows system dialog,
and the app then refuses to launch at all until I log off or reboot.
The key detail: this happens even when I quit Claude properly from the system
tray first. On my most recent occurrence I right-clicked the tray icon → Quit,
waited, relaunched Claude, then ran the update. It still failed. The normal way
of closing the app does not release whatever is holding the lock.
This is my second occurrence — the previous one was on 1.25927.0.0.
Impact: a reboot is not a minor inconvenience. Every occurrence forces me to
close every open application, lose unsaved state and window layout, interrupt
work in progress, and spend several minutes rebuilding my environment — all
triggered by accepting an update the app itself prompted me to install. There is
no user-side action that reliably prevents it, so the cost is unpredictable and
outside my control. The pattern this teaches is to postpone updates
indefinitely, which is the opposite of what you want.
Steps to reproduce:
- Run Claude desktop on Windows (MSIX / WindowsApps install)
- Quit Claude from the system tray icon
- Relaunch Claude
- Accept the available update (1.25927.0.0 → 1.26832.0.0)
- Windows error dialog appears; Claude does not relaunch
- Relaunching from Start Menu or taskbar produces the same dialog every time
Only logging out of Windows or rebooting recovers it.
Environment: Windows (zh-TW locale), MSIX package install at C:\Program Files\WindowsApps\Claude_...
Related: #61115, #66497, #53247, #73107
What Should Happen?
The updater should wait for the previous package's processes and AppX container
to fully release before activating the new version — or detect and clear the
stale container — so the app relaunches without user intervention.
Quitting from the tray should also terminate all child processes, so that a
clean quit is actually clean.
At minimum, the error message should be replaced. The raw Win32 string sends
users hunting for a file lock that doesn't exist. Something like "Claude
couldn't start because a previous version is still shutting down — try signing
out of Windows and back in" would at least point at a working recovery step.
Error Messages/Logs
[Window Title]
C:\Program Files\WindowsApps\Claude_1.26832.0.0_...
[Content]
其他程式正在使用這個檔案。
(English: Another program is currently using this file.)
Steps to Reproduce
- Run Claude desktop on Windows (installed as MSIX package under
C:\Program Files\WindowsApps\)
- Right-click the system tray icon → Quit, and wait for the app to fully close
- Relaunch Claude from the Start Menu
- Accept the update prompt (1.25927.0.0 → 1.26832.0.0)
- The app closes to apply the update
- A Windows system dialog appears instead of the app relaunching:
"其他程式正在使用這個檔案。" ("Another program is currently using this file.")
- Claude does not restart
- Attempt to launch Claude again from the Start Menu, the taskbar, or by
double-clicking the app — every method produces the same dialog
- The app remains completely unlaunchable until logging out of Windows or
rebooting
Note: step 2 is the part I want to highlight. I closed the app the correct way
before updating and it made no difference.
Claude Model
None
Is this a regression?
I don't know
Last Working Version
_No response_
Claude Code Version
N/A — this report is about the Claude desktop app, not the Claude Code CLI. The CLI is not installed on this machine (claude --version → command not found). Desktop app versions involved: 1.25927.0.0 → 1.26832.0.0 (MSIX package).
Platform
Anthropic API
Operating System
Windows
Terminal/Shell
Windows Terminal
Additional Information
_No response_
Showing cached comments. Read the full discussion on GitHub ↗
3 Comments
Update — identified what holds the lock (Resource Monitor evidence)
I traced the file lock with Resource Monitor (CPU → Associated Handles, searched "Claude"). The processes holding open handles to the update folder are claude.exe itself — multiple child processes with different PIDs (at least 9 at once), not antivirus, Windows Search, or Explorer. No non-Claude process appears in the results.
All of them hold handles to files under the new package's
appfolder, e.g.:So this confirms the root cause: quitting from the tray does not terminate Claude's Electron child processes; they keep the WindowsApps
appdirectory locked, and the MSIX update can't swap the files. A reboot only "works" because it's the only thing that kills the orphaned processes.Workaround that avoids a reboot:
taskkill /F /IM claude.exe /Tto force-kill the whole process tree, then relaunch — the update then applies cleanly. But users shouldn't have to do this; a clean quit should already terminate every child process, or the updater should kill/await them before swapping files.Environment: Windows (zh-TW locale), MSIX package at C:\Program Files\WindowsApps\Claude_...
I am experiencing what appears to be the same issue with Claude Desktop version
1.26832.0.0, but I found another reproducible trigger: it happens when the browser is opened from within Claude Code.Before triggering the problem, I run:
The package status is normal:
Then, when Claude Code opens the browser, Claude Desktop closes unexpectedly.
Immediately afterward, running the same PowerShell command shows:
This seems significant because the browser launch is not only causing Claude Desktop to terminate—it is also changing the Windows MSIX package state from
OktoModified, NeedsRemediation.This may indicate that opening the browser triggers a child process, file modification, or package-container conflict that leaves the Claude Desktop installation in an invalid state.
It would be useful to investigate:
NeedsRemediation;Environment:
1.26832.0.0Another data point, plus an answer to the "Is this a regression? I don't know" field — it is, and the boundary is measurable.
I hit a milder variant of this on the same package family: the dialog appears and the app does not come back, but it is launchable again immediately from the Start Menu. No logoff, no reboot. So the persistent-container case in this report and my transient case may share a symptom but not a root cause — details below, in case that split is useful for triage.
The measurement
The app logs both halves of the update restart to
%APPDATA%\Claude\logs\main.log:The gap between those two timestamps is a clean pass/fail signal. The self-restart takes ~32 s consistently. When it fails, a human has to click, so the gap blows out. That makes the failure detectable retroactively from logs, without needing to reproduce it live.
The regression boundary
Every update on this machine, oldest first:
| Date | Target version | Gap | Self-restart |
|---|---|---|---|
| 2026-07-07 | 1.18286.2 | 32 s | ok |
| 2026-07-11 | 1.20186.1 | 33 s | ok |
| 2026-07-14 | 1.20186.9 | 33 s | ok |
| 2026-07-15 | 1.21459.0 | 32 s | ok |
| 2026-07-16 | 1.21459.1 | 31 s | ok |
| 2026-07-16 | 1.21459.3 | 32 s | ok |
| 2026-07-17 | 1.22209.0 | 33 s | ok |
| 2026-07-19 | 1.22209.3 | 33 s | ok |
| 2026-07-22 | 1.24012.1 | 31 s | ok |
| 2026-07-27 | 1.24012.9 | 35 s | ok |
| 2026-08-04 | 1.24012.11 | 32 s | ok |
| 2026-08-05 | 1.25927.0 | 32 s | ok |
| 2026-08-10 | 1.26832.0 | 19 min | failed |
| 2026-08-12 | 1.28929.0 | 3 min 42 s | failed |
| 2026-08-15 | 1.30096.5 | 1 min 37 s | failed |
| 2026-08-18 | 1.32352.1 | 30 s | ok |
| 2026-08-19 | 1.32885.1 | 1 min 47 s | failed |
12/12 before 1.26832.0, then 4 failures in 5 updates. Same version this report names as its first occurrence. It is intermittent, not deterministic — 2026-08-18 succeeded — which is what you would expect from a race rather than a hard lock.
No lock was involved in my case
Worth separating from the container-pinning reports, because the deployment log says the package swap went through cleanly:
Result: 0x0, old folder moved, packageStatus: Ok. Nothing was holding a handle. The update itself is fine — what fails is the restart that follows it, ~5 s wide.Likely mechanism for the transient variant
process.execPathinside an MSIX package is the versioned path underC:\Program Files\WindowsApps\Claude_<version>_x64__.../app\Claude.exe. If the restart is spawned from that path, it lands inside the window where Windows has the package flipped to disabled and is moving the old folder — and Windows answers with its shell dialog, whose caption is the file path. Which is exactly the dialog in this report.Packaged apps are meant to be launched through their identity rather than the file path:
or programmatically via
IApplicationActivationManager::ActivateApplication. Going through identity lets Windows serialize the request against the deployment instead of racing it. That would not help the cases here where the container stays pinned and a reboot is required — but it should remove the transient class entirely, and those may be a good share of these reports.Workaround that avoids the reboot
For the transient variant, a scheduled task on event 400 in
Microsoft-Windows-AppXDeploymentServer/Operational, filtered toPackageDisplayName = Claude, with a 20 s delay, then activating the AUMID. If the app did manage to restart on its own, it finds a running process and exits. Runs as the normal user, no elevation. Verified end to end except the activation branch itself, which needs the app to actually be down.Environment
Claude_pzs8sxrjxfjjc, install underC:\Program Files\WindowsApps\Okafter every one of the failures above — the app is never in a broken state, it just does not come backCoworkVMServicepresent since 2026-03-10, so it predates the regression boundary by five months and does not line up as the cause here