When hypridle broke
In May 2026 my Arch laptop stopped locking itself when idle. No error on screen. The screen simply stayed on.
My first thought: I must have changed a config. I had not.
What changed
A routine pacman -Syu upgraded sdbus-cpp from 2.2.1 to 2.3.0. hypridle,
the idle daemon for Hyprland, stayed at version 0.1.7-9.
The new sdbus-cpp kept the same SONAME, libsdbus-c++.so.2. The SONAME is
the promise that programs linked against the old library still work with the
new one. This time the promise broke. The internals of
sdbus::internal::Proxy::registerSignalHandler changed, and hypridle crashed
on every start.
How it looked
systemctl --user status hypridle.service
The log showed a SIGSEGV right after the line “Sleep inhibition enabled”. The
crash pointed into libsdbus-c++.so.2. The service kept restarting and
crashing. Nothing told me, because a crashing idle daemon produces no visible
symptom, only an absence: the lock never comes.
The fix
Three days later, sdbus-cpp 2.3.1 shipped with a new hyprlock build. A
plain pacman -Syu fixed it. hypridle itself did not need a rebuild.
If the fix had not shipped yet, the fallback was:
- Downgrade from the package cache:
sudo pacman -U /var/cache/pacman/pkg/sdbus-cpp-2.2.1-*.pkg.tar.zst - Hold it with
IgnorePkg = sdbus-cppin/etc/pacman.conf. - Remove the hold after the Hyprland packages are rebuilt.
What I learned
- Check the service before the config. A crash log says more than a config diff.
- A SONAME is a promise, not a guarantee. On a rolling release, a library can break its ABI under the same name.
- Silent failures need a check. A security feature that fails by doing nothing is the worst kind, because nothing prompts you to look.