[GH-ISSUE #6897] [client] netbird-ui 0.75.0 claims org.kde.StatusNotifierWatcher on Cinnamon, breaking every SNI tray icon #11635

Open
opened 2026-08-05 01:30:14 -04:00 by saavagebueno · 1 comment
Owner

Originally created by @pawel-gla on GitHub (Jul 25, 2026).
Original GitHub issue: https://github.com/netbirdio/netbird/issues/6897

Describe the problem

Since upgrading to 0.75.0, netbird-ui claims the org.kde.StatusNotifierWatcher bus name on Linux Mint / Cinnamon, where the desktop already ships its own watcher (xapp-sn-watcher, from xapps-common). NetBird wins the startup race, xapp-sn-watcher exits silently, and from then on every StatusNotifierItem app in the session is routed through NetBird's XEmbed host instead of the desktop's.

NetBird's XEmbed host docks a window into the Cinnamon systray but never paints it, so each proxied indicator renders as a solid black square in the panel — NetBird's own icon included. Five apps were affected here (pCloud, CopyQ, Cryptomator, NetBird, and one more).

This looks like a side effect of the "native XEmbed host" added in 0.75.0 for minimal WMs (#4095). The fallback is useful; the problem is that it activates on a desktop that already provides a watcher.

Expected behaviour

netbird-ui should only provide org.kde.StatusNotifierWatcher when the desktop genuinely does not. Concretely:

  1. Request the name with DBUS_NAME_FLAG_DO_NOT_QUEUE and wait a moment before claiming it, so a DE-provided watcher that starts in the session's panel phase wins.
  2. Watch NameOwnerChanged and release the name if a real watcher appears later, re-registering as a plain SNI client.
  3. Consider skipping the fallback entirely when XDG_CURRENT_DESKTOP is a desktop known to ship a watcher (X-Cinnamon, XFCE, KDE, …).

Actual behaviour

Session log, 13.3 s after login — NetBird takes the name, then starts proxying other apps' indicators:

tray_watcher_linux.go:166: StatusNotifierWatcher: active on session bus (enables tray on minimal WMs)
tray_watcher_linux.go:92:  StatusNotifierWatcher: XEmbed tray icon created for :1.84
tray_watcher_linux.go:92:  StatusNotifierWatcher: XEmbed tray icon created for :1.93
tray_watcher_linux.go:92:  StatusNotifierWatcher: XEmbed tray icon created for :1.115
tray_watcher_linux.go:92:  StatusNotifierWatcher: XEmbed tray icon created for :1.108
tray_watcher_linux.go:92:  StatusNotifierWatcher: XEmbed tray icon created for :1.130

Cinnamon logs each of those proxy windows as unidentifiable:

JS LOG: [LookingGlass/info] Adding systray: unknown (1x1px)   (×5)

The five windows carry no WM_CLASS, no WM_NAME and no _NET_WM_PID. Querying the X-Resource extension traces all five to the netbird-ui PID. They are correctly sized and positioned (22×22 in their sockets) — they are simply never painted, hence black.

Secondary bug: NetBird's watcher object does not implement org.freedesktop.DBus.Properties, so clients that introspect it fail outright. An Electron app (pCloud) three seconds after NetBird registered:

ERROR:object_proxy.cc(576)] Failed to call method: org.freedesktop.DBus.Properties.Get:
object_path= /StatusNotifierWatcher:
org.freedesktop.DBus.Error.UnknownInterface: Object does not implement the interface
'org.freedesktop.DBus.Properties'

RegisteredStatusNotifierItems, IsStatusNotifierHostRegistered and ProtocolVersion are all properties in the SNI spec, so they must be readable via org.freedesktop.DBus.Properties.

Steps to reproduce

  1. Linux Mint 22.3 / Cinnamon 6.6.9, X11, with xapps-common installed (default).
  2. Have a few SNI/AppIndicator apps set to autostart.
  3. Install netbird-ui 0.75.0 with its autostart entry and log in.
  4. dbus-send --session --dest=org.freedesktop.DBus --print-reply /org/freedesktop/DBus org.freedesktop.DBus.GetNameOwner string:org.kde.StatusNotifierWatcher → the owner is netbird-ui, not xapp-sn-watcher.
  5. The affected indicators show as black squares in the panel.

Reloading the Cinnamon systray applet does not help — the unpainted windows belong to netbird-ui, not to the panel. Killing netbird-ui makes them disappear immediately.

Workaround

Delay netbird-ui so the desktop's watcher registers first — in ~/.config/autostart/netbird.desktop:

X-GNOME-Autostart-Delay=10

With that, xapp-sn-watcher owns the name, netbird-ui stands down to a plain SNI client, and NetBird's own tray icon renders correctly through XApp along with everyone else's.

Are you using NetBird Cloud or self-hosted?

NetBird Cloud

NetBird version

0.75.0 (netbird and netbird-ui, amd64 .deb)

Operating system

Linux Mint 22.3, Cinnamon 6.6.9, X11, xapps-common 3.2.2, XDG_CURRENT_DESKTOP=X-Cinnamon

Originally created by @pawel-gla on GitHub (Jul 25, 2026). Original GitHub issue: https://github.com/netbirdio/netbird/issues/6897 ### Describe the problem Since upgrading to **0.75.0**, `netbird-ui` claims the `org.kde.StatusNotifierWatcher` bus name on Linux Mint / Cinnamon, where the desktop already ships its own watcher (`xapp-sn-watcher`, from `xapps-common`). NetBird wins the startup race, `xapp-sn-watcher` exits silently, and from then on **every** StatusNotifierItem app in the session is routed through NetBird's XEmbed host instead of the desktop's. NetBird's XEmbed host docks a window into the Cinnamon systray but never paints it, so each proxied indicator renders as a **solid black square** in the panel — NetBird's own icon included. Five apps were affected here (pCloud, CopyQ, Cryptomator, NetBird, and one more). This looks like a side effect of the "native XEmbed host" added in 0.75.0 for minimal WMs (#4095). The fallback is useful; the problem is that it activates on a desktop that already provides a watcher. ### Expected behaviour `netbird-ui` should only provide `org.kde.StatusNotifierWatcher` when the desktop genuinely does not. Concretely: 1. Request the name with `DBUS_NAME_FLAG_DO_NOT_QUEUE` **and** wait a moment before claiming it, so a DE-provided watcher that starts in the session's panel phase wins. 2. Watch `NameOwnerChanged` and release the name if a real watcher appears later, re-registering as a plain SNI client. 3. Consider skipping the fallback entirely when `XDG_CURRENT_DESKTOP` is a desktop known to ship a watcher (`X-Cinnamon`, `XFCE`, `KDE`, …). ### Actual behaviour Session log, 13.3 s after login — NetBird takes the name, then starts proxying other apps' indicators: ``` tray_watcher_linux.go:166: StatusNotifierWatcher: active on session bus (enables tray on minimal WMs) tray_watcher_linux.go:92: StatusNotifierWatcher: XEmbed tray icon created for :1.84 tray_watcher_linux.go:92: StatusNotifierWatcher: XEmbed tray icon created for :1.93 tray_watcher_linux.go:92: StatusNotifierWatcher: XEmbed tray icon created for :1.115 tray_watcher_linux.go:92: StatusNotifierWatcher: XEmbed tray icon created for :1.108 tray_watcher_linux.go:92: StatusNotifierWatcher: XEmbed tray icon created for :1.130 ``` Cinnamon logs each of those proxy windows as unidentifiable: ``` JS LOG: [LookingGlass/info] Adding systray: unknown (1x1px) (×5) ``` The five windows carry no `WM_CLASS`, no `WM_NAME` and no `_NET_WM_PID`. Querying the X-Resource extension traces all five to the `netbird-ui` PID. They are correctly sized and positioned (22×22 in their sockets) — they are simply never painted, hence black. **Secondary bug:** NetBird's watcher object does not implement `org.freedesktop.DBus.Properties`, so clients that introspect it fail outright. An Electron app (pCloud) three seconds after NetBird registered: ``` ERROR:object_proxy.cc(576)] Failed to call method: org.freedesktop.DBus.Properties.Get: object_path= /StatusNotifierWatcher: org.freedesktop.DBus.Error.UnknownInterface: Object does not implement the interface 'org.freedesktop.DBus.Properties' ``` `RegisteredStatusNotifierItems`, `IsStatusNotifierHostRegistered` and `ProtocolVersion` are all properties in the SNI spec, so they must be readable via `org.freedesktop.DBus.Properties`. ### Steps to reproduce 1. Linux Mint 22.3 / Cinnamon 6.6.9, X11, with `xapps-common` installed (default). 2. Have a few SNI/AppIndicator apps set to autostart. 3. Install `netbird-ui` 0.75.0 with its autostart entry and log in. 4. `dbus-send --session --dest=org.freedesktop.DBus --print-reply /org/freedesktop/DBus org.freedesktop.DBus.GetNameOwner string:org.kde.StatusNotifierWatcher` → the owner is `netbird-ui`, not `xapp-sn-watcher`. 5. The affected indicators show as black squares in the panel. Reloading the Cinnamon systray applet does not help — the unpainted windows belong to `netbird-ui`, not to the panel. Killing `netbird-ui` makes them disappear immediately. ### Workaround Delay `netbird-ui` so the desktop's watcher registers first — in `~/.config/autostart/netbird.desktop`: ``` X-GNOME-Autostart-Delay=10 ``` With that, `xapp-sn-watcher` owns the name, `netbird-ui` stands down to a plain SNI client, and NetBird's own tray icon renders correctly through XApp along with everyone else's. ### Are you using NetBird Cloud or self-hosted? NetBird Cloud ### NetBird version 0.75.0 (`netbird` and `netbird-ui`, amd64 .deb) ### Operating system Linux Mint 22.3, Cinnamon 6.6.9, X11, `xapps-common` 3.2.2, `XDG_CURRENT_DESKTOP=X-Cinnamon`
Author
Owner

@linear-code[bot] commented on GitHub (Jul 25, 2026):

NET-1440

<!-- gh-comment-id:5080600988 --> @linear-code[bot] commented on GitHub (Jul 25, 2026): <!-- linear-linkback --> <p><a href="https://linear.app/netbird/issue/NET-1440">NET-1440</a></p>
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: DYNR/netbird#11635