doc/devdocs/tools/installer-diagnostics.md
A step-by-step guide for diagnosing installer and update issues reported by users.
| File/Folder | Path | Contains |
|---|---|---|
| UpdateState.json | %LOCALAPPDATA%\Microsoft\PowerToys\UpdateState.json | Persisted update state machine |
| Runner logs | %LOCALAPPDATA%\Microsoft\PowerToys\RunnerLogs\runner-log_*.log | Startup, update checks, cleanup |
| Update logs | %LOCALAPPDATA%\Microsoft\PowerToys\UpdateLogs\update-log_*.log | PowerToys.Update.exe activity |
| Updates folder | %LOCALAPPDATA%\Microsoft\PowerToys\Updates\ | Downloaded installer files |
Note: These paths use
%LOCALAPPDATA%(per-user AppData) regardless of whether PowerToys was installed per-user or per-machine. The data/settings location is always per-user.
From src/common/updating/updateState.h (UpdateState::State enum):
| Value | Name | Meaning |
|---|---|---|
| 0 | upToDate | No update needed |
| 1 | errorDownloading | Download or install failed, will retry |
| 2 | readyToDownload | New version found, not yet downloaded |
| 3 | readyToInstall | Installer downloaded, waiting for user action |
| 4 | networkError | GitHub API call failed |
UpdateState.jsonRunnerLogs\)UpdateLogs\, if they exist)Updates\ folder (names + sizes)In runner logs, look for the startup line:
[info] Scoobe: product_version=v0.XX.X last_version_run=v0.XX.X
upToDate. Ask the user to manually upgrade to the latest version.{"state": 3, "downloadedInstallerFilename": "powertoyssetup-0.98.1-x64.exe" /* additional fields may be present */}
upToDate). On v0.73+, cleanup runs before the next installer download is attempted.PowerToys.Update.exe may never have been launched, or it did not progress far enough to create logs. The user may never have triggered an install, or Stage 1 may have failed before Stage 2 could run.Search for these patterns:
| Log pattern | Meaning |
|---|---|
Failed to delete installer file ... Access is denied | File locked by AV, another process, or permissions issue |
Failed to delete log file ... | Same, for old log files |
Discovered new version | Periodic update check ran |
New version is already downloaded | State is readyToInstall and filename matches — no re-download, no cleanup |
| No cleanup-related entries at all | Inconclusive by itself — cleanup_updates() is silent on success. Corroborate with the Updates folder contents (Step 5) and the running version (Step 1). |
downloadedInstallerFilename: Normal for readyToInstall state.| Root cause | Evidence | Fix |
|---|---|---|
| Running pre-v0.73.0 binary | product_version < v0.73.0 in runner log | Manually upgrade to latest |
State stuck at readyToInstall (pre-v0.73) | "state": 3 in UpdateState.json, no UpdateLogs | Manually upgrade to latest |
| File lock preventing deletion | "Failed to delete ... Access is denied" in runner logs | Check AV software, reboot and retry |
| Update installer never launched | No UpdateLogs directory | Check if update notifications are disabled by GPO or setting |
| Install fails silently | UpdateLogs show init but no install activity | Check related issues: #46966, #46967, #46969 |