Proof Portal

Project overview

Omarchy

ProbeLabs65 findings · 95 requirements

A proof layer — requirements, tests and verified fixes — for two of Omarchy's subsystems: the application menu (launcher scripts, QML model, JSONC config, search and selection) and the lock screen (lock scripts, QML, PAM authentication). Scope is deliberately limited to those components of omacom/omarchy; the rest of the distribution is not covered.

Inbox
ReportR-748GitHub issuePublicDecided· Out of scope

system-update widget: concurrent checkupdates races on multi-monitor, so the update icon shows on only one bar

Reported by EJ-Monkey · filed Sep 10, 2026 · open at source

Decided: Out of scope — decided by agents · verified 3 days ago.

At a glance

1 · What is claimed?
Only the report text below — no validator has restated it as checkable claims yet.
2 · What does it affect?
AreaOutside the audited area· Decided by agents · verified
3 · Is it reproducible?
No validation has been run yet.
4 · What remains unclear?
  • Not validated yet: no claims, no reproducer.
5 · What happens next?
Decided by agents and verified by a second, independent agent — see the decision.

Original report

system-update widget: concurrent checkupdates races on multi-monitor, so the update icon shows on only one barrevision 1 · captured 2026-09-28 21:23 UTC via poll

What happens

On a multi-monitor setup, the omarchy.system-update bar widget shows the
"update available" icon on only one monitor's bar. Which monitor wins is
non-deterministic — forcing a re-check with
omarchy-shell omarchy.system-update refresh reliably moves the icon to the
other bar rather than showing it on both.

What I expected

The update icon appears on every monitor's bar, since the update state is a
property of the system, not of a monitor.

Root cause

SystemUpdate.qml is instantiated per bar, and each instance runs its own
check with triggeredOnStart: true:

Process {
  id: updateProc
  command: ["omarchy-update-available"]
  onExited: function(exitCode) { root.updateAvailable = exitCode === 0 }
}
Timer { interval: 21600000; running: true; repeat: true; triggeredOnStart: true }
visible: updateAvailable

omarchy-update-available calls checkupdates, which uses a single shared
temporary pacman database per user:

CHECKUPDATES_DB="${TMPDIR:-/tmp}/checkup-db-${UID}/"
trap 'rm -f $CHECKUPDATES_DB/db.lck' INT TERM EXIT
fakeroot -- pacman -Sy --disable-sandbox-filesystem --dbpath "$CHECKUPDATES_DB" ... &> /dev/null

With two monitors the two instances invoke this simultaneously and contend on
the pacman lock. The loser's pacman -Sy fails, the failure is swallowed by
&> /dev/null, its pacman -Qu therefore returns nothing, and
omarchy-update-available prints "Omarchy is up to date" and exits 1 — so that
bar sets visible: false. The trap compounds it: whichever invocation exits
first deletes db.lck out from under the one still running.

Steps to reproduce

  1. Two or more monitors, each with a bar.
  2. Have a pending Omarchy package update.
  3. Restart the shell (or run omarchy-shell omarchy.system-update refresh).
  4. The icon appears on exactly one bar.

Reproducible directly, without the shell, by running two checks concurrently:

$ omarchy-update-available & omarchy-update-available & wait
omarchy 4.0.2-1 -> 4.0.3-1      # exit 0
Omarchy is up to date           # exit 1   <-- wrong

Run sequentially, the same command is consistently correct (3/3 exit 0), which
confirms contention rather than a flaky check.

Suggested fix

Serialize the check — e.g. wrap the checkupdates call in
omarchy-update-available with flock on a per-user lock file so concurrent
callers queue instead of racing. That fixes every caller at once rather than
only the widget. Alternatively, have a single shared poller publish one result
to all bar instances, which would also drop N redundant pacman -Sy calls per
refresh on multi-monitor systems.

A related smaller issue: omarchy-update-available cannot distinguish
"no updates" from "the check failed", because checkupdates failures are
discarded. Treating a failed check as "up to date" is what makes this
user-visible.

System details

Omarchy4.0.2-1
Kernel7.1.9-arch1-2
Hyprland0.56.2
CPUIntel Core i5-7400
GPUNVIDIA GP104 [GeForce GTX 1070]
Monitors2
pacman-contrib1.13.1-1
View raw text
### What happens

On a multi-monitor setup, the `omarchy.system-update` bar widget shows the
"update available" icon on **only one** monitor's bar. Which monitor wins is
non-deterministic — forcing a re-check with
`omarchy-shell omarchy.system-update refresh` reliably moves the icon to the
*other* bar rather than showing it on both.

### What I expected

The update icon appears on every monitor's bar, since the update state is a
property of the system, not of a monitor.

### Root cause

`SystemUpdate.qml` is instantiated per bar, and each instance runs its own
check with `triggeredOnStart: true`:

```qml
Process {
  id: updateProc
  command: ["omarchy-update-available"]
  onExited: function(exitCode) { root.updateAvailable = exitCode === 0 }
}
Timer { interval: 21600000; running: true; repeat: true; triggeredOnStart: true }
visible: updateAvailable
```

`omarchy-update-available` calls `checkupdates`, which uses a single shared
temporary pacman database per user:

```bash
CHECKUPDATES_DB="${TMPDIR:-/tmp}/checkup-db-${UID}/"
trap 'rm -f $CHECKUPDATES_DB/db.lck' INT TERM EXIT
fakeroot -- pacman -Sy --disable-sandbox-filesystem --dbpath "$CHECKUPDATES_DB" ... &> /dev/null
```

With two monitors the two instances invoke this simultaneously and contend on
the pacman lock. The loser's `pacman -Sy` fails, the failure is swallowed by
`&> /dev/null`, its `pacman -Qu` therefore returns nothing, and
`omarchy-update-available` prints "Omarchy is up to date" and exits 1 — so that
bar sets `visible: false`. The `trap` compounds it: whichever invocation exits
first deletes `db.lck` out from under the one still running.

### Steps to reproduce

1. Two or more monitors, each with a bar.
2. Have a pending Omarchy package update.
3. Restart the shell (or run `omarchy-shell omarchy.system-update refresh`).
4. The icon appears on exactly one bar.

Reproducible directly, without the shell, by running two checks concurrently:

```console
$ omarchy-update-available & omarchy-update-available & wait
omarchy 4.0.2-1 -> 4.0.3-1      # exit 0
Omarchy is up to date           # exit 1   <-- wrong
```

Run sequentially, the same command is consistently correct (3/3 exit 0), which
confirms contention rather than a flaky check.

### Suggested fix

Serialize the check — e.g. wrap the `checkupdates` call in
`omarchy-update-available` with `flock` on a per-user lock file so concurrent
callers queue instead of racing. That fixes every caller at once rather than
only the widget. Alternatively, have a single shared poller publish one result
to all bar instances, which would also drop N redundant `pacman -Sy` calls per
refresh on multi-monitor systems.

A related smaller issue: `omarchy-update-available` cannot distinguish
"no updates" from "the check failed", because `checkupdates` failures are
discarded. Treating a failed check as "up to date" is what makes this
user-visible.

### System details

| | |
|---|---|
| Omarchy | 4.0.2-1 |
| Kernel | 7.1.9-arch1-2 |
| Hyprland | 0.56.2 |
| CPU | Intel Core i5-7400 |
| GPU | NVIDIA GP104 [GeForce GTX 1070] |
| Monitors | 2 |
| pacman-contrib | 1.13.1-1 |

Validation

Not checked yet. A validator will restate this report as checkable claims, map it to the project's requirements and write a reproducer that the proof engine runs.

Linked

Not linked to any known issue, other report or change yet.

Decision

Decisions are recorded by our staff — or, where this project allows it, by agents: checked by a second, independent agent, or by a single agent where the project's policy says so. Any decision reached so far is shown below.

  • Out of scopeDecided by agents · verified · 2026-10-09 11:22 UTC