[BUG] macOS version of Claude Desktop becomes corrupted, freezes, requiring full Reset App before it will work again

Status Closed — not planned
Reported on v2.1.170
Maintainer reply None cached
Activity 8 comments · opened Jun 13, 2026 · closed Aug 20, 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?

System Information

  • OS: macOS 26.5.1
  • Architecture: Apple Silicon M4 MAX
  • Claude Desktop Version: Claude 1.12603.1 (3df4fd) 2026-06-11T16:57:36.000Z

What's Wrong?

Claude Desktop becomes unresponsive and renders blank after several days of normal use. The webview freezes on keyboard input; typed characters never appear. The application must be force-quit to recover.

Affects: Both regular Chat and Claude Code

Actual Behavior

  • Keystrokes freeze the application
  • Main window becomes blank/unresponsive
  • Main process event loop stalls for 30-35 seconds
  • Force quit required to recover
  • Issue recurs within 1-2 days even after full cache wipe

What Should Happen?

Claude Desktop should remain responsive during normal typing and chat usage over multiple days without degradation or freezing.

Error Messages/Logs

Detailed logs show a clear failure pattern:

2026-06-13 18:18:35 [info] Starting app {
  appVersion: '1.12603.1',
  isPackaged: true,
  platform: 'darwin',
  arch: 'arm64',
  nodeVersion: '24.16.0'
}
2026-06-13 18:18:35 [info] [CCD] Initialized with version 2.1.170
2026-06-13 18:18:35 [info] [growthbook] next refresh in 60 min
2026-06-13 18:18:35 [info] [WarmLifecycle:cowork] Initialized (arm=always)
2026-06-13 18:18:35 [info] [WarmLifecycle:session] Initialized (arm=when-hidden)
2026-06-13 18:18:35 [info] [WarmLifecycle:preview] Initialized (arm=when-hidden)
2026-06-13 18:18:35 [info] Starting app {
  appVersion: '1.12603.1',
  isPackaged: true,
  platform: 'darwin',
  arch: 'arm64',
  nodeVersion: '24.16.0'
}
2026-06-13 18:18:35 [info] [account] Account details not yet available, waiting for IPC...
2026-06-13 18:18:35 [info] [compliance] coworkHipaaRestricted at app-ready: unrestricted
2026-06-13 18:18:35 [info] [CoworkFilePreview] Protocol handler registered
2026-06-13 18:18:35 [info] [SessionMedia] claude-media:// protocol registered
2026-06-13 18:18:35 [info] [cu-side-panel] initialized
2026-06-13 18:18:35 [info] [cu-esc] initialized
2026-06-13 18:18:35 [info] [cu-teach] controller initialized
2026-06-13 18:18:35 [info] [cu-glow] initialized
2026-06-13 18:18:35 [info] [cu-notifications] listeners registered
2026-06-13 18:18:35 [info] [remoteMarketplaceMigration] marketplace_migration.invoked
2026-06-13 18:18:35 [info] [remoteMarketplaceMigration] marketplace_migration.skip_sentinel_set
2026-06-13 18:18:35 [info] [remoteUploadsMigration] upload_migration.invoked
2026-06-13 18:18:35 [info] NotificationService initialized with UNUserNotificationCenter (macOS)
2026-06-13 18:18:35 [info] [wake-scheduler] registered claim id=scheduled-tasks
2026-06-13 18:18:35 [info] [updater] App is installed, enabling initial check and auto-updates
2026-06-13 18:18:35 [info] [updater] Update URL: https://api.anthropic.com
2026-06-13 18:18:35 [info] [updater] Checking for updates
2026-06-13 18:18:36 [info] [CCD] Resolved 10 login-shell env vars
2026-06-13 18:18:36 [info] [Chrome Extension MCP] Installed native host manifest for Chrome at /Users/[USERNAME]/Library/Application Support/Google/Chrome/NativeMessagingHosts/com.anthropic.claude_browser_extension.json
2026-06-13 18:18:36 [info] [Chrome Extension MCP] Native host sync complete
2026-06-13 18:18:36 [info] [Chrome Extension MCP] Watching Chrome for extension changes
2026-06-13 18:18:36 [info] [Chrome Extension MCP] Watching Edge for extension changes
2026-06-13 18:18:36 [info] [Claude in Chrome] MCP server registered
2026-06-13 18:18:36 [info] [growthbook] loaded 184 features (184 changed)
2026-06-13 18:18:36 [info] [outbound-ccr] started
2026-06-13 18:18:36 [info] [chicago] GrowthBook chicago_config: raw={"enabled":true,"pixelValidation":false,"clipboardPasteMultiline":true,"screenshotFilter":true,"mouseAnimation":true,"hideBeforeAction":true,"coordinateMode":"pixels","dispatchCuGrantTtlMs":1800000} → enabled=true subGates={"pixelValidation":false,"clipboardPasteMultiline":true,"mouseAnimation":true,"hideBeforeAction":true,"autoTargetDisplay":true,"clipboardGuard":true} coordMode=pixels dispatchTtlMs=1800000
2026-06-13 18:18:36 [info] [remoteUploadsMigration] upload_migration.gate_check gate=cowork_plugin_host_ops value=true
2026-06-13 18:18:36 [info] [remoteUploadsMigration] upload_migration.gate_check gate=claudeai_cowork_backend_marketplaces value=true
2026-06-13 18:18:36 [info] [startup-perf] {
  main_imports_loaded_ms: 383,
  app_ready_ms: 564,
  window_created_ms: 693,
  window_did_finish_load_ms: 937,
  main_view_dom_ready_ms: 1203
}
2026-06-13 18:18:36 [info] [RemotePluginManager] Starting remote plugins sync
2026-06-13 18:18:36 [info] [growthbook] refreshing for account change
2026-06-13 18:18:36 [info] [account] Account details received via IPC
2026-06-13 18:18:36 [info] claude.ai account details provided
2026-06-13 18:18:36 [info] claude.ai account active and logged in
2026-06-13 18:18:36 [info] [sessions-bridge] account-change reevaluate: <none> → [ORG_ID]:[ACCOUNT_ID]
2026-06-13 18:18:36 [info] [RemotePluginManager] Sync already in progress, waiting...
2026-06-13 18:18:36 [info] [LocalSessionManager] Initialization succeeded — accountId=[ACCOUNT_ID], orgId=[ORG_ID], existingSessions=0
2026-06-13 18:18:36 [info] [LocalAgentModeSessionManager] Initialization succeeded — accountId=[ACCOUNT_ID], orgId=[ORG_ID], existingSessions=0
2026-06-13 18:18:36 [info] [CCDScheduledTasks] Reset
2026-06-13 18:18:36 [info] [WarmLifecycle:cowork] Destroyed
2026-06-13 18:18:36 [info] [ScheduledTasks] Reset
2026-06-13 18:18:36 [info] [remoteUploadsMigration] upload_migration.paths_resolved marketplacesDir=/Users/[USERNAME]/Library/Application Support/Claude/local-agent-mode-sessions/[ACCOUNT_ID]/[ORG_ID]/cowork_plugins/marketplaces
2026-06-13 18:18:36 [info] [remoteUploadsMigration] upload_migration.skip_sentinel_set key=remote_uploads_migration_done_v1_ccdabedce39c
2026-06-13 18:18:36 [info] Loaded 0 persisted sessions from /Users/[USERNAME]/Library/Application Support/Claude/local-agent-mode-sessions/[ACCOUNT_ID]/[ORG_ID]
2026-06-13 18:18:36 [info] [cliPluginBridge] registered
2026-06-13 18:18:36 [info] [Spaces] Loaded 0 spaces for [ACCOUNT_ID]/[ORG_ID]
2026-06-13 18:18:36 [info] [LocalAgentModeSessionManager] Scheduled tasks service initialized
2026-06-13 18:18:36 [info] [SkillsPlugin] Starting periodic sync (interval: 600000ms)
2026-06-13 18:18:36 [info] [SkillsPlugin] Starting skills sync
2026-06-13 18:18:36 [info] [RemotePluginManager] Sync already in progress, waiting...
2026-06-13 18:18:36 [info] [LocalAgentModeSessionManager] Initialization succeeded — accountId=[ACCOUNT_ID], orgId=[ORG_ID], existingSessions=0
2026-06-13 18:18:36 [info] Loaded 0 persisted sessions from /Users/[USERNAME]/Library/Application Support/Claude/local-agent-mode-sessions/[ACCOUNT_ID]/[ORG_ID]
2026-06-13 18:18:36 [warn] [ScheduledTasks] Already initialized
2026-06-13 18:18:36 [info] [LocalAgentModeSessionManager] Scheduled tasks service initialized
2026-06-13 18:18:36 [info] [RemotePluginManager] Sync already in progress, waiting...
2026-06-13 18:18:36 [info] [LocalSessionManager] Session storage directory does not exist yet, skipping load: /Users/[USERNAME]/Library/Application Support/Claude/claude-code-sessions/[ACCOUNT_ID]/[ORG_ID]
2026-06-13 18:18:36 [info] using oauth config {
  apiHost: 'https://api.anthropic.com',
  clientId: '9d1c250a-e61b-44d9-88ed-5944d1962f5e',
  redirectUri: 'https://console.anthropic.com/oauth/code/callback',
  scope: 'user:inference user:file_upload user:profile user:sessions:claude_code',
  domain: '.claude.ai'
}
2026-06-13 18:18:36 [info] Trying to load oauth token cache
2026-06-13 18:18:36 [info] [oauth] token cache location: /Users/[USERNAME]/Library/Application Support/Claude/config.json
2026-06-13 18:18:36 [info] [oauth] loaded token cache from disk with 2 entries: [
  '9d1c250a-e61b-44d9-88ed-5944d1962f5e:[ORG_ID]:https://api.anthropic.com:user:inference user:file_upload user:profile user:sessions:claude_code',
  '9d1c250a-e61b-44d9-88ed-5944d1962f5e:[ORG_ID]:https://api.anthropic.com:user:inference user:file_upload user:profile',
  [length]: 2
]
2026-06-13 18:18:36 [info] [ScheduledTasks] Initialized { accountId: '[ACCOUNT_ID]', orgId: '[ORG_ID]' }
2026-06-13 18:18:36 [info] [oauth] looking up token for orgId=[ORG_ID], cacheKey=9d1c250a-e61b-44d9-88ed-5944d1962f5e:[ORG_ID]:https://api.anthropic.com:user:inference user:file_upload user:profile user:sessions:claude_code
2026-06-13 18:18:36 [info] [oauth] using cached token for orgId=[ORG_ID]
2026-06-13 18:18:36 [info] [CCDScheduledTasks] Initialized { accountId: '[ACCOUNT_ID]', orgId: '[ORG_ID]' }
2026-06-13 18:18:36 [info] Starting periodic extension update checks (interval: 21600000ms)
2026-06-13 18:18:36 [info] Starting blocklist update checks. Initial check will be triggered on first ConnectToServer.
2026-06-13 18:18:36 [info] [CCD] Resolved SSH IdentityAgent via ssh -G: /Users/[USERNAME]/Library/Group Containers/2BUA8C4S2C.com.1password/t/agent.sock
2026-06-13 18:18:36 [info] MCP Server connection requested for: mcp-registry
2026-06-13 18:18:36 [info] Running initial blocklist check triggered by ConnectToServer
2026-06-13 18:18:36 [info] MCP Server connection requested for: Claude in Chrome
2026-06-13 18:18:36 [info] [growthbook] loaded 184 features (0 changed)
2026-06-13 18:18:36 [info] [growthbook] next refresh in 60 min
2026-06-13 18:18:36 [info] Successfully fetched blocklist from https://claude.ai/api/organizations/[ORG_ID]/dxt/blocklist with 0 entries
2026-06-13 18:18:36 [info] Saved 1 blocklists with 0 entries
2026-06-13 18:18:36 [info] Successfully updated blocklist
2026-06-13 18:18:36 [info] Organization allowlist enabled: false
2026-06-13 18:18:36 [info] Updated allowlist enabled state for org [ORG_ID]: false
2026-06-13 18:18:36 [info] Checking 0 extensions via can_install API using stored metadata
2026-06-13 18:18:36 [info] can_install check completed: 0 extensions checked: [ [length]: 0 ]
2026-06-13 18:18:36 [info] [PluginsFetcher] fetchAutoInstalledPlugins: 0 plugins
2026-06-13 18:18:36 [info] [RemotePluginManager] Delta: 0 to download, 0 to remove
2026-06-13 18:18:36 [info] [RemotePluginManager] Sync complete: 0 downloaded, 0 removed, 0 orphans cleaned
2026-06-13 18:18:36 [info] [growthbook] refreshing for account change
2026-06-13 18:18:36 [info] Successfully fetched blocklist from https://claude.ai/api/organizations/[ORG_ID]/dxt/blocklist with 0 entries
2026-06-13 18:18:36 [info] Saved 1 blocklists with 0 entries
2026-06-13 18:18:36 [info] Successfully updated blocklist
2026-06-13 18:18:36 [info] Organization allowlist enabled: false
2026-06-13 18:18:36 [info] Updated allowlist enabled state for org [ORG_ID]: false
2026-06-13 18:18:36 [info] Checking 0 extensions via can_install API using stored metadata
2026-06-13 18:18:36 [info] can_install check completed: 0 extensions checked: [ [length]: 0 ]
2026-06-13 18:18:36 [warn] Blocked permission check {
  permission: 'background-sync',
  requestingOrigin: 'https://a.claude.ai/',
  requestingUrl: 'https://a.claude.ai/isolated-segment.html?v=d3ddad6bcb',
  isMainFrame: false,
  topFrameUrl: 'https://claude.ai/new'
}
2026-06-13 18:18:36 [info] [growthbook] loaded 184 features (0 changed)
2026-06-13 18:18:36 [info] [growthbook] next refresh in 60 min
2026-06-13 18:18:36 [info] LocalAgentModeSessions.getSupportedCommands: sessionId=undefined, cwd=undefined
2026-06-13 18:18:36 [info] [SkillsPlugin] Found 5 enabled skills
2026-06-13 18:18:36 [info] [SkillsPlugin] Delta: 0 to download, 0 to remove
2026-06-13 18:18:36 [info] [SkillsPlugin] Sync complete: 0 downloaded, 0 removed, 0 orphans cleaned
2026-06-13 18:18:36 [info] using oauth config {
  apiHost: 'https://api.anthropic.com',
  clientId: '9d1c250a-e61b-44d9-88ed-5944d1962f5e',
  redirectUri: 'https://console.anthropic.com/oauth/code/callback',
  scope: 'user:inference user:file_upload user:profile',
  domain: '.claude.ai'
}
2026-06-13 18:18:36 [info] [oauth] looking up token for orgId=[ORG_ID], cacheKey=9d1c250a-e61b-44d9-88ed-5944d1962f5e:[ORG_ID]:https://api.anthropic.com:user:inference user:file_upload user:profile
2026-06-13 18:18:36 [info] [oauth] using cached token for orgId=[ORG_ID]
2026-06-13 18:18:37 [info] [buddy] starting bridge
2026-06-13 18:18:37 [info] [buddy] bridge started
2026-06-13 18:18:37 [info] [systemCAs] wrote CA bundle (147 certs) → /Users/[USERNAME]/Library/Application Support/Claude/ca-bundle.pem
2026-06-13 18:18:59 [info] Main webview is unresponsive, will kill and reload
2026-06-13 18:18:59 [error] Sentry caught: {
  eventId: '0c1c16e38d1e4b83914f0e423fe06ca2',
  type: 'Unknown',
  value: 'Main webview became unresponsive',
  stack: undefined
}
2026-06-13 18:18:59 [info] [EventLogging] Flushing 44 events
2026-06-13 18:19:16 [warn] [event-loop-stall] main process blocked for 34000ms [likely sleep/wake] (total 0, cumulative 0ms, rss 427MB)
2026-06-13 18:19:17 [error] Sentry caught: {
  eventId: '8075c02861c7490e84cd29f64f9d6651',
  type: 'Unknown',
  value: 'No message',
  stack: undefined
}
2026-06-13 18:20:16 [info] [EventLogging] Flushing 1 events
2026-06-13 18:26:38 [warn] Blocked permission check {
  permission: 'media',
  requestingOrigin: '',
  requestingUrl: '',
  isMainFrame: true,
  topFrameUrl: ''
}
2026-06-13 18:26:38 [warn] Blocked permission check {
  permission: 'media',
  requestingOrigin: '',
  requestingUrl: '',
  isMainFrame: true,
  topFrameUrl: ''
}
2026-06-13 18:26:38 [warn] Blocked permission check {
  permission: 'web-app-installation',
  requestingOrigin: '',
  requestingUrl: '',
  isMainFrame: true,
  topFrameUrl: ''
}
2026-06-13 18:26:38 [warn] Blocked permission check {
  permission: 'geolocation',
  requestingOrigin: '',
  requestingUrl: '',
  isMainFrame: true,
  topFrameUrl: ''
}

Steps to Reproduce

  1. Launch Claude Desktop
  2. Use normally for several days (both Chat and Claude Code features)
  3. Attempt to type in chat
  4. Observe: Keystroke freezes the app; window goes completely blank
  5. App becomes unresponsive to all input

Claude Model

Not sure / Multiple models

Is this a regression?

Yes, this worked in a previous version

Last Working Version

_No response_

Claude Code Version

Claude 1.12603.1 (3df4fd) 2026-06-11T16:57:36.000Z

Platform

Anthropic API

Operating System

macOS

Terminal/Shell

iTerm2

Additional Information

_No response_

View original on GitHub ↗

7 Comments

github-actions[bot] · 2 months ago

Found 3 possible duplicate issues:

  1. https://github.com/anthropics/claude-code/issues/50901
  2. https://github.com/anthropics/claude-code/issues/68205
  3. https://github.com/anthropics/claude-code/issues/18532

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

dballing · 2 months ago

Two of those issues appear to be "blank-on-open" rather than "freeze-and-then-blank-on-type" One is seemingly completely dissimilar.

deeprain279 · 2 months ago

M2 Max, macOS 26.5.1
Claude 1.14271.0 (c8f4d8) — Regression compared to previous version
“Network Service process gone (reason=killed, exitCode=15)” as root cause
The previous version worked without any issues

grep -E "unresponsive|error|webview|fatal" ~/Library/Logs/Claude/main.log | tail -30
value: 'Main webview became unresponsive',
2026-06-19 09:55:12 [error] Sentry caught: {
2026-06-19 09:55:16 [error] Sentry caught: {
2026-06-19 09:55:16 [error] Network Service process gone (reason=killed, exitCode=15) outside app quit — main-process networking is broken until relaunch
2026-06-19 09:55:16 [error] Sentry caught: {
2026-06-19 09:55:16 [error] Sentry caught: {

log show --predicate 'process == "Claude" OR processImagePath CONTAINS "Claude"' \
--start "2026-06-19 09:54:00" --end "2026-06-19 09:56:00" \
--style compact 2>/dev/null | grep -E "kill|signal|sandbox|deny|SIGTERM"

2026-06-19 09:54:38.927 Df Claude Helper[42508:145426] [com.apple.audio.caulk:alloc] Registered notify signal com.apple.caulk.alloc.rtdump (0)
2026-06-19 09:54:38.927 Df Claude Helper[42508:145426] [com.apple.coreaudio:AMCP] System_Input_Processing_Notification_Handler.mm:456 System_Input_Processing_Notification_Handler::is_vi_available(): Voice isolation DSP is available for client with bundle id com.anthropic.claudefordesktop.helper (AVFoundation is available, application is not in client deny list, application is not FaceTime variant)
2026-06-19 09:54:43.059 Df Claude[42509:145585] [com.apple.network:boringssl] nw_protocol_boringssl_signal_connected(895) [C1.1.1:2][0x124033db8e0] TLS connected [server(0) version(0x0304) ciphersuite(TLS_AES_256_GCM_SHA384) group(0x11ec) signature_alg(0x0403) alpn(http/1.1) resumed(0) offered_ticket(0) in_early_data(0) early_data_accepted(0) false_started(0) ocsp_received(1) sct_received(0) connect_time(12ms) flight_time(7ms) rtt(6ms) write_stalls(0) read_stalls(8) pake(0x0000)]
2026-06-19 09:54:44.023 Df Claude Helper[42527:145657] [com.apple.audio.caulk:alloc] Registered notify signal com.apple.caulk.alloc.rtdump (0)
2026-06-19 09:54:44.024 Df Claude Helper[42527:145657] [com.apple.coreaudio:AMCP] System_Input_Processing_Notification_Handler.mm:456 System_Input_Processing_Notification_Handler::is_vi_available(): Voice isolation DSP is available for client with bundle id com.anthropic.claudefordesktop.helper (AVFoundation is available, application is not in client deny list, application is not FaceTime variant)
2026-06-19 09:55:16.637 Df Claude Helper[42560:145936] [com.apple.audio.caulk:alloc] Registered notify signal com.apple.caulk.alloc.rtdump (0)
2026-06-19 09:55:16.638 Df Claude Helper[42560:145936] [com.apple.coreaudio:AMCP] System_Input_Processing_Notification_Handler.mm:456 System_Input_Processing_Notification_Handler::is_vi_available(): Voice isolation DSP is available for client with bundle id com.anthropic.claudefordesktop.helper (AVFoundation is available, application is not in client deny list, application is not FaceTime variant)

STRML · 2 months ago

Confirming this on Apple Silicon (macOS, Claude Desktop 1.15962.1) — same Network Service process gone (reason=killed, exitCode=15) outside app quit line @deeprain279 found. In my main.log it has fired 92 times over the past month, always clustered while the app sits backgrounded/idle, and each time the window goes blank because "main-process networking is broken until relaunch."

The reason log show ... | grep SIGTERM turns up nothing in the Claude-scoped log is that the signal comes from outside the app: macOS App Nap is suspending/reaping the helper processes (the Network Service and the cowork vzgvisor/VM helpers) when the app is idle in the background. The renderer survives but has no network, so it paints blank.

Workaround that's held for me — disable App Nap for the app:

defaults write com.anthropic.claudefordesktop NSAppSleepDisabled -bool YES

then fully quit and relaunch. Since I set it, no more background network-service kills and no more blank-on-resume. Cost is negligible (app no longer naps when idle).

This is a workaround, not a real fix — ideally the app should tolerate App Nap (re-spawn the network service on resume / set the appropriate NSSupportsSuddenTermination behavior on its helpers) rather than wedge until manual relaunch.

---

Update — root cause on my machine was actually DNS, not App Nap. NSAppSleepDisabled=YES only reduced the backgrounded-idle kills; the Network Service was still killed within ~1s of a foreground launch, which App Nap can't explain. With no crash report, reason=killed means Chromium's browser process killed its own hung network service and restarted it.

What was hanging it: my primary DNS resolver was a VPN/MagicDNS address (Tailscale's 100.100.100.100). When that resolver wedges, the network service's blocking DNS stalls and Chromium reaps it → blank renderer. Disabling the VPN's DNS takeover (tailscale set --accept-dns=false, so the OS falls back to the LAN resolver) stopped the kills completely, confirmed over an extended session. Same resolver had also been breaking unrelated VM networking on this machine.

So if you're hitting this, run scutil --dns and check whether a VPN/MagicDNS server is your primary resolver — a flaky primary resolver wedging the Chromium network service is a distinct path to this blank screen, separate from App Nap. (Underlying app bug remains: when the net service dies, the app should reload/recover instead of staying blank.)

---

Forensic follow-up — this looks like a recovery bug, not an OS kill. I traced one of these Network Service process gone (reason=killed, exitCode=15) events through the macOS unified log (log show around the exact timestamp). What actually happens:

  • The network-service/utility helper is torn down, and new helper processes spawn and check in within the same second (launchd: … shutting down / cleaning up for the old pids, then CHECKIN pid=… / added unmanaged active for fresh ones). So Chromium recycled its own utility process and respawned it — it was not permanently killed.
  • No kernel jetsam, no runningboardd termination, no SIGTERM from any system daemon. macOS recorded a clean teardown-and-respawn. So this is Chromium/Electron-internal, not App Nap, memory pressure, or the OS reaping the app.
  • Despite the respawn, the Electron main process gives up — it logs main-process networking is broken until relaunch and the renderer stays blank instead of rebinding to the new network service. That's the bug: failure to recover from a network-service recycle.

Trigger correlation on my machine: the teardown coincided exactly with the CCD / Claude-Code SDK helper (logs as version 2.1.183) restarting, while a scheduled-tasks MCP request was in flight — and my history shows recurring kills at a fixed daily time (08:00:06), consistent with a scheduled-task / cowork-VM subsystem recycle cascading into the network-service teardown. Disabling coworkScheduledTasksEnabled + ccdScheduledTasksEnabled removes that trigger as a workaround.

Separately, I had a frequent at-launch variant of this same line that turned out to be DNS (a flaky VPN/MagicDNS primary resolver wedging the net service — see my earlier comment). Fixing DNS removed the at-launch storms; the residual is the internal-recycle case above.

Suggested fix direction for the app: when child-process-gone fires for the network service and Chromium respawns it, the main process should rebind to the new service rather than latching networking broken until relaunch. Repro lever: trigger cowork/scheduled-tasks subsystem activity (or DNS stalls) to force a network-service recycle and observe the renderer fail to recover.

STRML · 2 months ago

Netlog evidence: after the recycle the app stops using the network entirely (it's not the wire).

Captured a 30s Chromium net log (Troubleshooting → Record Net Log) from the blank state on macOS, build 1.17377.1, while the renderer was blank and main-process networking is broken until relaunch had fired. The capture is almost empty, and that emptiness is the finding:

  • 0 network events over the full 30 seconds.
  • 0 sockets (socketPoolInfo: []), 0 active HTTP/2 sessions, 0 active QUIC sessions; every httpStreamPoolInfo counter (connecting / handed_out / idle) at 0.
  • Host-resolver cache empty — no DNS lookups even attempted.
  • DNS config healthy: system nameservers (LAN + public resolver), no VPN/MagicDNS resolver in the path. Proxy = system default. QUIC enabled.

The key point is the zero connection attempts. This rules out the wire as the cause:

  • Not a firewall / Little Snitch: nothing is being blocked because nothing is being attempted — no connecting sockets, no failures.
  • Not DNS / VPN: no resolution attempts, and the resolver config is clean.
  • Not QUIC/TLS: no sessions erroring; there are simply no sessions.

So after the network-service recycle documented above (Chromium tears down + respawns the utility process within the same second, no OS kill, no crash report), the main process latches networking broken until relaunch and stops issuing any requests at all. The renderer's fetches then fail with net::ERR_FAILED — not because networking failed, but because the app abandoned the network layer and never rebinds to the respawned service. The window stays blank on top of a completely idle, healthy network stack.

Repro note: this capture is the aftermath (it starts after the recycle, so it can't show the trigger). To capture the trigger, the net log has to already be running when a mid-session recycle hits. But for the "is it the environment or the app?" question, this is conclusive: idle stack + healthy config + blank renderer = an app-side recovery failure.

Suggested fix direction (restating): on child-process-gone for the NetworkService, rebind to the respawned service and resume requests instead of latching broken until relaunch.

STRML · 2 months ago

Root cause isolated: overlay-network (VPN) network-change events. Dead-simple repro below.

Ran a controlled test on macOS. With Tailscale running, the NetworkService was recycled roughly every 15–20 min (blank each time). I took Tailscale fully down (tailscale down): the app ran 46 minutes with zero recycles. The moment I brought it back up (tailscale up), the NetworkService was killed within seconds and the renderer went blank. With Tailscale up but quiet, it's stable for hours.

So it's not steady-state VPN — it's the network-change events: the interface up/down transition, plus ongoing churn (magicsock: derp-N does not know about peer, removing route, and repeated IPv6 localListener failed to listen). Kill frequency tracks how much the overlay network is thrashing.

Mechanism (consistent with the earlier forensics in this thread): each network change makes Chromium tear down and respawn its NetworkService utility process — clean teardown, fresh helpers check in within the same second, no OS kill, no crash report. But the Electron main process then latches main-process networking is broken until relaunch and never rebinds to the respawned service → blank renderer sitting on an idle, healthy network stack (a netlog captured from the blank state shows 0 sockets, 0 sessions, 0 events, healthy DNS config).

Repro (macOS, ~1 min): launch Claude Desktop and let it settle, then toggle an overlay/VPN network off and on — tailscale down && tailscale up. The window blanks on the up. Any network-change source should trigger it (VPN connect/disconnect, Wi-Fi↔Ethernet switch, sleep/wake).

Fix direction: on child-process-gone for the NetworkService, rebind and resume requests instead of latching broken-until-relaunch. This would explain the many "blank for months, across versions" reports — they're disproportionately from people on VPNs, overlay networks (Tailscale/WARP), or corporate networks that reconfigure routes frequently.

dballing · 2 months ago

I’ve had this failure mode happen without any sort of network transition.

Showing cached comments. Read the full discussion on GitHub ↗