diff --git a/client/ui/assets/netbird-systemtray-needs-login-macos.png b/client/ui/assets/netbird-systemtray-needs-login-macos.png
new file mode 100644
index 000000000..580fe647c
Binary files /dev/null and b/client/ui/assets/netbird-systemtray-needs-login-macos.png differ
diff --git a/client/ui/assets/netbird-systemtray-needs-login.png b/client/ui/assets/netbird-systemtray-needs-login.png
new file mode 100644
index 000000000..c4b8b4bf4
Binary files /dev/null and b/client/ui/assets/netbird-systemtray-needs-login.png differ
diff --git a/client/ui/assets/svg/_base.svg b/client/ui/assets/svg/_base.svg
deleted file mode 100644
index 9b2498ae8..000000000
--- a/client/ui/assets/svg/_base.svg
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
diff --git a/client/ui/assets/svg/appicon.svg b/client/ui/assets/svg/appicon.svg
deleted file mode 100644
index 773ad3417..000000000
--- a/client/ui/assets/svg/appicon.svg
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
diff --git a/client/ui/assets/svg/connected-macos.svg b/client/ui/assets/svg/connected-macos.svg
deleted file mode 100644
index d1e2ce18c..000000000
--- a/client/ui/assets/svg/connected-macos.svg
+++ /dev/null
@@ -1,10 +0,0 @@
-
diff --git a/client/ui/assets/svg/connected.svg b/client/ui/assets/svg/connected.svg
deleted file mode 100644
index 687d8e2e5..000000000
--- a/client/ui/assets/svg/connected.svg
+++ /dev/null
@@ -1,14 +0,0 @@
-
diff --git a/client/ui/assets/svg/connecting-macos.svg b/client/ui/assets/svg/connecting-macos.svg
deleted file mode 100644
index 04d666c5f..000000000
--- a/client/ui/assets/svg/connecting-macos.svg
+++ /dev/null
@@ -1,9 +0,0 @@
-
diff --git a/client/ui/assets/svg/connecting.svg b/client/ui/assets/svg/connecting.svg
deleted file mode 100644
index d3818055a..000000000
--- a/client/ui/assets/svg/connecting.svg
+++ /dev/null
@@ -1,9 +0,0 @@
-
diff --git a/client/ui/assets/svg/disconnected-macos.svg b/client/ui/assets/svg/disconnected-macos.svg
deleted file mode 100644
index 06802c9d4..000000000
--- a/client/ui/assets/svg/disconnected-macos.svg
+++ /dev/null
@@ -1,10 +0,0 @@
-
diff --git a/client/ui/assets/svg/disconnected.svg b/client/ui/assets/svg/disconnected.svg
deleted file mode 100644
index 31eab7970..000000000
--- a/client/ui/assets/svg/disconnected.svg
+++ /dev/null
@@ -1,10 +0,0 @@
-
diff --git a/client/ui/assets/svg/error-macos.svg b/client/ui/assets/svg/error-macos.svg
deleted file mode 100644
index 4c6d4e76d..000000000
--- a/client/ui/assets/svg/error-macos.svg
+++ /dev/null
@@ -1,11 +0,0 @@
-
diff --git a/client/ui/assets/svg/error.svg b/client/ui/assets/svg/needs-login.svg
similarity index 71%
rename from client/ui/assets/svg/error.svg
rename to client/ui/assets/svg/needs-login.svg
index 46ac0d762..5c01b48d4 100644
--- a/client/ui/assets/svg/error.svg
+++ b/client/ui/assets/svg/needs-login.svg
@@ -5,7 +5,6 @@
-
-
-
+
+
diff --git a/client/ui/assets/svg/update-connected-macos.svg b/client/ui/assets/svg/update-connected-macos.svg
deleted file mode 100644
index 774e631e6..000000000
--- a/client/ui/assets/svg/update-connected-macos.svg
+++ /dev/null
@@ -1,10 +0,0 @@
-
diff --git a/client/ui/assets/svg/update-connected.svg b/client/ui/assets/svg/update-connected.svg
deleted file mode 100644
index 45e22693b..000000000
--- a/client/ui/assets/svg/update-connected.svg
+++ /dev/null
@@ -1,10 +0,0 @@
-
diff --git a/client/ui/assets/svg/update-disconnected-macos.svg b/client/ui/assets/svg/update-disconnected-macos.svg
deleted file mode 100644
index fe161cc44..000000000
--- a/client/ui/assets/svg/update-disconnected-macos.svg
+++ /dev/null
@@ -1,10 +0,0 @@
-
diff --git a/client/ui/assets/svg/update-disconnected.svg b/client/ui/assets/svg/update-disconnected.svg
deleted file mode 100644
index 657974005..000000000
--- a/client/ui/assets/svg/update-disconnected.svg
+++ /dev/null
@@ -1,10 +0,0 @@
-
diff --git a/client/ui/icons.go b/client/ui/icons.go
index 28d4582cc..3fe3ea9ef 100644
--- a/client/ui/icons.go
+++ b/client/ui/icons.go
@@ -26,6 +26,9 @@ var iconConnecting []byte
//go:embed assets/netbird-systemtray-error.png
var iconError []byte
+//go:embed assets/netbird-systemtray-needs-login.png
+var iconNeedsLogin []byte
+
//go:embed assets/netbird-systemtray-update-connected.png
var iconUpdateConnected []byte
@@ -44,6 +47,9 @@ var iconConnectingMacOS []byte
//go:embed assets/netbird-systemtray-error-macos.png
var iconErrorMacOS []byte
+//go:embed assets/netbird-systemtray-needs-login-macos.png
+var iconNeedsLoginMacOS []byte
+
//go:embed assets/netbird-systemtray-update-connected-macos.png
var iconUpdateConnectedMacOS []byte
diff --git a/client/ui/tray.go b/client/ui/tray.go
index fd8ab351f..27b8b545c 100644
--- a/client/ui/tray.go
+++ b/client/ui/tray.go
@@ -80,6 +80,12 @@ const (
// completed an SSO authentication on this profile. Mirrors
// internal.StatusNeedsLogin.
statusNeedsLogin = "NeedsLogin"
+ // statusLoginFailed is what the daemon publishes when a login attempt
+ // failed with a non-auth error (management unreachable, init error,
+ // etc.). The CLI groups it with NeedsLogin/SessionExpired and prompts
+ // the user to run "netbird up", so we mirror that here. Mirrors
+ // internal.StatusLoginFailed.
+ statusLoginFailed = "LoginFailed"
// External URLs.
urlGitHubRepo = "https://github.com/netbirdio/netbird"
@@ -434,7 +440,8 @@ func (t *Tray) applyStatus(st services.Status) {
if iconChanged {
t.applyIcon()
needsLogin := strings.EqualFold(st.Status, statusNeedsLogin) ||
- strings.EqualFold(st.Status, statusSessionExpired)
+ strings.EqualFold(st.Status, statusSessionExpired) ||
+ strings.EqualFold(st.Status, statusLoginFailed)
daemonUnavailable := strings.EqualFold(st.Status, services.StatusDaemonUnavailable)
if t.statusItem != nil {
// When the daemon needs re-authentication the status row turns
@@ -542,6 +549,9 @@ func (t *Tray) iconForState() (icon, dark []byte) {
connecting := strings.EqualFold(statusLabel, "Connecting")
errored := strings.EqualFold(statusLabel, "Error") ||
strings.EqualFold(statusLabel, services.StatusDaemonUnavailable)
+ needsLogin := strings.EqualFold(statusLabel, statusNeedsLogin) ||
+ strings.EqualFold(statusLabel, statusSessionExpired) ||
+ strings.EqualFold(statusLabel, statusLoginFailed)
if runtime.GOOS == "darwin" {
switch {
@@ -549,6 +559,8 @@ func (t *Tray) iconForState() (icon, dark []byte) {
return iconConnectingMacOS, nil
case errored:
return iconErrorMacOS, nil
+ case needsLogin:
+ return iconNeedsLoginMacOS, nil
case connected && hasUpdate:
return iconUpdateConnectedMacOS, nil
case connected:
@@ -565,6 +577,8 @@ func (t *Tray) iconForState() (icon, dark []byte) {
return iconConnecting, nil
case errored:
return iconError, nil
+ case needsLogin:
+ return iconNeedsLogin, nil
case connected && hasUpdate:
return iconUpdateConnected, nil
case connected: