[BUG] Claude Desktop 1.1.4173 crashes on startup on Windows (Squirrel install, sv-SE locale)

Status Closed — not planned
Maintainer reply None cached
Activity 12 comments · opened Feb 25, 2026 · closed Apr 1, 2026

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

  1. Install Claude Desktop via the standard Windows installer (Squirrel)
  2. Set Windows system locale to sv-SE (or possibly any locale without a bundled .json file)
  3. Upgrade to v1.1.4173
  4. 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

  1. Install Claude Desktop via the standard Windows installer (Squirrel, not MSIX/Windows Store)
  2. Set Windows system locale to sv-SE (or any locale without a bundled translation file)
  3. Upgrade to v1.1.4173
  4. 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

Additional Information

main.log

View original on GitHub ↗

12 Comments

github-actions[bot] · 6 months ago

Found 3 possible duplicate issues:

  1. https://github.com/anthropics/claude-code/issues/28271
  2. https://github.com/anthropics/claude-code/issues/28353
  3. https://github.com/anthropics/claude-code/issues/28304

This issue will be automatically closed as a duplicate in 3 days.

  • If your issue is a duplicate, please close it and 👍 the existing issue instead
  • To prevent auto-closure, add a comment or 👎 this comment

🤖 Generated with Claude Code

MAHTISONNI · 6 months ago

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

yoyoithink · 6 months ago

<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

  • Claude Desktop: 1.1.4173
  • OS: Windows 11 Pro for Workstations 25H2
  • OS Build: 26200.7840

Behavior

  • Clicking the Claude Desktop icon results in no window rendering.
  • No loading spinner, no error dialog.
  • In some cases the process briefly appears in Task Manager and exits.
  • In other cases it remains backgrounded without displaying a window.
  • Web version works normally.

Troubleshooting Attempted

  • Full uninstall and reinstall
  • Deleted:
  • %AppData%\Claude
  • %LocalAppData%\Claude
  • Cleared temp directories
  • Rebooted system
  • Launched as Administrator
  • GPU-disabled launch

None of the above resolved the issue.

lisadonlon · 6 months ago

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 (4x claude.exe) but MainWindowHandle is 0 on all of them — no window ever renders.

Attempted workarounds that did not help:

  • Clearing all caches (Cache, Code Cache, GPUCache, Session Storage, blob_storage)
  • Resetting config.json to minimal state
  • Changing user culture to en-US via Set-Culture
  • Uninstalling and reinstalling via ClaudeSetup.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.

Sepdnoj · 6 months ago

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) and RDe() both call Ue.formatMessage() without the required id field. In @formatjs/intl, calling formatMessage({ defaultMessage: "..." }) without an id throws 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:

WOt() → checks process.platform === "win32" && !Ms() (not MSIX)
  → Ue.formatMessage({ defaultMessage: "Cowork requires Claude Desktop be installed with our modern installer" })
  → THROWS because no `id` field

There are 9 formatMessage calls across WOt(), RDe(), and zOt() that are all missing the id field. The ones in jOt() and qOt() correctly have id fields — 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:

npx asar extract "%LOCALAPPDATA%\AnthropicClaude\app-1.1.4173\resources\app.asar" "%LOCALAPPDATA%\AnthropicClaude\app-1.1.4173\resources\app_extracted"

2. Back up the original files:

copy "%LOCALAPPDATA%\AnthropicClaude\app-1.1.4173\resources\app.asar" "%LOCALAPPDATA%\AnthropicClaude\app-1.1.4173\resources\app.asar.bak"
copy "%LOCALAPPDATA%\AnthropicClaude\app-1.1.4173\claude.exe" "%LOCALAPPDATA%\AnthropicClaude\app-1.1.4173\claude.exe.bak"

3. Patch .vite/build/index.js in the extracted folder — add id fields to all 9 broken formatMessage calls. For example, replace:

Ue.formatMessage({defaultMessage:"Cowork requires Claude Desktop be installed with our modern installer"})

with:

Ue.formatMessage({id:"cowork.msix_required",defaultMessage:"Cowork requires Claude Desktop be installed with our modern installer"})

Do the same for the other 8 calls in WOt(), RDe(), and zOt().

4. Repack the asar:

npx asar pack "%LOCALAPPDATA%\AnthropicClaude\app-1.1.4173\resources\app_extracted" "%LOCALAPPDATA%\AnthropicClaude\app-1.1.4173\resources\app.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:

const fs = require('fs');
const exe = fs.readFileSync('claude.exe');
const oldHash = Buffer.from('<old-hash-from-error-message>', 'ascii');
const newHash = Buffer.from('<new-hash-from-error-message>', 'ascii');
const idx = exe.indexOf(oldHash);
if (idx !== -1) { newHash.copy(exe, idx); fs.writeFileSync('claude.exe', exe); }

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):

"%LOCALAPPDATA%\AnthropicClaude\app-1.1.4173\claude.exe" --no-sandbox

Result: 7 processes including 3 renderers, main window titled "Claude", login works, account detected. The missing translation is now a harmless MISSING_TRANSLATION fallback warning instead of a fatal crash.

Suggested fix for Anthropic

Add id fields to all formatMessage() calls in WOt(), RDe(), and zOt(). The calls in jOt() and qOt() already have them — this is just an oversight in the newer Cowork feature check code.

ethrx · 6 months ago

@Sepdnoj you're absolutely right!

ErickCHIN000 · 6 months ago

ngl i just ran the msix and it fixed it

Anbus2011 · 6 months ago

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();

nerdx86 · 5 months ago

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.

nerdx86 · 5 months ago

Cross-referencing related open issues that appear to be the same or overlapping root cause:

  • #28900 - Claude Desktop on Windows continually crashes (labeled bug/platform:windows/area:desktop, still open)
  • #29625 - Claude Desktop v1.1.4498 crashes on launch, macOS (same version, different crash path)
  • #29347 - Our original report, closed as dupe of this issue (Windows 10 LTSC 2019)

All three describe Claude Desktop failing to render UI across v1.1.4173 through v1.1.4498 on both Windows and macOS.

github-actions[bot] · 5 months ago

Closing for now — inactive for too long. Please open a new issue if this is still relevant.

github-actions[bot] · 4 months ago

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.