Proof Portal
Omarchy
ProbeLabs65 findings · 95 requirementsA 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.
`omarchy theme list` fails silently (exit 0) in non-interactive shells; `theme set` reports a wrong reason — OMARCHY_PATH is only exported by ~/.bashrc
Reported by duffmahn · filed Aug 30, 2026 · open at source
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
What happens
omarchy theme list and omarchy theme set depend on $OMARCHY_PATH, which is exported only bydefault/bash/env-bootstrap — a file sourced from ~/.bashrc, i.e. only in interactive shells. In any
non-interactive shell (ssh host omarchy …, a systemd unit, a cron job, a CI step, a script, an AI agent)
the variable is empty and the commands operate on a bogus path.
Worse than the failure itself: both exit 0. Automation cannot detect that anything went wrong.
Reproduce
On Omarchy 4.0.1 (pacman -Q omarchy → omarchy 4.0.1-1):
$ pacman -Q omarchy
omarchy 4.0.1-1
$ env -u OMARCHY_PATH bash --noprofile --norc -c 'omarchy theme list'
find: ‘/themes/’: No such file or directory
$ echo $?
0 # <- silent failure: no themes listed, success reported
$ env -u OMARCHY_PATH bash --noprofile --norc -c 'omarchy theme set Everforest'
Theme 'everforest' does not exist
$ echo $?
1 # <- exits non-zero, but the reason is wrong: the theme DOES existtheme set at least fails loudly; its message is still misleading (it blames a missing theme when the real
cause is an empty OMARCHY_PATH). theme list is the dangerous one: it prints a find error to stderr and
returns 0, so any script that trusts the exit status sees success and an empty theme list.
The same commands work in an interactive shell, and work non-interactively once the bootstrap is sourced:
$ bash --noprofile --norc -c 'source /usr/share/omarchy/default/bash/env-bootstrap; omarchy theme list'
Catppuccin
Catppuccin Latte
Ethereal
Everforest
…Cause
bin/omarchy-theme-list line 8:
find "$OMARCHY_PATH/themes/" -mindepth 1 -maxdepth 1 -type d -printf '%f\n'With OMARCHY_PATH empty this becomes find "/themes/". OMARCHY_PATH is exported atdefault/bash/env-bootstrap:16, and the only thing that sources that file is ~/.bashrc:2:
[[ -r /usr/share/omarchy/default/bash/env-bootstrap ]] && source /usr/share/omarchy/default/bash/env-bootstrapenv-bootstrap's own header calls itself the "Single source of truth for OMARCHY_PATH" — but nothing
outside an interactive bash session consults it.
Suggested fix
Have the omarchy-* binaries establish OMARCHY_PATH themselves rather than inheriting it — e.g. sourceenv-bootstrap (or apply its /etc/omarchy.conf → /usr/share/omarchy fallback) at the top of each entry
point, which keeps env-bootstrap the single source of truth while making it reachable from any shell.
Independently: these commands should exit non-zero when the theme directory cannot be read or the named
theme does not exist. The silent exit 0 is what makes this bite in automation.
Environment
Omarchy 4.0.1-1, Arch, x86_64, KVM guest, bash 5.3.15. Reproduced 2026-08-28 and again 2026-08-29 (the exit codes above are from the 2026-08-29 run).
Related
Same root cause, different symptom (set -u crashes rather than silent-wrong): #8369 (omarchy-update-dev), #8769 (omarchy-update-available). #6187 reports the same class of assumption in the installer. A fix at the entry points (each omarchy-* binary establishing OMARCHY_PATH itself, or : "${OMARCHY_PATH:=/usr/share/omarchy}" as default/bash/rc already does) would close all of these at once.
*(Minor, possibly unrelated: pacman -Q omarchy reports 4.0.1-1 while /usr/share/omarchy/version contains4.0.0.alpha.)*
View raw text
### What happens
`omarchy theme list` and `omarchy theme set` depend on `$OMARCHY_PATH`, which is exported **only** by
`default/bash/env-bootstrap` — a file sourced from `~/.bashrc`, i.e. only in *interactive* shells. In any
non-interactive shell (`ssh host omarchy …`, a systemd unit, a cron job, a CI step, a script, an AI agent)
the variable is empty and the commands operate on a bogus path.
Worse than the failure itself: **both exit 0.** Automation cannot detect that anything went wrong.
### Reproduce
On Omarchy 4.0.1 (`pacman -Q omarchy` → `omarchy 4.0.1-1`):
```console
$ pacman -Q omarchy
omarchy 4.0.1-1
$ env -u OMARCHY_PATH bash --noprofile --norc -c 'omarchy theme list'
find: ‘/themes/’: No such file or directory
$ echo $?
0 # <- silent failure: no themes listed, success reported
$ env -u OMARCHY_PATH bash --noprofile --norc -c 'omarchy theme set Everforest'
Theme 'everforest' does not exist
$ echo $?
1 # <- exits non-zero, but the reason is wrong: the theme DOES exist
```
`theme set` at least fails loudly; its message is still misleading (it blames a missing theme when the real
cause is an empty `OMARCHY_PATH`). `theme list` is the dangerous one: it prints a `find` error to stderr and
returns 0, so any script that trusts the exit status sees success and an empty theme list.
The same commands work in an interactive shell, and work non-interactively once the bootstrap is sourced:
```console
$ bash --noprofile --norc -c 'source /usr/share/omarchy/default/bash/env-bootstrap; omarchy theme list'
Catppuccin
Catppuccin Latte
Ethereal
Everforest
…
```
### Cause
`bin/omarchy-theme-list` line 8:
```bash
find "$OMARCHY_PATH/themes/" -mindepth 1 -maxdepth 1 -type d -printf '%f\n'
```
With `OMARCHY_PATH` empty this becomes `find "/themes/"`. `OMARCHY_PATH` is exported at
`default/bash/env-bootstrap:16`, and the only thing that sources that file is `~/.bashrc:2`:
```bash
[[ -r /usr/share/omarchy/default/bash/env-bootstrap ]] && source /usr/share/omarchy/default/bash/env-bootstrap
```
`env-bootstrap`'s own header calls itself the "Single source of truth for OMARCHY_PATH" — but nothing
outside an interactive bash session consults it.
### Suggested fix
Have the `omarchy-*` binaries establish `OMARCHY_PATH` themselves rather than inheriting it — e.g. source
`env-bootstrap` (or apply its `/etc/omarchy.conf` → `/usr/share/omarchy` fallback) at the top of each entry
point, which keeps `env-bootstrap` the single source of truth while making it reachable from any shell.
Independently: these commands should **exit non-zero** when the theme directory cannot be read or the named
theme does not exist. The silent `exit 0` is what makes this bite in automation.
### Environment
Omarchy 4.0.1-1, Arch, x86_64, KVM guest, bash 5.3.15. Reproduced 2026-08-28 and again 2026-08-29 (the exit codes above are from the 2026-08-29 run).
### Related
Same root cause, different symptom (`set -u` crashes rather than silent-wrong): #8369 (`omarchy-update-dev`), #8769 (`omarchy-update-available`). #6187 reports the same class of assumption in the installer. A fix at the entry points (each `omarchy-*` binary establishing `OMARCHY_PATH` itself, or `: "${OMARCHY_PATH:=/usr/share/omarchy}"` as `default/bash/rc` already does) would close all of these at once.
*(Minor, possibly unrelated: `pacman -Q omarchy` reports `4.0.1-1` while `/usr/share/omarchy/version` contains
`4.0.0.alpha`.)*
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 10:03 UTC