[GH-ISSUE #4244] NetBird UI tray menu rapid refreshes #8984

Open
opened 2026-08-05 01:20:19 -04:00 by saavagebueno · 19 comments
Owner

Originally created by @aronmal on GitHub (Jul 29, 2025).
Original GitHub issue: https://github.com/netbirdio/netbird/issues/4244

Describe the problem

The NetBird UI tray icon menu refreshes approximately every 2 seconds, making it extremely difficult to interact with. When I click the icon, a pop-up appears, but if I try to hover over or click any sub-menu items, the entire menu resets, requiring very fast interaction to open any sub-menu. This behavior is accompanied by the log message "Exit node menu already up to date" appearing in the terminal every 2 seconds when launching NetBird from there.

To Reproduce

  1. Start NetBird (either via the UI or from the terminal).
  2. Click on the NetBird tray icon to open the menu.
  3. Attempt to hover over or click any item within the menu to expand a sub-menu.
  4. Observe that the menu refreshes/resets every 2 seconds, interrupting interaction.

Expected behavior

The NetBird UI tray icon menu should remain stable and allow for normal interaction, including hovering over and clicking menu items without refreshing every 2 seconds. The "Exit node menu already up to date" log message should not cause UI instability.

Are you using NetBird Cloud?

Yes, NetBird Cloud.

NetBird version

0.52.1
But I had this issue also before upgrading today.

Is any other VPN software installed?

"No"

Debug output

$ netbird-ui
2025-07-30T00:34:40+02:00 DEBG version/update.go:115: fetching version info from https://pkgs.netbird.io/releases/latest/version
2025-07-30T00:34:40+02:00 WARN client/ui/profile.go:448: failed to get active profile state: profile state file does not exist
2025-07-30T00:34:40+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date
2025-07-30T00:34:40+02:00 INFO client/ui/event/event.go:76: subscribed to daemon events
2025-07-30T00:34:52+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date
2025-07-30T00:34:54+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date
2025-07-30T00:34:56+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date
2025-07-30T00:34:59+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date
2025-07-30T00:35:01+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date
2025-07-30T00:35:03+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date
2025-07-30T00:35:05+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date
2025-07-30T00:35:07+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date
2025-07-30T00:35:08+02:00 INFO client/ui/event_handler.go:222: running command: /usr/bin/netbird-ui --profiles=true --daemon-addr=unix:///var/run/netbird.sock
2025-07-30T00:35:08+02:00 DEBG version/update.go:115: fetching version info from https://pkgs.netbird.io/releases/latest/version
2025-07-30T00:35:09+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date
2025-07-30T00:35:11+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date
2025-07-30T00:35:13+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date
2025-07-30T00:35:15+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date
2025-07-30T00:35:17+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date
2025-07-30T00:35:18+02:00 WARN client/ui/profile.go:448: failed to get active profile state: profile state file does not exist
2025-07-30T00:35:19+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date
2025-07-30T00:35:21+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date
2025-07-30T00:35:23+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date
2025-07-30T00:35:24+02:00 WARN client/ui/profile.go:448: failed to get active profile state: profile state file does not exist
2025-07-30T00:35:25+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date
2025-07-30T00:35:27+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date
2025-07-30T00:35:29+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date
2025-07-30T00:35:31+02:00 INFO client/ui/event_handler.go:232: command 'profiles true' completed successfully
2025-07-30T00:35:31+02:00 WARN client/ui/profile.go:448: failed to get active profile state: profile state file does not exist
2025-07-30T00:35:31+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date
2025-07-30T00:35:33+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date
2025-07-30T00:35:35+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date

I tried to open the porfiles sub menu with success when being fast. But even expanding 'Setting' or 'About' by clicking, they collapse a second later.

Additional context

I am using Pop!_OS. The "Exit node menu already up to date" log message appears consistently every 2 seconds in the terminal when running NetBird, which seems to correlate with the UI refresh issue.

Have you tried these troubleshooting steps?

  • Reviewed client troubleshooting (if applicable)
  • Checked for newer NetBird versions
  • Searched for similar issues on GitHub (including closed ones)
  • Restarted the NetBird client
  • Disabled other VPN software
  • Checked firewall settings
Originally created by @aronmal on GitHub (Jul 29, 2025). Original GitHub issue: https://github.com/netbirdio/netbird/issues/4244 **Describe the problem** The NetBird UI tray icon menu refreshes approximately every 2 seconds, making it extremely difficult to interact with. When I click the icon, a pop-up appears, but if I try to hover over or click any sub-menu items, the entire menu resets, requiring very fast interaction to open any sub-menu. This behavior is accompanied by the log message "Exit node menu already up to date" appearing in the terminal every 2 seconds when launching NetBird from there. **To Reproduce** 1. Start NetBird (either via the UI or from the terminal). 2. Click on the NetBird tray icon to open the menu. 3. Attempt to hover over or click any item within the menu to expand a sub-menu. 4. Observe that the menu refreshes/resets every 2 seconds, interrupting interaction. **Expected behavior** The NetBird UI tray icon menu should remain stable and allow for normal interaction, including hovering over and clicking menu items without refreshing every 2 seconds. The "Exit node menu already up to date" log message should not cause UI instability. **Are you using NetBird Cloud?** Yes, NetBird Cloud. **NetBird version** ```0.52.1``` But I had this issue also before upgrading today. **Is any other VPN software installed?** "No" **Debug output** ``` $ netbird-ui 2025-07-30T00:34:40+02:00 DEBG version/update.go:115: fetching version info from https://pkgs.netbird.io/releases/latest/version 2025-07-30T00:34:40+02:00 WARN client/ui/profile.go:448: failed to get active profile state: profile state file does not exist 2025-07-30T00:34:40+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date 2025-07-30T00:34:40+02:00 INFO client/ui/event/event.go:76: subscribed to daemon events 2025-07-30T00:34:52+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date 2025-07-30T00:34:54+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date 2025-07-30T00:34:56+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date 2025-07-30T00:34:59+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date 2025-07-30T00:35:01+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date 2025-07-30T00:35:03+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date 2025-07-30T00:35:05+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date 2025-07-30T00:35:07+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date 2025-07-30T00:35:08+02:00 INFO client/ui/event_handler.go:222: running command: /usr/bin/netbird-ui --profiles=true --daemon-addr=unix:///var/run/netbird.sock 2025-07-30T00:35:08+02:00 DEBG version/update.go:115: fetching version info from https://pkgs.netbird.io/releases/latest/version 2025-07-30T00:35:09+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date 2025-07-30T00:35:11+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date 2025-07-30T00:35:13+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date 2025-07-30T00:35:15+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date 2025-07-30T00:35:17+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date 2025-07-30T00:35:18+02:00 WARN client/ui/profile.go:448: failed to get active profile state: profile state file does not exist 2025-07-30T00:35:19+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date 2025-07-30T00:35:21+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date 2025-07-30T00:35:23+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date 2025-07-30T00:35:24+02:00 WARN client/ui/profile.go:448: failed to get active profile state: profile state file does not exist 2025-07-30T00:35:25+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date 2025-07-30T00:35:27+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date 2025-07-30T00:35:29+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date 2025-07-30T00:35:31+02:00 INFO client/ui/event_handler.go:232: command 'profiles true' completed successfully 2025-07-30T00:35:31+02:00 WARN client/ui/profile.go:448: failed to get active profile state: profile state file does not exist 2025-07-30T00:35:31+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date 2025-07-30T00:35:33+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date 2025-07-30T00:35:35+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date ``` I tried to open the porfiles sub menu with success when being fast. But even expanding 'Setting' or 'About' by clicking, they collapse a second later. **Additional context** I am using **Pop!_OS**. The "Exit node menu already up to date" log message appears consistently every 2 seconds in the terminal when running NetBird, which seems to correlate with the UI refresh issue. **Have you tried these troubleshooting steps?** - [x] Reviewed [client troubleshooting](https://docs.netbird.io/how-to/troubleshooting-client) (if applicable) - [x] Checked for newer NetBird versions - [x] Searched for similar issues on GitHub (including closed ones) - [x] Restarted the NetBird client - [x] Disabled other VPN software - [x] Checked firewall settings
saavagebueno added the bugclient-uitriage-neededlinux labels 2026-08-05 01:20:19 -04:00
Author
Owner
<!-- gh-comment-id:3134335731 --> @aronmal commented on GitHub (Jul 29, 2025): https://github.com/user-attachments/assets/d0d16898-4d20-448d-8fbf-650d0e041e1b
Author
Owner

@gza commented on GitHub (Aug 20, 2025):

This can be at the limit of usability...

https://github.com/user-attachments/assets/ac135615-7a69-49d0-b349-c8662eab5d95

v0.54.2 / Linux Manjaro / Gnome

<!-- gh-comment-id:3206906148 --> @gza commented on GitHub (Aug 20, 2025): This can be at the limit of usability... https://github.com/user-attachments/assets/ac135615-7a69-49d0-b349-c8662eab5d95 v0.54.2 / Linux Manjaro / Gnome
Author
Owner

@AxsGuard-lode commented on GitHub (Aug 25, 2025):

I'm having the same issue, albeit not as bad as gza.
I'm running an Ubuntu 24.04.1 LTS with GNOME Shell 46.0

<!-- gh-comment-id:3219011515 --> @AxsGuard-lode commented on GitHub (Aug 25, 2025): I'm having the same issue, albeit not as bad as gza. I'm running an Ubuntu 24.04.1 LTS with GNOME Shell 46.0
Author
Owner

@ian-knight-acacia commented on GitHub (Aug 27, 2025):

We are currently experiencing this issue on 30+ machines in our fleet running Ubuntu 22.04 and 24.04, both in Gnome and KDE.

<!-- gh-comment-id:3230625671 --> @ian-knight-acacia commented on GitHub (Aug 27, 2025): We are currently experiencing this issue on 30+ machines in our fleet running Ubuntu 22.04 and 24.04, both in Gnome and KDE.
Author
Owner

@aronmal commented on GitHub (Aug 28, 2025):

I also just noticed in my journal is full of:

journalctl -xe

Aug 28 14:24:08 pop-os netbird.desktop[182487]: 2025-08-28T14:24:08+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date
Aug 28 14:24:09 pop-os gnome-shell[1896]: Unhandled promise rejection. To suppress this warning, add an error handler to your promise chain with .catch() or a try-catch block around your aw>
                                            refreshPropertyOnProxy@/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/util.js:43:38
                                            _translateNewSignals/<@/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/appIndicator.js:212:18
                                            _translateNewSignals@/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/appIndicator.js:211:50
                                            _onProxySignal/<@/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/appIndicator.js:228:56
                                            _onProxySignal@/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/appIndicator.js:228:38
Aug 28 14:24:10 pop-os netbird.desktop[182487]: 2025-08-28T14:24:10+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date
Aug 28 14:24:10 pop-os gnome-shell[1896]: Unhandled promise rejection. To suppress this warning, add an error handler to your promise chain with .catch() or a try-catch block around your aw>
                                            refreshPropertyOnProxy@/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/util.js:43:38
                                            _translateNewSignals/<@/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/appIndicator.js:212:18
                                            _translateNewSignals@/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/appIndicator.js:211:50
                                            _onProxySignal/<@/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/appIndicator.js:228:56
                                            _onProxySignal@/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/appIndicator.js:228:38
Aug 28 14:24:12 pop-os netbird.desktop[182487]: 2025-08-28T14:24:12+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date
Aug 28 14:24:12 pop-os gnome-shell[1896]: Unhandled promise rejection. To suppress this warning, add an error handler to your promise chain with .catch() or a try-catch block around your aw>
                                            refreshPropertyOnProxy@/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/util.js:43:38
                                            _translateNewSignals/<@/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/appIndicator.js:212:18
                                            _translateNewSignals@/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/appIndicator.js:211:50
                                            _onProxySignal/<@/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/appIndicator.js:228:56
                                            _onProxySignal@/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/appIndicator.js:228:38
Aug 28 14:24:14 pop-os netbird.desktop[182487]: 2025-08-28T14:24:14+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date
Aug 28 14:24:14 pop-os gnome-shell[1896]: Unhandled promise rejection. To suppress this warning, add an error handler to your promise chain with .catch() or a try-catch block around your aw>
                                            refreshPropertyOnProxy@/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/util.js:43:38
                                            _translateNewSignals/<@/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/appIndicator.js:212:18
                                            _translateNewSignals@/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/appIndicator.js:211:50
                                            _onProxySignal/<@/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/appIndicator.js:228:56
                                            _onProxySignal@/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/appIndicator.js:228:38
Aug 28 14:24:16 pop-os netbird.desktop[182487]: 2025-08-28T14:24:16+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date
Aug 28 14:24:16 pop-os gnome-shell[1896]: Unhandled promise rejection. To suppress this warning, add an error handler to your promise chain with .catch() or a try-catch block around your aw>
                                            refreshPropertyOnProxy@/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/util.js:43:38
                                            _translateNewSignals/<@/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/appIndicator.js:212:18
                                            _translateNewSignals@/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/appIndicator.js:211:50
                                            _onProxySignal/<@/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/appIndicator.js:228:56
                                            _onProxySignal@/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/appIndicator.js:228:38

And I rathes suspect the netbird-ui to crash/refresh causing this warning of by appIndicator. But just in case it might be any help, here it is.

<!-- gh-comment-id:3233300858 --> @aronmal commented on GitHub (Aug 28, 2025): I also just noticed in my journal is full of: `journalctl -xe` ``` Aug 28 14:24:08 pop-os netbird.desktop[182487]: 2025-08-28T14:24:08+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date Aug 28 14:24:09 pop-os gnome-shell[1896]: Unhandled promise rejection. To suppress this warning, add an error handler to your promise chain with .catch() or a try-catch block around your aw> refreshPropertyOnProxy@/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/util.js:43:38 _translateNewSignals/<@/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/appIndicator.js:212:18 _translateNewSignals@/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/appIndicator.js:211:50 _onProxySignal/<@/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/appIndicator.js:228:56 _onProxySignal@/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/appIndicator.js:228:38 Aug 28 14:24:10 pop-os netbird.desktop[182487]: 2025-08-28T14:24:10+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date Aug 28 14:24:10 pop-os gnome-shell[1896]: Unhandled promise rejection. To suppress this warning, add an error handler to your promise chain with .catch() or a try-catch block around your aw> refreshPropertyOnProxy@/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/util.js:43:38 _translateNewSignals/<@/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/appIndicator.js:212:18 _translateNewSignals@/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/appIndicator.js:211:50 _onProxySignal/<@/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/appIndicator.js:228:56 _onProxySignal@/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/appIndicator.js:228:38 Aug 28 14:24:12 pop-os netbird.desktop[182487]: 2025-08-28T14:24:12+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date Aug 28 14:24:12 pop-os gnome-shell[1896]: Unhandled promise rejection. To suppress this warning, add an error handler to your promise chain with .catch() or a try-catch block around your aw> refreshPropertyOnProxy@/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/util.js:43:38 _translateNewSignals/<@/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/appIndicator.js:212:18 _translateNewSignals@/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/appIndicator.js:211:50 _onProxySignal/<@/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/appIndicator.js:228:56 _onProxySignal@/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/appIndicator.js:228:38 Aug 28 14:24:14 pop-os netbird.desktop[182487]: 2025-08-28T14:24:14+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date Aug 28 14:24:14 pop-os gnome-shell[1896]: Unhandled promise rejection. To suppress this warning, add an error handler to your promise chain with .catch() or a try-catch block around your aw> refreshPropertyOnProxy@/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/util.js:43:38 _translateNewSignals/<@/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/appIndicator.js:212:18 _translateNewSignals@/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/appIndicator.js:211:50 _onProxySignal/<@/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/appIndicator.js:228:56 _onProxySignal@/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/appIndicator.js:228:38 Aug 28 14:24:16 pop-os netbird.desktop[182487]: 2025-08-28T14:24:16+02:00 DEBG client/ui/network.go:376: Exit node menu already up to date Aug 28 14:24:16 pop-os gnome-shell[1896]: Unhandled promise rejection. To suppress this warning, add an error handler to your promise chain with .catch() or a try-catch block around your aw> refreshPropertyOnProxy@/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/util.js:43:38 _translateNewSignals/<@/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/appIndicator.js:212:18 _translateNewSignals@/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/appIndicator.js:211:50 _onProxySignal/<@/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/appIndicator.js:228:56 _onProxySignal@/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/appIndicator.js:228:38 ``` And I rathes suspect the netbird-ui to crash/refresh causing this warning of by appIndicator. But just in case it might be any help, here it is.
Author
Owner

@becker commented on GitHub (Sep 9, 2025):

I have Ubuntu 24.04 with the same issue. It seems like the UI updates every second:

https://github.com/user-attachments/assets/b7dfedd8-7c54-4e4b-825a-6c9ff5650b45

v0.56.1 / Ubuntu 24.04

<!-- gh-comment-id:3272416645 --> @becker commented on GitHub (Sep 9, 2025): I have Ubuntu 24.04 with the same issue. It seems like the UI updates every second: https://github.com/user-attachments/assets/b7dfedd8-7c54-4e4b-825a-6c9ff5650b45 v0.56.1 / Ubuntu 24.04
Author
Owner

@nazarewk commented on GitHub (Sep 10, 2025):

FYI: we are aware of this issue (got it in the internal bug tracker), there is no need to post more videos or bump it.

It is related to https://github.com/fyne-io/fyne/issues/4843 and might pose a challenge to address.

<!-- gh-comment-id:3275137385 --> @nazarewk commented on GitHub (Sep 10, 2025): FYI: we are aware of this issue (got it in the internal bug tracker), there is no need to post more videos or bump it. It is related to https://github.com/fyne-io/fyne/issues/4843 and might pose a challenge to address.
Author
Owner

@zeten30 commented on GitHub (Sep 18, 2025):

I have the same problem. Fedora 42.

<!-- gh-comment-id:3307296797 --> @zeten30 commented on GitHub (Sep 18, 2025): I have the same problem. Fedora 42.
Author
Owner

@dev-Blaze commented on GitHub (Nov 7, 2025):

@nazarewk I understand this is an issue with a separate UI toolkit that is not maintained by Netbird, but netbird is an enterprise VPN solution that organizations pay for and this UI bug has existed for a long time, has not been fixed and makes the UI basically unusable on any Linux Distro at the moment. maybe you can consider using a different UI for Linux? at least something that would function on Gnome and KDE would cover most linux users. just a thought.

<!-- gh-comment-id:3505971328 --> @dev-Blaze commented on GitHub (Nov 7, 2025): @nazarewk I understand this is an issue with a separate UI toolkit that is not maintained by Netbird, but netbird is an enterprise VPN solution that organizations pay for and this UI bug has existed for a long time, has not been fixed and makes the UI basically unusable on **any** Linux Distro at the moment. maybe you can consider using a different UI for Linux? at least something that would function on Gnome and KDE would cover most linux users. just a thought.
Author
Owner

@traxtopel commented on GitHub (Nov 10, 2025):

This patch is fundamentally a duct-tape solution that make the NetBird client UI "kind of usable" on Fedora 4x.

diff -ur netbird-0.59.8.orig/client/ui/client_ui.go netbird-0.59.8/client/ui/client_ui.go
--- netbird-0.59.8.orig/client/ui/client_ui.go	2025-10-21 19:23:11.000000000 +0200
+++ netbird-0.59.8/client/ui/client_ui.go	2025-10-27 14:48:51.491746529 +0100
@@ -939,7 +939,7 @@
 			// Check features periodically to handle daemon restarts
 			s.checkAndUpdateFeatures()
 
-			time.Sleep(2 * time.Second)
+			time.Sleep(10 * time.Second)
 		}
 	}()
<!-- gh-comment-id:3512792083 --> @traxtopel commented on GitHub (Nov 10, 2025): This patch is fundamentally a duct-tape solution that make the NetBird client UI "kind of usable" on Fedora 4x. ``` diff -ur netbird-0.59.8.orig/client/ui/client_ui.go netbird-0.59.8/client/ui/client_ui.go --- netbird-0.59.8.orig/client/ui/client_ui.go 2025-10-21 19:23:11.000000000 +0200 +++ netbird-0.59.8/client/ui/client_ui.go 2025-10-27 14:48:51.491746529 +0100 @@ -939,7 +939,7 @@ // Check features periodically to handle daemon restarts s.checkAndUpdateFeatures() - time.Sleep(2 * time.Second) + time.Sleep(10 * time.Second) } }() ```
Author
Owner

@zeten30 commented on GitHub (Nov 10, 2025):

This patch is fundamentally a duct-tape solution that make the NetBird client UI "kind of usable" on Fedora 4x.

diff -ur netbird-0.59.8.orig/client/ui/client_ui.go netbird-0.59.8/client/ui/client_ui.go
--- netbird-0.59.8.orig/client/ui/client_ui.go	2025-10-21 19:23:11.000000000 +0200
+++ netbird-0.59.8/client/ui/client_ui.go	2025-10-27 14:48:51.491746529 +0100
@@ -939,7 +939,7 @@
 			// Check features periodically to handle daemon restarts
 			s.checkAndUpdateFeatures()
 
-			time.Sleep(2 * time.Second)
+			time.Sleep(10 * time.Second)
 		}
 	}()

Maybe we can even go with 15-20s..

I started looking for Go replacement of fyne-io or fixing it... Or even creating a new UI app :(

<!-- gh-comment-id:3512984955 --> @zeten30 commented on GitHub (Nov 10, 2025): > This patch is fundamentally a duct-tape solution that make the NetBird client UI "kind of usable" on Fedora 4x. > > ``` > diff -ur netbird-0.59.8.orig/client/ui/client_ui.go netbird-0.59.8/client/ui/client_ui.go > --- netbird-0.59.8.orig/client/ui/client_ui.go 2025-10-21 19:23:11.000000000 +0200 > +++ netbird-0.59.8/client/ui/client_ui.go 2025-10-27 14:48:51.491746529 +0100 > @@ -939,7 +939,7 @@ > // Check features periodically to handle daemon restarts > s.checkAndUpdateFeatures() > > - time.Sleep(2 * time.Second) > + time.Sleep(10 * time.Second) > } > }() > ``` Maybe we can even go with 15-20s.. I started looking for Go replacement of fyne-io or fixing it... Or even creating a new UI app :(
Author
Owner

@custardpy commented on GitHub (Nov 24, 2025):

The bug still lives.
OS: Fedora 43
Gnome Shell: 49.1
AppIndicator and KStatusNotifierItem Support Extension: 61

In the meantime used this workaround to increase the timeout value.

<!-- gh-comment-id:3570075868 --> @custardpy commented on GitHub (Nov 24, 2025): The bug still lives. OS: Fedora 43 Gnome Shell: 49.1 AppIndicator and KStatusNotifierItem Support Extension: 61 In the meantime used [this](https://github.com/netbirdio/netbird/issues/4244#issuecomment-3512792083) workaround to increase the timeout value.
Author
Owner

@danilosekulovikj commented on GitHub (Dec 19, 2025):

I have the same issue.

OS: Arch Linux x86_64
DE: GNOME 49.2
WM: Mutter (Wayland)

<!-- gh-comment-id:3674213909 --> @danilosekulovikj commented on GitHub (Dec 19, 2025): I have the same issue. OS: Arch Linux x86_64 DE: GNOME 49.2 WM: Mutter (Wayland)
Author
Owner

@gza commented on GitHub (Jan 12, 2026):

On Manjaro Linux (Arch derivative) / GNOME 49 / Wayland, "Exit node menu already up to date" disappeared after upgrade to 0.62.0 on Jan 7th.
Few days (and other upgrades) after. I realized that menus are no longer closing unexpectedly.

<!-- gh-comment-id:3737476919 --> @gza commented on GitHub (Jan 12, 2026): On Manjaro Linux (Arch derivative) / GNOME 49 / Wayland, "Exit node menu already up to date" disappeared after upgrade to 0.62.0 on Jan 7th. Few days (and other upgrades) after. I realized that menus are no longer closing unexpectedly.
Author
Owner

@seb155 commented on GitHub (May 21, 2026):

Still reproducible on NetBird 0.71.3 / Ubuntu 26.04 / GNOME 50.1 (Wayland)

Confirming this is still present on the latest client. Captured the mechanism with dbus-monitor on the com.canonical.dbusmenu interface.

netbird-ui rebuilds its entire tray menu layout every 2.00 s, even when idle and the menu is closed:

LayoutUpdated ×2   t=+0.000s
LayoutUpdated ×2   t=+2.001s
LayoutUpdated ×2   t=+4.002s

When the menu is open, every LayoutUpdated makes the GNOME host re-read the full layout (GetLayout) and rebuild the popup — which dismisses the open menu:

netbird-ui  → LayoutUpdated ×2
gnome-shell → GetLayout ×2      ← full rebuild, open menu/submenu collapses

The menu (and any open submenu) therefore has a usable lifetime of ≤2 s, desynchronized from the user's click — making submenu navigation effectively impossible. Note: AboutToShow for submenus returns false, so submenu expansion itself is fine — the collapse is purely the 2 s LayoutUpdated churn.

Suggested fix direction: the tray refresh loop should (a) emit the surgical ItemsPropertiesUpdated instead of a full layout rebuild when only labels/states change, (b) skip the refresh while the menu is open, or (c) only update on actual daemon state changes rather than a fixed 2 s timer. The Exit node menu already up to date log line (client/ui/network.go) fires every cycle — the rebuild happens even when nothing changed.

As a local GNOME-side workaround, patching ubuntu-appindicators' dbusMenu.js to defer LayoutUpdated while the menu is open makes the tray usable again — but the real fix belongs in netbird-ui.

<!-- gh-comment-id:4509114701 --> @seb155 commented on GitHub (May 21, 2026): **Still reproducible on NetBird 0.71.3 / Ubuntu 26.04 / GNOME 50.1 (Wayland)** Confirming this is still present on the latest client. Captured the mechanism with `dbus-monitor` on the `com.canonical.dbusmenu` interface. **`netbird-ui` rebuilds its entire tray menu layout every 2.00 s**, even when idle and the menu is closed: ``` LayoutUpdated ×2 t=+0.000s LayoutUpdated ×2 t=+2.001s LayoutUpdated ×2 t=+4.002s ``` When the menu is **open**, every `LayoutUpdated` makes the GNOME host re-read the full layout (`GetLayout`) and rebuild the popup — which dismisses the open menu: ``` netbird-ui → LayoutUpdated ×2 gnome-shell → GetLayout ×2 ← full rebuild, open menu/submenu collapses ``` The menu (and any open submenu) therefore has a usable lifetime of ≤2 s, desynchronized from the user's click — making submenu navigation effectively impossible. Note: `AboutToShow` for submenus returns `false`, so submenu expansion itself is fine — the collapse is purely the 2 s `LayoutUpdated` churn. **Suggested fix direction:** the tray refresh loop should (a) emit the surgical `ItemsPropertiesUpdated` instead of a full layout rebuild when only labels/states change, (b) skip the refresh while the menu is open, or (c) only update on actual daemon state changes rather than a fixed 2 s timer. The `Exit node menu already up to date` log line (`client/ui/network.go`) fires every cycle — the rebuild happens even when nothing changed. As a local GNOME-side workaround, patching `ubuntu-appindicators`' `dbusMenu.js` to defer `LayoutUpdated` while the menu is open makes the tray usable again — but the real fix belongs in `netbird-ui`.
Author
Owner

@gabviv73 commented on GitHub (May 27, 2026):

+1

<!-- gh-comment-id:4556707042 --> @gabviv73 commented on GitHub (May 27, 2026): +1
Author
Owner

@bitboss-ca commented on GitHub (May 30, 2026):

+1

Ubuntu 24.04.4 LTS

<!-- gh-comment-id:4583473116 --> @bitboss-ca commented on GitHub (May 30, 2026): +1 Ubuntu 24.04.4 LTS
Author
Owner

@BhasherBEL commented on GitHub (Jun 4, 2026):

I have been able to avoid the constant refreshing and make the tray UI usable in my setup using this patch on v0.71.4. Maybe it can lead to work to an definitive fix.

It adds some basic guarding in front of the Enable()/Disable() to call them only if there is a need to. The same logic is applied to recreateExitNodeMenu().

--- a/client/ui/client_ui.go
+++ b/client/ui/client_ui.go
@@ -1254,10 +1254,11 @@
 
 	// Update networks and exit node menus based on current features
 	s.networksEnabled = features == nil || !features.DisableNetworks
-	if s.networksEnabled && s.connected {
+	enableNetworks := s.networksEnabled && s.connected
+	if enableNetworks && s.mNetworks.Disabled() {
 		s.mNetworks.Enable()
 		s.mExitNode.Enable()
-	} else {
+	} else if !enableNetworks && !s.mNetworks.Disabled() {
 		s.mNetworks.Disable()
 		s.mExitNode.Disable()
 	}
--- a/client/ui/network.go
+++ b/client/ui/network.go
@@ -398,6 +398,21 @@
 	}
 }
 
+var lastExitNodesSig string
+
+func exitNodesSignature(nodes []*proto.Network) string {
+	parts := make([]string, 0, len(nodes))
+	for _, n := range nodes {
+		sel := ""
+		if n.Selected {
+			sel = "*"
+		}
+		parts = append(parts, n.ID+sel)
+	}
+	sort.Strings(parts)
+	return strings.Join(parts, ";")
+}
+
 // updateExitNodes fetches exit nodes from the daemon and recreates the menu.
 // Returns true if exit nodes were found.
 func (s *serviceClient) updateExitNodes() bool {
@@ -415,6 +430,12 @@
 	s.exitNodeMu.Lock()
 	defer s.exitNodeMu.Unlock()
 
+	sig := exitNodesSignature(exitNodes)
+	if sig == lastExitNodesSig {
+		return len(s.mExitNodeItems) > 0
+	}
+	lastExitNodesSig = sig
+
 	s.recreateExitNodeMenu(exitNodes)
 
 	if len(s.mExitNodeItems) > 0 {
<!-- gh-comment-id:4622719984 --> @BhasherBEL commented on GitHub (Jun 4, 2026): I have been able to avoid the constant refreshing and make the tray UI usable in my setup using this patch on v0.71.4. Maybe it can lead to work to an definitive fix. It adds some basic guarding in front of the `Enable()`/`Disable()` to call them only if there is a need to. The same logic is applied to `recreateExitNodeMenu()`. ```patch --- a/client/ui/client_ui.go +++ b/client/ui/client_ui.go @@ -1254,10 +1254,11 @@ // Update networks and exit node menus based on current features s.networksEnabled = features == nil || !features.DisableNetworks - if s.networksEnabled && s.connected { + enableNetworks := s.networksEnabled && s.connected + if enableNetworks && s.mNetworks.Disabled() { s.mNetworks.Enable() s.mExitNode.Enable() - } else { + } else if !enableNetworks && !s.mNetworks.Disabled() { s.mNetworks.Disable() s.mExitNode.Disable() } --- a/client/ui/network.go +++ b/client/ui/network.go @@ -398,6 +398,21 @@ } } +var lastExitNodesSig string + +func exitNodesSignature(nodes []*proto.Network) string { + parts := make([]string, 0, len(nodes)) + for _, n := range nodes { + sel := "" + if n.Selected { + sel = "*" + } + parts = append(parts, n.ID+sel) + } + sort.Strings(parts) + return strings.Join(parts, ";") +} + // updateExitNodes fetches exit nodes from the daemon and recreates the menu. // Returns true if exit nodes were found. func (s *serviceClient) updateExitNodes() bool { @@ -415,6 +430,12 @@ s.exitNodeMu.Lock() defer s.exitNodeMu.Unlock() + sig := exitNodesSignature(exitNodes) + if sig == lastExitNodesSig { + return len(s.mExitNodeItems) > 0 + } + lastExitNodesSig = sig + s.recreateExitNodeMenu(exitNodes) if len(s.mExitNodeItems) > 0 { ```
Author
Owner

@Tofil commented on GitHub (Jun 16, 2026):

still happening on ubuntu 26

<!-- gh-comment-id:4724159988 --> @Tofil commented on GitHub (Jun 16, 2026): still happening on ubuntu 26
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: DYNR/netbird#8984