Slack Snap 4.51.180 (revision 254) loses KDE Plasma tray icon

After upgrading the Slack snap from revision 253 (v4.50.143) to 254 (v4.51.180) the Slack system tray icon no longer appears in KDE.

This has been observed on Ubuntu 26.04 LTS with KDE Plasma 6 (Wayland). Revision 253 works correctly on the same system.

Slack starts and functions normally and a StatusNotifierItem is registered, but the tray icon is not displayed.

Launching the executable directly from the snap revision displays the tray icon:

/snap/slack/254/bin/electron-launch \
/snap/slack/254/usr/lib/slack/slack --no-sandbox

This suggests the Slack snap itself still contains working tray icon functionality. The difference is related to the way Snap launches Slack, AppArmor confinement or runtime environment.

The regression might also be related to changes introduced with the move from core22/gnome-42-2204 to core24/gnome-46-2404

1 Like

Same thing in GNOME. I had to run sudo snap revert slack. Lately, every Slack Snap update seems to cause some little issue.

This seems to be related to https://bugs.launchpad.net/snapd/+bug/2161950

I also have the same issue in my app: [Bug]: System tray icon missing under Snap due to snapd unity7 AppArmor policy · Issue #420 · julian-alarcon/prospect-mail · GitHub

Found the source of the issue (Chrome change):

Found the root cause (thanks to LLM):

Root cause: Electron 43 (Chromium 150), one specific Chromium commit

The commit

-const char kPathStatusNotifierItem[] = "/StatusNotifierItem";
+const char kPathStatusNotifierItem[] = "/org/chromium/StatusNotifierItem";

It also added ObjectPathFromId(), appending a per-process counter → /org/chromium/StatusNotifierItem/1. Intent: fix object-path collisions when one process creates multiple tray icons. snapd’s unity7 AppArmor template only whitelists /StatusNotifierItem and /org/ayatana/NotificationItem/*, so the new path is denied under strict confinement and the icon never appears.

The boundary (verified from Chromium git tags)

  • Chromium 138–149: /StatusNotifierItem → works
  • Chromium 150–151 (Electron 43): /org/chromium/StatusNotifierItem/N → broken under snap
  • Chromium 152+: reverted back to /StatusNotifierItem

The revert (good news)

  • Chromium 152, commit c4cdb82ba867f5dd994548f4fbe0bc1568a4623a — “Fix status icon collision on shared D-Bus connection” (crbug.com/530633700)
  • Restores /StatusNotifierItem and instead disambiguates via unique well-known service names.

So the breakage is bounded to Chromium 150–151, i.e. Electron 43 (and possibly Electron 44 if it lands on 151). Once Electron ships on Chromium 152+, the snap tray will work again with no changes on our side.

Note on the version table

The agent verified from each Electron tag’s DEPS file that our earlier “E39 = Chrome 138” mapping was slightly off (E39.2.7 actually bundles Chromium 142). It doesn’t change the conclusion, the path change is squarely Chromium 150 = Electron 43. Corrected mapping:

Electron Chromium Tray path
39 142 /StatusNotifierItem
40 144 /StatusNotifierItem
41 146 /StatusNotifierItem
42 148 /StatusNotifierItem
43 150 /org/chromium/StatusNotifierItem/N

Ok, I used electron 44 alpha that uses Chrome 152 and now there is another similar error, notification still fail.

Chromium 152 (Electron 44) changes the failure mode: now a name-ownership denial

Testing an updated Electron app on GNOME/Ubuntu with strict confinement shows the tray icon regression has shifted, not resolved, across recent Chromium versions. There are now two distinct snap-incompatible behaviors:

Chromium 150-151 (Electron 43): object-path denial

Chromium commit 7852522 (“Fix D-Bus status icon collision and Wayland suppression”) changed the exported StatusNotifierItem object path:

-const char kPathStatusNotifierItem[] = "/StatusNotifierItem";
+const char kPathStatusNotifierItem[] = "/org/chromium/StatusNotifierItem";

It also appends a per-process counter, producing /org/chromium/StatusNotifierItem/1. The unity7 template only allows /{StatusNotifierItem,org/ayatana/NotificationItem/*}, so the new path is denied:

apparmor="DENIED" operation="dbus_method_call" bus="session"
  path="/org/chromium/StatusNotifierItem/1"
  interface="org.freedesktop.DBus.Properties" member="Get"
  label="snap.<app>.<app>" peer=gnome-shell

Chromium 152 (Electron 44): well-known name-ownership denial

Chromium commit 8043132 (“Fix status icon collision on shared D-Bus connection”, crbug.com/530633700) restores the object path back to /StatusNotifierItem, so the path denial above is gone. But to disambiguate multiple icons it now claims a well-known service name via RequestOwnership():

service_name_ = base::StrCat({"org.freedesktop.StatusNotifierItem-",
                              PID, "-", service_id_});

Chromium 149 and earlier never requested a well-known name at all; they registered with the connection’s unique name (:1.x), which needs no ownership grant. That is why older Electron snaps worked.

The unity7 template only whitelists ownership of the KDE-spec name:

dbus (bind)
    bus=session
    name=org.kde.StatusNotifierItem-[0-9]*,

It does not cover org.freedesktop.StatusNotifierItem-*, so under Chromium 152 the snap fails at a new point:

Failed to get the ownership of org.freedesktop.StatusNotifierItem-<PID>-1:
  Connection ":1.x" is not allowed to own the service
  "org.freedesktop.StatusNotifierItem-<PID>-1" due to AppArmor policy
[...] org.freedesktop.StatusNotifierItem-<PID>-1 is not owned by the bus

The tray icon never appears.

Summary across versions (verified against Chromium git tags and a strict-confined build):

Chromium Electron Object path Well-known name Result under unity7
≤ 149 ≤ 42 /StatusNotifierItem none (unique conn name) works
150-151 43 /org/chromium/StatusNotifierItem/N none denied (object path)
152+ 44 /StatusNotifierItem org.freedesktop.StatusNotifierItem-<PID>-<ID> denied (name ownership)

The unity7 (and/or desktop-legacy) template needs to allow ownership of org.freedesktop.StatusNotifierItem-* (matching the well-known name Chromium 152+ now uses), in addition to the existing org.kde.StatusNotifierItem-[0-9]* rule. Ideally also permit the /org/chromium/StatusNotifierItem/* object path so Chromium 150-151 based apps are covered too. Without this, all Chromium-based snaps (Electron apps, Chromium, Slack, etc.) lose their tray icon on any build newer than Chromium 149.

1 Like