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.
launcher.hides entry "hermes" removes Hermes Desktop from the launcher even when the hermes-desktop package is not installed
Reported by pablo-io · filed Sep 13, 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
<img width="304" height="130" alt="Image" src="https://github.com/user-attachments/assets/8f71ca18-b080-4366-8753-fadee710442f" />
System details
AMD Ryzen 7 8745HS (Radeon 780M / AMD HawkPoint), Omarchy 4.0.3-1, omarchy-settings 4.0.3-1, Hyprland 0.56.2-2, kernel 7.2.3-arch1-3.omarchy-debug --no-sudo --print log: https://logs.omarchy.org/1sBFFB (expires in 24h)
What's wrong?
hermes was added to default/omarchy/launcher.hides in 9fb73b005 ("Hide the upstream Hermes launcher in Omarchy"). Configured hides are applied to every desktop entry, including the user's own in ~/.local/share/applications, and they are matched purely on the entry id (= file name):
shell/services/AppLibrary.qml:221— the only hides file read isOMARCHY_PATH/default/omarchy/launcher.hides(i.e. the package-owned copy under/usr/share/omarchy).AppLibrary.isHiddenEntry()— returns true forconfiguredHiddenEntryIds[id], no matter which directory the entry came from.
The intent, per the commit message and the new test/shell.d/app-search-test.sh case, is to keep exactly one row when both the packaged hermes-desktop launcher and Hermes's self-registered hermes entry exist. But the hide is unconditional, so on a machine where the hermes-desktop package is not installed it hides the user's only Hermes launcher, and the app silently vanishes from the launcher.
Hermes Desktop registers/refreshes that exact file name itself (from its own docs): "On Linux, launches refresh `$XDG_DATA_HOME/applications/hermes.desktop` (by default `~/.local/share/applications/hermes.desktop`) so Hermes appears in the application menu."
Reproduce
- Omarchy 4.0.3, no Hermes package installed:
pacman -Qs hermes→ nothing, andls /usr/share/applications | grep -i hermes→ nothing. - Install Hermes Desktop from source (
hermes desktop), which writes~/.local/share/applications/hermes.desktop. - Open the launcher and search
hermes→No matches for "hermes".
The entry itself is fine:
$ desktop-file-validate ~/.local/share/applications/hermes.desktop # clean
$ gtk-launch hermes.desktop # app starts
$ grep -x hermes /usr/share/omarchy/default/omarchy/launcher.hides
hermesCapture: launcher search for hermes returning No matches for "hermes" — screenshot attached by the reporter (gh cannot upload media).
Expected
Hermes shows in the launcher unless the duplicate it was added to suppress is actually present.
Notes on fixability
There is currently no supported way for a user to un-hide an entry: the hides list is package-owned (/usr/share/omarchy/default/omarchy/launcher.hides, owned by omarchy-settings) and editing it is overwritten on the next omarchy update.
Options, roughly in order of preference:
- Make the hide conditional, e.g. only hide
hermeswhen ahermes-desktopentry exists (awhen:-style entry in the hides file, or a check inAppLibrary.loadConfiguredHides()). - Only apply configured hides to entries coming from system
XDG_DATA_DIRSapplication dirs, leaving~/.local/share/applicationsunder user control. - Add a user-level hides file (e.g.
~/.config/omarchy/launcher.hides) that can override packaged hides, so this is at least escapable without touching package files.
Workaround in use
Copying the entry to an id that isn't hidden (~/.local/share/applications/hermes-desktop.desktop). It works, but it collides with the id of Omarchy's own packaged launcher and is not discoverable — anyone who installs Hermes Desktop from source on Omarchy just gets a missing app.
View raw text
<img width="304" height="130" alt="Image" src="https://github.com/user-attachments/assets/8f71ca18-b080-4366-8753-fadee710442f" />
## System details
AMD Ryzen 7 8745HS (Radeon 780M / AMD HawkPoint), Omarchy 4.0.3-1, omarchy-settings 4.0.3-1, Hyprland 0.56.2-2, kernel 7.2.3-arch1-3.
`omarchy-debug --no-sudo --print` log: https://logs.omarchy.org/1sBFFB (expires in 24h)
## What's wrong?
`hermes` was added to `default/omarchy/launcher.hides` in 9fb73b005 ("Hide the upstream Hermes launcher in Omarchy"). Configured hides are applied to **every** desktop entry, including the user's own in `~/.local/share/applications`, and they are matched purely on the entry id (= file name):
- `shell/services/AppLibrary.qml:221` — the only hides file read is `OMARCHY_PATH/default/omarchy/launcher.hides` (i.e. the package-owned copy under `/usr/share/omarchy`).
- `AppLibrary.isHiddenEntry()` — returns true for `configuredHiddenEntryIds[id]`, no matter which directory the entry came from.
The intent, per the commit message and the new `test/shell.d/app-search-test.sh` case, is to keep exactly one row when **both** the packaged `hermes-desktop` launcher and Hermes's self-registered `hermes` entry exist. But the hide is unconditional, so on a machine where the `hermes-desktop` package is not installed it hides the user's *only* Hermes launcher, and the app silently vanishes from the launcher.
Hermes Desktop registers/refreshes that exact file name itself (from its own docs): *"On Linux, launches refresh `$XDG_DATA_HOME/applications/hermes.desktop` (by default `~/.local/share/applications/hermes.desktop`) so Hermes appears in the application menu."*
### Reproduce
1. Omarchy 4.0.3, no Hermes package installed: `pacman -Qs hermes` → nothing, and `ls /usr/share/applications | grep -i hermes` → nothing.
2. Install Hermes Desktop from source (`hermes desktop`), which writes `~/.local/share/applications/hermes.desktop`.
3. Open the launcher and search `hermes` → `No matches for "hermes"`.
The entry itself is fine:
```
$ desktop-file-validate ~/.local/share/applications/hermes.desktop # clean
$ gtk-launch hermes.desktop # app starts
$ grep -x hermes /usr/share/omarchy/default/omarchy/launcher.hides
hermes
```
Capture: launcher search for `hermes` returning `No matches for "hermes"` — screenshot attached by the reporter (gh cannot upload media).
### Expected
Hermes shows in the launcher unless the duplicate it was added to suppress is actually present.
## Notes on fixability
There is currently no supported way for a user to un-hide an entry: the hides list is package-owned (`/usr/share/omarchy/default/omarchy/launcher.hides`, owned by `omarchy-settings`) and editing it is overwritten on the next `omarchy update`.
Options, roughly in order of preference:
1. Make the hide conditional, e.g. only hide `hermes` when a `hermes-desktop` entry exists (a `when:`-style entry in the hides file, or a check in `AppLibrary.loadConfiguredHides()`).
2. Only apply configured hides to entries coming from system `XDG_DATA_DIRS` application dirs, leaving `~/.local/share/applications` under user control.
3. Add a user-level hides file (e.g. `~/.config/omarchy/launcher.hides`) that can override packaged hides, so this is at least escapable without touching package files.
### Workaround in use
Copying the entry to an id that isn't hidden (`~/.local/share/applications/hermes-desktop.desktop`). It works, but it collides with the id of Omarchy's own packaged launcher and is not discoverable — anyone who installs Hermes Desktop from source on Omarchy just gets a missing app.
- 8f71ca18-b080-4366-8753-fadee710442f
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
- Fixed bypr/11000· confirmed
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 13:37 UTC