What happened
I get a critical "Update System — Click to update the system." notification on
every single login, on a machine that is fully up to date. I ran the update,
rebooted, and got the same notification again.
It is not an update check. It is the first-run onboarding notification from
install/user/first-run/wifi.sh, replayed on every login because first-run never
gets marked complete.
omarchy-update-available correctly reports the system is up to date, at the same
time the notification claims otherwise:
$ omarchy-update-available
Omarchy is up to date # exit 1
$ checkupdates --nocolor
# empty
The stored notification confirms which one it is:
$ cat ~/.local/state/omarchy/notifications/history/1788202735879-2.json
{"id":2,"app":"omarchy-action","summary":"Update System",
"body":"Click to update the system.","urgency":2,
"execArgv":"[\"omarchy-launch-floating-terminal-with-presentation\",\"omarchy-update\"]", ...}
Root cause
install/user/first-run/timezone.sh passes its click command to --exec as a
single quoted string:
omarchy-notification-send -u critical -g "Set your timezone" \
"This machine is on $(current_timezone). Click to choose yours." \
--exec "omarchy-launch-floating-terminal-with-presentation omarchy-cmd-tzupdate-enhanced"
Since bf2013e ("Make --exec take the command as rest-of-line words"),
omarchy-notification-send rejects that form:
$ bash /usr/share/omarchy/install/user/first-run/timezone.sh
--exec takes the command as separate words, not one quoted string.
Write: --exec omarchy-launch-floating-terminal-with-presentation omarchy-cmd-tzupdate-enhanced
$ echo $?
1
bf2013e converted every other call site — welcome.sh, wifi.sh, the three
.hook files, omarchy-migrate-notify, and others — but timezone.sh was not in
that commit, and bf57d35 touched the file afterwards without catching it. It is
still unfixed on origin/quattro today.
That non-zero exit sets first_run_failed=1 in omarchy-provision-first-run, so
omarchy-done mark first-run-user is never reached and the whole sequence reruns
at every login:
[2026-08-30 22:23:18] Failed: prompt for the timezone (exit code: 1)
[2026-08-30 22:23:18] One or more first-run steps failed; first-run will retry next login
[2026-08-31 05:25:24] Failed: prompt for the timezone (exit code: 1)
[2026-08-31 05:25:24] One or more first-run steps failed; first-run will retry next login
[2026-08-31 18:58:55] Failed: prompt for the timezone (exit code: 1)
[2026-08-31 18:58:55] One or more first-run steps failed; first-run will retry next login
$ ls ~/.local/state/omarchy/done/
agent-setup-invitation finalize-user voxtype-install-invitation
# no first-run-user
wifi.sh then re-fires unconditionally — it never consults
omarchy-update-available — so the update prompt appears regardless of whether
anything is actually out of date. welcome.sh's "Learn Keybindings" toast is
replayed on every login for the same reason.
Two knock-on effects
- The timezone prompt never appears at all. This machine is still on
UTC,
which is exactly the case the script exists to catch, and the notification it
would send dies on the argument error before reaching the user. So the bug
also silently defeats the feature it lives in.
- First-run is not idempotent in practice. Every login re-runs hook installs,
unit enables, GNOME theme, GTK paste and audio tuning. Those appear to be
harmless to repeat, but they are running far more often than intended.
Steps to reproduce
- Install on an Apple Silicon Mac (fresh install, timezone left at
UTC).
- Log in. Note the "Update System" toast.
- Run
omarchy-update to completion, reboot.
- The "Update System" toast appears again, while
omarchy-update-available
reports "Omarchy is up to date".
cat ~/.local/state/omarchy/first-run.log shows Failed: prompt for the timezone (exit code: 1) for every login.
Suggested fix
Drop the quotes so --exec takes rest-of-line words, matching every other call
site as of bf2013e:
--exec omarchy-launch-floating-terminal-with-presentation omarchy-cmd-tzupdate-enhanced
Two things worth considering alongside it, both optional:
wifi.sh's notify_update could gate on omarchy-update-available so the
prompt reflects real state even if first-run does replay.
- A step whose only job is to invite the user could avoid failing the whole
first-run batch, so one bad notification cannot wedge provisioning permanently.
Users already affected are stuck: the file ships broken, so no amount of updating
or rebooting clears it. omarchy-done mark first-run-user is the manual escape,
which suggests a migration may be worth pairing with the fix.
System
omarchy version 4.0.2rc2-1
kernel 7.1.6-1-1-ARCH
hardware apple,j313 apple,t8103 (M1 MacBook Air)
timezone UTC
pacman -Qkk omarchy → 1815 total files, 0 altered files
The package files are unmodified, so this is the shipped timezone.sh, not local
drift.
Filed by Claude Opus 5 via Claude Code.
What happened
I get a critical "Update System — Click to update the system." notification on
every single login, on a machine that is fully up to date. I ran the update,
rebooted, and got the same notification again.
It is not an update check. It is the first-run onboarding notification from
install/user/first-run/wifi.sh, replayed on every login because first-run nevergets marked complete.
omarchy-update-availablecorrectly reports the system is up to date, at the sametime the notification claims otherwise:
The stored notification confirms which one it is:
Root cause
install/user/first-run/timezone.shpasses its click command to--execas asingle quoted string:
Since bf2013e ("Make --exec take the command as rest-of-line words"),
omarchy-notification-sendrejects that form:bf2013e converted every other call site —
welcome.sh,wifi.sh, the three.hookfiles,omarchy-migrate-notify, and others — buttimezone.shwas not inthat commit, and bf57d35 touched the file afterwards without catching it. It is
still unfixed on
origin/quattrotoday.That non-zero exit sets
first_run_failed=1inomarchy-provision-first-run, soomarchy-done mark first-run-useris never reached and the whole sequence rerunsat every login:
wifi.shthen re-fires unconditionally — it never consultsomarchy-update-available— so the update prompt appears regardless of whetheranything is actually out of date.
welcome.sh's "Learn Keybindings" toast isreplayed on every login for the same reason.
Two knock-on effects
UTC,which is exactly the case the script exists to catch, and the notification it
would send dies on the argument error before reaching the user. So the bug
also silently defeats the feature it lives in.
unit enables, GNOME theme, GTK paste and audio tuning. Those appear to be
harmless to repeat, but they are running far more often than intended.
Steps to reproduce
UTC).omarchy-updateto completion, reboot.omarchy-update-availablereports "Omarchy is up to date".
cat ~/.local/state/omarchy/first-run.logshowsFailed: prompt for the timezone (exit code: 1)for every login.Suggested fix
Drop the quotes so
--exectakes rest-of-line words, matching every other callsite as of bf2013e:
Two things worth considering alongside it, both optional:
wifi.sh'snotify_updatecould gate onomarchy-update-availableso theprompt reflects real state even if first-run does replay.
first-run batch, so one bad notification cannot wedge provisioning permanently.
Users already affected are stuck: the file ships broken, so no amount of updating
or rebooting clears it.
omarchy-done mark first-run-useris the manual escape,which suggests a migration may be worth pairing with the fix.
System
The package files are unmodified, so this is the shipped
timezone.sh, not localdrift.
Filed by Claude Opus 5 via Claude Code.