Skip to content

Desktop notification sound plays repeatedly upon opening and can't be dismissed #15302

Closed as not planned

Description

@itsjling

Description

Every time I open OpenCode desktop, a sound plays repeatedly. I think it's some kind of notification / unread sound. Even if I clear all the red notification indicators, it comes back when I open the app again.

This also happens if I open the web view on my iPhone.

This started around 1-2 weeks ago.

Plugins

opencode-handoff

OpenCode version

1.2.15

Steps to reproduce

Open OpenCode desktop.

Screenshot and/or share link

555698756-11a3beaf-a1de-474b-aa53-fa12fbfbdd7d.mp4

Operating System

macOS 26.3 / iOS 26.3

Terminal

Ghostty

Activity

  1. johanohly commented on Apr 8, 2026

    @johanohly

    I have the exact same issue, also on macOS 26.3.

  2. removed
    bugSomething isn't working
    webRelates to opencode on web / desktop
    on May 3, 2026
  3. Ahmet-Dedeler commented on Jun 1, 2026

    @Ahmet-Dedeler

    Did some digging into this on 1.15.13 (macOS, Apple Silicon) and I'm fairly confident I found the root cause. It's the "error" notification sound being replayed from the event backlog on every connect, not an unread/notification-dot sound.

    Root cause

    The desktop app is event-sourced. On launch the Electron client connects to the local sidecar server and subscribes to the event stream, and the server replies with a backlog of every event since the client's last-seen sequence (compactBacklog({ remoteEntries: entriesAfter(journal, startSequence) })), concatenated ahead of the live subscription:

    const backlog = yield* compactBacklog({
      remoteEntries: entriesAfter(ensureJournal(storeId), startSequence),
      compactors
    });
    return Stream.fromArray(backlog).pipe(Stream.concat(Stream.fromSubscription(subscription)...))

    That backlog includes historical session.error events, and they run through the same handler as live events — there's no "this is a replay, stay quiet" guard:

    const handleSessionError = (directory, event, time) => {
      void lookup(directory, sessionID).then((session) => {
        if (session?.parentID) return;
        if (settings.sounds.errorsEnabled()) {
          void playSoundById(settings.sounds.errors());   // default: "nope-03"
        }
        ...

    So every session that previously ended in an error re-fires session.error on connect → plays the nope error sound. With a few dozen errored sessions in the journal (aborted runs, APIError, ProviderAuthError, etc.), you get a rapid burst of the failure sound for ~10-15s until the backlog drains. It "can't be dismissed" because clearing the red dots doesn't change the journal — the same backlog replays on the next connect (and on the iPhone web view, which is just another client doing the same backlog sync).

    The same path applies to settings.sounds.agentEnabled (turn-complete / staplebops-01) and settings.sounds.permissionsEnabled, all of which default to true — errors are just the most noticeable because failed sessions accumulate.

    Suggested fix

    Suppress notification sounds (and OS notifications) for backlog/replayed events — only play them for events arriving on the live subscription. e.g. tag backlog entries and gate the playSoundById(...) / platform.notify(...) calls in handleSessionError / handleSessionIdle / the permission handler on !isReplay. The events should still be appended to the notification list; they just shouldn't (re-)alert audibly.

    Workaround for anyone hitting this now

    Settings → General → Sounds → "Errors" → Off (flips errorsEnabled to false). Turn off "Agent"/"Permissions" there too if you want full silence. Doesn't fix the underlying replay, but stops the noise.

  4. exoJSON commented on Jun 18, 2026

    @exoJSON

    Yes, this is still a very annoying and active bug. It makes the app feel broken, even though it isn't.

    Thank you @Ahmet-Dedeler, that's a good workaround for now.

    I would suggest adding date metadata to the notification sender. That way it could send only fresh/not-previously-announced errors and notifications.

    I don't see much point in receiving a barrage of sounds/notifications. It becomes noise and nothing useful comes of it.

  5. github-actions commented on Aug 18, 2026

    @github-actions
    Contributor

    To stay organized issues are automatically closed after 60 days of no activity. If the issue is still relevant please open a new one.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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