Skip to content

OpenCode Desktop v1.17.14 can get stuck in an infinite startup crash loop with: Error: Notification server not found: http://[server-ip]:4096 #35686

Description

@jones

Description

Bug

OpenCode Desktop v1.17.14 can get stuck in an infinite startup crash loop with: Error: Notification server not found: http://[server-ip]:4096

The error appears shortly after app startup, and there is no way to clear it from the UI. Restart and Reload Webview do not fix it; the same error comes back on the next launch.

What Happened

I encountered this after a hard crash on macOS 27.0 beta. The entire macOS UI froze, so I had to hard reset the computer.

After rebooting, OpenCode Desktop was stuck in this state whenever I opened it. The IP address in the error is an OpenCode server on my local network, and I can connect to that server normally outside of this crash loop.

Expected Behavior

OpenCode Desktop should not crash during startup because notification state is missing for a server key.

If notification state cannot be found for the active server, the app should continue loading and treat notifications for that server as empty/unavailable.

Actual Behavior

https://i.imgur.com/PrzmNdu.png

The renderer crashes during app startup with:

Error: Notification server not found: http://[server-ip]:4096
    at ensure (oc://renderer/assets/main-B1osgIPb.js:85602:24)
    at selected (oc://renderer/assets/main-B1osgIPb.js:85634:28)
    at Object.unseenCount (oc://renderer/assets/main-B1osgIPb.js:85648:37)
    at oc://renderer/assets/main-B1osgIPb.js:109261:107
    at Array.reduce (<anonymous>)
    at Object.fn (oc://renderer/assets/main-B1osgIPb.js:109261:47)
    at runComputation (oc://renderer/assets/main-B1osgIPb.js:487:22)
    at updateComputation (oc://renderer/assets/main-B1osgIPb.js:470:3)
    at Object.readSignal (oc://renderer/assets/main-B1osgIPb.js:403:67)
    at Object.fn (oc://renderer/assets/main-B1osgIPb.js:109269:72)
    at runComputation (oc://renderer/assets/main-B1osgIPb.js:487:22)
    at updateComputation (oc://renderer/assets/main-B1osgIPb.js:470:3)
    at createMemo (oc://renderer/assets/main-B1osgIPb.js:119:3)
    at ProjectIcon (oc://renderer/assets/main-B1osgIPb.js:109269:18)

This leaves the app unusable.

Debugging Notes

The crash appears to come from a stale/missing server key reaching the notification context.

At render time, a project icon asks for unseen notification count:

ProjectIcon
  -> notification.project.unseenCount(directory)
  -> selected()
  -> ensure(activeServer())

The relevant source path appears to be:

packages/app/src/pages/layout/sidebar-items.tsx
  ProjectIcon renders unseen notification count

packages/app/src/context/notification.tsx
  selected() calls ensure(activeServer())
  ensure() looks up the active server key in global.servers.list()

The failing condition is:

active server key: http://[server-ip]:4096
current server list: sidecar only

So notification lookup tries to resolve:

http://[server-ip]:4096

but the active runtime server list does not contain a connection with that key. It only contains the desktop sidecar connection.

The current behavior is fatal:

const conn = global.servers.list().find((item) => ServerConnection.key(item) === key)
if (!conn) throw new Error(`Notification server not found: ${key}`)

Because this throw happens during a Solid reactive render path, the renderer crashes. On reload, the app restores the same persisted/default state, reaches the same render path, and crashes again. That creates the infinite loop.

Suspected State Mismatch

From debugging the local state, this looked like a mismatch between persisted/default server identity and the runtime server list.

The stale key came from the configured/default remote server:

defaultServerUrl = http://[server-ip]:4096

But on desktop startup, the available runtime server list contained the local sidecar connection rather than a direct connection keyed by that remote URL.

After the hard macOS reset, persisted state still referenced the remote server key in project/session state, but the server list no longer had a corresponding server entry. That made notification state lookup fail during initial rendering.

The likely shape was:

server.key / active notification key:
  http://[server-ip]:4096

global.servers.list():
  sidecar

persisted project/session state:
  references http://[server-ip]:4096

Why This Is Fatal

The missing server only affects notification badge state, but the exception is thrown synchronously while rendering the app shell/sidebar. That means a cosmetic notification lookup can crash the whole desktop renderer.

Expected fallback behavior for this path would be something like:

ready: false
session notifications: []
project notifications: []
unseen counts: 0
markViewed: no-op

That would preserve debuggability while preventing the renderer from crashing.

Temporary fix

I was able to clear the error temporarily by deleting opencode.global.dat. However, the error returned after I opened the app and connected to the server again.

I was able to stop the crash loop by removing the saved defaultServerUrl value from the OpenCode Desktop settings/config, so the app no longer started with the stale remote server key.

Environment

  • OpenCode Desktop: v1.17.14
  • macOS: 27.0 beta
  • Server: OpenCode server on local network at http://[server-ip]:4096

Screenshot

https://i.imgur.com/PrzmNdu.png

Plugins

None

OpenCode version

v1.17.14

Steps to reproduce

  1. Configure OpenCode Desktop v1.17.14 with defaultServerUrl pointing to a remote/local-network OpenCode server, for example http://[server-ip]:4096.

  2. Have persisted desktop state that references that server key in project/session state, but where the server list no longer contains a matching server entry.

  3. Launch OpenCode Desktop.

  4. The app attempts to render project/session notification badges during startup.

  5. The renderer crashes with:

Error: Notification server not found: http://[server-ip]:4096

Screenshot and/or share link

https://i.imgur.com/PrzmNdu.png

Operating System

MacOS 27 Beta. Version 27.0.0: Mon Jun 15 22:59:49 PDT 2026; root:xnu-13432.0.5.501.1~2/RELEASE_ARM64_T6020 arm64

Terminal

N/A, this is the opencode desktop app

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions