When the screen is locked and notifications arrive, the notification list on the lock screen shows the text of all entries rendered in the same spot - one on top of the other. The result looks like corrupted text or a typographic ghost effect. Clearing or dismissing notifications can make it worse.
The NotifGroup.qml component uses a Repeater inside a
ColumnLayout to render each notification. Each delegate had
parallel animations that animated Layout.preferredHeight
on entry and exit:
-
Problem 1 - Delegate recycling: When a new notification arrives
or an existing one is dismissed, QML's
Repeaterreuses existing delegate instances rather than destroying and recreating them. The model data bound to the delegate changes, but the in-flight animations were still animatingLayout.preferredHeightusing the old item's dimensions - leaving items stuck at the wrong height. -
Problem 2 - Closed notifications staying visible: The
notifsproperty included notifications wherenotif.closed === true. These "ghost" entries remained in the layout, occupying space and contributing to the overlap.
Together, these caused the ColumnLayout to position items at
heights calculated from stale animation state, causing multiple items to share
the same vertical position.
NotifGroup.qml
Two changes in ~/.config/quickshell/caelestia/modules/lock/NotifGroup.qml:
Filter out closed notifications at the data level
Modify the notifs property to exclude entries where
notif.closed is true. This prevents ghost entries from entering
the Repeater model at all.
// Before - includes closed notifications
property var notifs: Notifs.list.values
// After - filters them out
property var notifs: Notifs.list.values.filter(notif => !notif.closed)
Remove the parallel layout animations from the Repeater delegate
Delete the ParallelAnimation blocks that animate
Layout.preferredHeight on entry and on notif.modelData.closed.
Let the ColumnLayout manage item height natively using the
implicit height of the Text elements - QML handles this correctly
without manual animation.
NotifGroup.qml and reintroduce
the animations. After running paru -Syu, verify the lock screen
notifications still display correctly by locking the screen (Super+L) and
sending a test notification: notify-send "Test" "Overlap check".