diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,24 @@
 # Unreleased
 
+## Refactors
+
+* Decouple layout and workspace/window information providers from widget
+  rendering, and move shared workspace/window support helpers out of widget
+  modules.
+
+# 7.0.1
+
+## Tray
+
+* Avoid prioritized-collapsible tray rebuilds for overlay-icon, tooltip, and
+  status-only updates that do not affect visible tray content.
+
+## Packaging
+
+* Require `gtk-sni-tray >= 0.2.1.1` and `status-notifier-item >= 0.3.2.13`
+  so tray consumers pick up the host-side suppression of redundant no-op
+  property update churn.
+
 # 7.0.0
 
 ## Breaking Changes
@@ -764,4 +783,4 @@
 
  * Readable widget for freedesktop notifications
  * Fixed a few potential deadlocks on startup
- * Use the GTK+ rc-file styling system for colors instead of hard coding them
+ * Use the GTK+ rc-file styling system for colors instead
diff --git a/src/System/Taffybar/Widget/HyprlandLayout.hs b/src/System/Taffybar/Widget/HyprlandLayout.hs
--- a/src/System/Taffybar/Widget/HyprlandLayout.hs
+++ b/src/System/Taffybar/Widget/HyprlandLayout.hs
@@ -35,8 +35,7 @@
 import System.Log.Logger (Priority (..))
 import System.Taffybar.Context
 import System.Taffybar.Hyprland
-  ( runHyprlandCommandJsonT,
-    runHyprlandCommandRawT,
+  ( runHyprlandCommandRawT,
   )
 import qualified System.Taffybar.Information.Hyprland as Hypr
 import System.Taffybar.Information.Layout.Hyprland
diff --git a/src/System/Taffybar/Widget/SNITray/PrioritizedCollapsible.hs b/src/System/Taffybar/Widget/SNITray/PrioritizedCollapsible.hs
--- a/src/System/Taffybar/Widget/SNITray/PrioritizedCollapsible.hs
+++ b/src/System/Taffybar/Widget/SNITray/PrioritizedCollapsible.hs
@@ -966,7 +966,11 @@
           case updateType of
             H.ItemAdded -> scheduleRefresh True True updateType
             H.ItemRemoved -> scheduleRefresh True True updateType
-            _ -> scheduleRefresh False False updateType
+            H.IconUpdated -> scheduleRefresh False False updateType
+            H.TitleUpdated -> scheduleRefresh False False updateType
+            H.OverlayIconUpdated -> return ()
+            H.ToolTipUpdated -> return ()
+            H.StatusUpdated -> return ()
 
         installUpdateHandler = do
           maybeHandlerId <- readIORef updateHandlerRef
diff --git a/src/System/Taffybar/Widget/Workspaces.hs b/src/System/Taffybar/Widget/Workspaces.hs
--- a/src/System/Taffybar/Widget/Workspaces.hs
+++ b/src/System/Taffybar/Widget/Workspaces.hs
@@ -56,12 +56,11 @@
 import qualified Data.Map.Strict as M
 import qualified Data.Text as T
 import Data.Word (Word64)
+import Data.Int (Int32)
 import qualified GI.Gdk.Enums as Gdk
 import qualified GI.Gdk.Structs.EventScroll as Gdk
 import qualified GI.GdkPixbuf.Objects.Pixbuf as Gdk
 import qualified GI.Gtk as Gtk
-import Data.Int (Int32)
-import System.Log.Logger (Priority (..), logM)
 import System.Taffybar.Context (Backend (..), TaffyIO, backend)
 import System.Taffybar.Information.EWMHDesktopInfo
   ( ewmhWMIcon,
@@ -577,7 +576,3 @@
         WorkspaceVisible -> Visible
         WorkspaceHidden -> Hidden
         WorkspaceEmpty -> Empty
-
-wLog :: Priority -> String -> TaffyIO ()
-wLog level message =
-  liftIO $ logM "System.Taffybar.Widget.Workspaces" level message
diff --git a/taffybar.cabal b/taffybar.cabal
--- a/taffybar.cabal
+++ b/taffybar.cabal
@@ -1,6 +1,6 @@
 cabal-version: 3.4
 name: taffybar
-version: 7.0.0
+version: 7.0.1
 synopsis: A desktop bar similar to xmobar, but with more GUI
 license: BSD-3-Clause
 license-file: LICENSE
@@ -87,7 +87,7 @@
                , gi-gtk-hs >= 0.3.17 && < 0.4
                , gi-pango
                , gtk-scaling-image >= 0.1.0.0 && < 0.2
-               , gtk-sni-tray >= 0.2.1.0
+               , gtk-sni-tray >= 0.2.1.1
                , gtk-strut >= 0.1.4.0
                , haskell-gi-base >= 0.24
                , hslogger
@@ -104,7 +104,7 @@
                , safe >= 0.3 && < 1
                , scotty >= 0.20 && < 0.31
                , split >= 0.1.4.2
-               , status-notifier-item >= 0.3.2.11
+               , status-notifier-item >= 0.3.2.13
                , stm
                , template-haskell
                , text
@@ -374,6 +374,7 @@
                , System.Taffybar.ContextSpec
                , System.Taffybar.Information.CryptoSpec
                , System.Taffybar.Information.LayoutSpec
+               , System.Taffybar.Information.Workspaces.EWMHSpec
                , System.Taffybar.Information.X11DesktopInfoSpec
                , System.Taffybar.Information.WakeupSpec
                , System.Taffybar.SimpleConfigSpec
diff --git a/test/unit/System/Taffybar/Information/Workspaces/EWMHSpec.hs b/test/unit/System/Taffybar/Information/Workspaces/EWMHSpec.hs
new file mode 100644
--- /dev/null
+++ b/test/unit/System/Taffybar/Information/Workspaces/EWMHSpec.hs
@@ -0,0 +1,16 @@
+module System.Taffybar.Information.Workspaces.EWMHSpec (spec) where
+
+import Data.List (elem)
+import System.Taffybar.Information.Workspaces.EWMH
+  ( defaultEWMHWorkspaceProviderConfig,
+    workspaceUpdateEvents,
+  )
+import System.Taffybar.Information.X11DesktopInfo (xmonadVisibleWorkspaces)
+import Test.Hspec
+
+spec :: Spec
+spec =
+  describe "defaultEWMHWorkspaceProviderConfig" $
+    it "subscribes to xmonad visible workspace updates" $
+      xmonadVisibleWorkspaces `elem` workspaceUpdateEvents defaultEWMHWorkspaceProviderConfig
+        `shouldBe` True
