Order the migration notifier after graphical-session.target

omarchy-migrate-notify.service is a Type=oneshot wanted by
graphical-session.target, and systemd complements a target's Wants= with an
implicit After=, so the target waited for the notifier to exit. The notifier
does not exit quickly: it sends the notification through systemd-run --scope,
which is synchronous, and omarchy-notification-send -a blocks until the user
clicks. The target stayed in activating for as long as the toast was up.

wayland-wm-app-daemon.service is After=graphical-session.target and nothing
wants it, so uwsm-app starts it on demand. Clicking the notification runs
omarchy-launch-floating-terminal-with-presentation, which execs uwsm-app,
which blocks on a systemctl --user restart of that daemon -- a job queued
behind the very target the clicked notifier was holding open. The terminal
never opened; uwsm-app gave up on its own pipe timeout instead.

Declaring After= on the wanted unit suppresses the implicit dependency rather
than forming a cycle, so the target is reached without waiting and the
notifier runs behind it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
David Heinemeier Hansson
2026-07-27 08:41:59 -07:00
co-authored by Claude Opus 5
parent 2fb33a2a6a
commit c7e327b05a
6 changed files with 18 additions and 6 deletions
@@ -7,6 +7,10 @@ Description=Notify about pending Omarchy migrations
# already being applied in the visible update terminal. Checking once per login
# is the only trigger that cannot collide with a running update.
ConditionPathIsDirectory=/usr/share/omarchy/migrations
# The actionable notification launches its terminal through uwsm-app, whose
# daemon starts after graphical-session.target. Run after the target too so this
# oneshot cannot hold the target open while waiting for that daemon.
After=graphical-session.target
[Service]
Type=oneshot