[BUG] Claude Desktop 1.1.4173 crashes on startup on Windows (Squirrel install, sv-SE locale)
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?
Bug description
Claude Desktop v1.1.4173 silently crashes on startup on Windows when installed via the Squirrel installer (not
MSIX/Windows Store). The app process starts but no window is ever shown.
## Root cause (already diagnosed)
The main process throws an unhandled promise rejection before the window is created:
Error: [@formatjs/intl] An id must be provided to format a message.
at nZe (.vite/build/index.js:83)
at Sae (.vite/build/index.js:83)
at WOt (.vite/build/index.js:705)
In WOt() (the Cowork/yukonSilver VM support check), the branch for Windows + non-MSIX installs calls
Ue.formatMessage({ defaultMessage: "Cowork requires Claude Desktop be installed with our modern installer" })
without an id field, which @formatjs/intl requires. This missing id throws and prevents window creation.
The same bug exists for all other formatMessage calls in WOt(), but this is the only branch triggered for this
configuration.
## Environment
- OS: Windows 11 Home 10.0.26200
- Claude Desktop version: 1.1.4173
- Install method: Squirrel (not MSIX/Windows Store)
- System locale: sv-SE (Swedish)
- CPU: Intel Core i9-14900KF
## Steps to reproduce
- Install Claude Desktop via the standard Windows installer (Squirrel)
- Set Windows system locale to sv-SE (or possibly any locale without a bundled .json file)
- Upgrade to v1.1.4173
- Launch Claude Desktop → no window appears
## Fix
Add an id field to all formatMessage() calls in WOt() in the main process bundle, e.g.:
Ue.formatMessage({ id: "cowork.msix_required", defaultMessage: "Cowork requires Claude Desktop be installed with our
modern installer" })
What Should Happen?
Claude Desktop should launch normally and display the main window. The Cowork/yukonSilver feature being unsupported on
non-MSIX Windows installs should be handled gracefully (returning the unsupported status silently) rather than
throwing an unhandled exception that prevents the entire app from starting.
Error Messages/Logs
Claude Desktop should launch normally and display the main window. The Cowork/yukonSilver feature being unsupported on
non-MSIX Windows installs should be handled gracefully (returning the unsupported status silently) rather than
throwing an unhandled exception that prevents the entire app from starting.
Steps to Reproduce
- Install Claude Desktop via the standard Windows installer (Squirrel, not MSIX/Windows Store)
- Set Windows system locale to sv-SE (or any locale without a bundled translation file)
- Upgrade to v1.1.4173
- Launch Claude Desktop — no window appears, app runs silently in background with 4 processes but is completely
unusable
Claude Model
None
Is this a regression?
Yes, this worked in a previous version
Last Working Version
_No response_
Claude Code Version
1.1.4173
Platform
Anthropic API
Operating System
Windows
Terminal/Shell
Windows Terminal
12 Comments
Found 3 possible duplicate issues:
This issue will be automatically closed as a duplicate in 3 days.
🤖 Generated with Claude Code
I also have the same issue. Claude desktop broke on my Surface Laptop 7 / ARM64 architecture. When i run Claude.exe it will start 4 processes to taskmgr but no UI is present. I've done every debugging i can with Claude Opus including the locale changes, fresh installs, nuke everything Claude related > reinstall. Still nothing!
OS: Windows 11 Enterprise 10.0.26200
Claude Desktop version: 1.1.4173
Install method: Squirrel (not MSIX/Windows Store, not even found in Windows Store)
System locale: fi-FI (Finnish)
CPU: Snapdragon x 12-core X1E80100
<img width="1755" height="580" alt="Image" src="https://github.com/user-attachments/assets/49d24850-a64d-4e85-a2c4-cd25d0c400e5" />
Windows 11 – Same Symptom (No Window / No UI Render)
I am experiencing a similar failure mode on Windows.
Environment
Behavior
Troubleshooting Attempted
%AppData%\Claude%LocalAppData%\ClaudeNone of the above resolved the issue.
Confirming this also affects MSIX (Microsoft Store) installs, not just Squirrel.
| Detail | Value |
|--------|-------|
| Version | 1.1.4173.0 |
| Install method | MSIX (Microsoft Store) |
| OS | Windows 11 Home 10.0.26200 |
| Architecture | ARM64 (Snapdragon X Elite) |
| System locale | en-GB |
| User culture | en-IE (English - Ireland) |
Same error — unhandled promise rejection in
WOt()with[@formatjs/intl] An id must be provided to format a message. Processes start (4xclaude.exe) butMainWindowHandleis 0 on all of them — no window ever renders.Attempted workarounds that did not help:
Cache,Code Cache,GPUCache,Session Storage,blob_storage)config.jsonto minimal stateen-USviaSet-CultureClaudeSetup.exe(which downloads the same MSIX v1.1.4173.0)The bug appears to be unconditional in this version — not locale-dependent as originally reported.
Confirmed and patched — here's a binary workaround for anyone affected
Environment: Windows 11 Enterprise 10.0.26200, AMD EPYC 7763 (Azure VM), en-US locale, Squirrel installer, v1.1.4173
Root Cause Confirmed: The
WOt()function (Cowork/yukonSilver platform support check) andRDe()both callUe.formatMessage()without the requiredidfield. In@formatjs/intl, callingformatMessage({ defaultMessage: "..." })without anidthrows an error. This becomes an unhandled promise rejection that prevents the BrowserWindow from ever showing — the renderer process never spawns.The specific call path that triggers on Windows + Squirrel installs:
There are 9
formatMessagecalls acrossWOt(),RDe(), andzOt()that are all missing theidfield. The ones injOt()andqOt()correctly haveidfields — so this was likely a partial oversight.Binary workaround (tested, works)
For anyone who needs Claude Desktop working now, here's the manual patch process:
1. Kill Claude Desktop, extract app.asar:
2. Back up the original files:
3. Patch
.vite/build/index.jsin the extracted folder — addidfields to all 9 brokenformatMessagecalls. For example, replace:with:
Do the same for the other 8 calls in
WOt(),RDe(), andzOt().4. Repack the asar:
5. Patch the integrity hash in
claude.exe— The new asar will have a different SHA-256. Find the old hash in the binary and replace it with the new one. A quick Node.js script:The old/new hashes are printed in the FATAL error when launching with the patched asar before this step.
6. Launch with
--no-sandbox(required on this VM, may not be needed for all users):Result: 7 processes including 3 renderers, main window titled "Claude", login works, account detected. The missing translation is now a harmless
MISSING_TRANSLATIONfallback warning instead of a fatal crash.Suggested fix for Anthropic
Add
idfields to allformatMessage()calls inWOt(),RDe(), andzOt(). The calls injOt()andqOt()already have them — this is just an oversight in the newer Cowork feature check code.@Sepdnoj you're absolutely right!
ngl i just ran the msix and it fixed it
I had Gemini build a js script to automate the fix above and extract the hash dynamically. Copy the code below, create a file named patch-claude.js, and run it from CMD: node patch-claude.js
const fs = require('fs');
const path = require('path');
const { execSync, spawn } = require('child_process');
// --- Configuration ---
const CLAUDE_VERSION = 'app-1.1.4173';
const localAppData = process.env.LOCALAPPDATA;
const appDir = path.join(localAppData, 'AnthropicClaude', CLAUDE_VERSION);
const resourcesDir = path.join(appDir, 'resources');
const asarPath = path.join(resourcesDir, 'app.asar');
const asarBakPath = path.join(resourcesDir, 'app.asar.bak');
const extractedDir = path.join(resourcesDir, 'app_extracted');
const exePath = path.join(appDir, 'claude.exe');
const exeBakPath = path.join(appDir, 'claude.exe.bak');
const indexJsPath = path.join(extractedDir, '.vite', 'build', 'index.js');
console.log("==================================================");
console.log(" Claude Desktop Unhandled Promise Patcher");
console.log("==================================================\n");
async function runPatcher() {
try {
// Step 1: Kill process
console.log("1. Ensuring Claude Desktop is closed...");
try {
execSync('taskkill /IM claude.exe /F', { stdio: 'ignore' });
} catch (e) { / Ignore if not running / }
// Step 2: Backup
console.log("2. Creating backups...");
if (!fs.existsSync(asarBakPath)) fs.copyFileSync(asarPath, asarBakPath);
if (!fs.existsSync(exeBakPath)) fs.copyFileSync(exePath, exeBakPath);
// Step 3: Extract
console.log("3. Extracting app.asar (this takes a moment)...");
execSync(
npx asar extract "${asarPath}" "${extractedDir}", { stdio: 'pipe' });// Step 4: Patch index.js
console.log("4. Patching formatMessage calls in index.js...");
let code = fs.readFileSync(indexJsPath, 'utf8');
// Find Ue.formatMessage({defaultMessage:"..."}) and inject unique IDs
let counter = 0;
const regex = /(Ue\.formatMessage\(\s\{)(\sdefaultMessage\s*:)/g;
const patchedCode = code.replace(regex, (match, p1, p2) => {
counter++;
return
${p1} id: "patched.fix.${counter}", ${p2};});
fs.writeFileSync(indexJsPath, patchedCode, 'utf8');
console.log(
-> Injected ${counter} missing 'id' fields.);// Step 5: Repack
console.log("5. Repacking app.asar...");
execSync(
npx asar pack "${extractedDir}" "${asarPath}", { stdio: 'pipe' });// Step 6: Dynamically grab hashes from Electron
console.log("6. Retrieving ASAR integrity hashes from Electron...");
const hashes = await new Promise((resolve, reject) => {
const child = spawn(exePath, ['--no-sandbox']);
let errorLog = '';
child.stderr.on('data', (data) => {
errorLog += data.toString();
// Listen for: Integrity check failed for asar archive (old vs new)
const match = errorLog.match(/Integrity check failed for asar archive \(([a-f0-9]+) vs ([a-f0-9]+)\)/);
if (match) {
child.kill(); // We got what we needed, kill the process
resolve({ oldHash: match[1], newHash: match[2] });
}
});
setTimeout(() => {
child.kill();
reject(new Error("Timeout waiting for Electron hash error."));
}, 10000);
});
console.log(
-> Expected Hash: ${hashes.oldHash});console.log(
-> Actual Hash: ${hashes.newHash});// Step 7: Patch executable
console.log("7. Patching claude.exe with new integrity hash...");
let exeBuffer = fs.readFileSync(exePath);
const oldHashBuffer = Buffer.from(hashes.oldHash, 'ascii');
const newHashBuffer = Buffer.from(hashes.newHash, 'ascii');
const idx = exeBuffer.indexOf(oldHashBuffer);
if (idx !== -1) {
newHashBuffer.copy(exeBuffer, idx);
fs.writeFileSync(exePath, exeBuffer);
console.log(" -> Binary patched successfully.");
} else {
throw new Error("Old hash not found in claude.exe. It may already be patched.");
}
// Step 8: Cleanup
console.log("8. Cleaning up temporary files...");
fs.rmSync(extractedDir, { recursive: true, force: true });
// Step 9: Launch
console.log("9. Launching patched Claude Desktop...");
const child = spawn(exePath, ['--no-sandbox'], { detached: true, stdio: 'ignore' });
child.unref();
console.log("\nDone! Claude Desktop should open shortly.");
} catch (err) {
console.error("\n[!] An error occurred:");
console.error(err.message);
}
}
runPatcher();
Confirming this bug persists in v1.1.4498.0 on Windows 10 Enterprise N LTSC 2019 (build 17763), Squirrel install, en-US locale.
Same root cause -- the missing formatMessage id in WOt() kills the renderer before any UI appears. Two separate claude.exe processes (PIDs 259848 and 122608) both crashed identically at fault offset 0x0000e892 with exception 0xc0000409 (BEX / stack buffer overrun) within 26 seconds of each other on 2026-02-27.
Environment: Dell laptop, Intel i7-10850H, 64GB RAM, NVIDIA Quadro RTX 3000 + Intel UHD (hybrid GPU), Claude MAX account.
This is not locale-specific -- our system is en-US. The Squirrel (non-MSIX) install path is the common factor. Pinned to a known-good older version as workaround.
Cross-referencing related open issues that appear to be the same or overlapping root cause:
All three describe Claude Desktop failing to render UI across v1.1.4173 through v1.1.4498 on both Windows and macOS.
Closing for now — inactive for too long. Please open a new issue if this is still relevant.
This issue has been automatically locked since it was closed and has not had any activity for 7 days. If you're experiencing a similar issue, please file a new issue and reference this one if it's relevant.