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-launch-browser silently fails when the default browser's Exec= is wrapped (env, flatpak, ...)
Reported by mhavo · 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
System details
omarchy version 4.0.3-1
What's wrong?
What happened
Setting a .desktop-based default web browser whose Exec= line is wrapped
in another command (e.g. Exec=/usr/bin/env python3 script.py %u, or a
Flatpak's Exec=/usr/bin/flatpak run org.example.App %u) makes every
Omarchy keybinding that opens "the browser" (SUPER+SHIFT+RETURN,
SUPER+SHIFT+B, SUPER+SHIFT+ALT+B, and anything else routed throughomarchy-launch-browser) silently do nothing. No error, no notification —
the shortcut just appears dead.
Why
omarchy-launch-browser extracts the executable from the default browser's.desktop entry with:
browser_exec=$(sed -n 's/^Exec=\([^ ]*\).*/\1/p' {~/.local,~/.nix-profile,/usr}/share/applications/$default_browser 2>/dev/null | head -1)
This only captures the first whitespace-separated token after Exec=. For
a normal browser (Exec=firefox %u) that's correct. But when the entry is
wrapped, it captures the wrapper with no arguments:
- Exec=/usr/bin/env python3 .../app.py %u → captures /usr/bin/env
- Exec=/usr/bin/flatpak run org.example.App %u → captures /usr/bin/flatpak
The script then runs that bare command via:
systemd-run --user --quiet --collect --unit="omarchy-browser-$(date +%s%N)" \
--property=StandardOutput=null --property=StandardError=null \
uwsm-app -- "$browser_exec" "${@/--private/$private_flag}"
env with no arguments just prints the environment and exits; flatpak
with no subcommand prints usage. Neither opens a window, and because
stdout/stderr are redirected to /dev/null, there's no visible sign of
failure anywhere.
Steps to reproduce
1. Install any app registered as a web browser (x-scheme-handler/https +
Categories=...WebBrowser...) whose .desktop Exec= line starts with a
wrapper, e.g.:
Exec=/usr/bin/env python3 /path/to/script.py %u
2. xdg-settings set default-web-browser <that-app>.desktop
3. Press SUPER+SHIFT+RETURN (or run omarchy-launch-browser directly).
4. Nothing happens. journalctl --user -u 'omarchy-browser-*' shows the
transient unit ran and exited 0 — it just ran env/flatpak with no args.
Minimal repro without installing anything, once a wrapped app is the
default:
env -u BROWSER xdg-settings get default-web-browser
sed -n 's/^Exec=\([^ ]*\).*/\1/p' ~/.local/share/applications/<id>.desktop
# prints "/usr/bin/env" (or "/usr/bin/flatpak") instead of the real app
Expected
omarchy-launch-browser should run the full Exec= command (minus the
%u/%U field code, with the URL substituted or appended), not just its
first token — the same way gtk-launch <desktop-id> <url> or
gio launch <file>.desktop <url> would handle it correctly, since both
resolve the whole Exec line rather than re-parsing it by hand.
System
- Omarchy version: 4.0.3-1
- Script: /usr/share/omarchy/bin/omarchy-launch-browser
- Triggered via the default keybindings (SUPER+SHIFT+RETURN / SUPER+SHIFT+B
/ SUPER+SHIFT+ALT+B), which call omarchy-launch-browser through the
{ omarchy = "browser" } binding helper.
Happy to test a fix — this reproduces reliably with any env- or
flatpak-wrapped default browser entry.
## Related
Same underlying bug as #10988 (`omarchy-launch-webapp`), just in the sibling
script `bin/omarchy-launch-browser` — both use the same
`sed -n 's/^Exec=\([^ ]*\).*/\1/p'` pattern to extract the browser binary from
a `.desktop` Exec= line, and both break the same way on any wrapped Exec
(`env ...`, `flatpak run ...`). Might be worth fixing both call sites with the
same approach.View raw text
### System details
omarchy version 4.0.3-1
### What's wrong?
## What happened
Setting a `.desktop`-based default web browser whose `Exec=` line is wrapped
in another command (e.g. `Exec=/usr/bin/env python3 script.py %u`, or a
Flatpak's `Exec=/usr/bin/flatpak run org.example.App %u`) makes every
Omarchy keybinding that opens "the browser" (SUPER+SHIFT+RETURN,
SUPER+SHIFT+B, SUPER+SHIFT+ALT+B, and anything else routed through
`omarchy-launch-browser`) silently do nothing. No error, no notification —
the shortcut just appears dead.
## Why
`omarchy-launch-browser` extracts the executable from the default browser's
`.desktop` entry with:
```bash
browser_exec=$(sed -n 's/^Exec=\([^ ]*\).*/\1/p' {~/.local,~/.nix-profile,/usr}/share/applications/$default_browser 2>/dev/null | head -1)
This only captures the first whitespace-separated token after Exec=. For
a normal browser (Exec=firefox %u) that's correct. But when the entry is
wrapped, it captures the wrapper with no arguments:
- Exec=/usr/bin/env python3 .../app.py %u → captures /usr/bin/env
- Exec=/usr/bin/flatpak run org.example.App %u → captures /usr/bin/flatpak
The script then runs that bare command via:
systemd-run --user --quiet --collect --unit="omarchy-browser-$(date +%s%N)" \
--property=StandardOutput=null --property=StandardError=null \
uwsm-app -- "$browser_exec" "${@/--private/$private_flag}"
env with no arguments just prints the environment and exits; flatpak
with no subcommand prints usage. Neither opens a window, and because
stdout/stderr are redirected to /dev/null, there's no visible sign of
failure anywhere.
Steps to reproduce
1. Install any app registered as a web browser (x-scheme-handler/https +
Categories=...WebBrowser...) whose .desktop Exec= line starts with a
wrapper, e.g.:
Exec=/usr/bin/env python3 /path/to/script.py %u
2. xdg-settings set default-web-browser <that-app>.desktop
3. Press SUPER+SHIFT+RETURN (or run omarchy-launch-browser directly).
4. Nothing happens. journalctl --user -u 'omarchy-browser-*' shows the
transient unit ran and exited 0 — it just ran env/flatpak with no args.
Minimal repro without installing anything, once a wrapped app is the
default:
env -u BROWSER xdg-settings get default-web-browser
sed -n 's/^Exec=\([^ ]*\).*/\1/p' ~/.local/share/applications/<id>.desktop
# prints "/usr/bin/env" (or "/usr/bin/flatpak") instead of the real app
Expected
omarchy-launch-browser should run the full Exec= command (minus the
%u/%U field code, with the URL substituted or appended), not just its
first token — the same way gtk-launch <desktop-id> <url> or
gio launch <file>.desktop <url> would handle it correctly, since both
resolve the whole Exec line rather than re-parsing it by hand.
System
- Omarchy version: 4.0.3-1
- Script: /usr/share/omarchy/bin/omarchy-launch-browser
- Triggered via the default keybindings (SUPER+SHIFT+RETURN / SUPER+SHIFT+B
/ SUPER+SHIFT+ALT+B), which call omarchy-launch-browser through the
{ omarchy = "browser" } binding helper.
Happy to test a fix — this reproduces reliably with any env- or
flatpak-wrapped default browser entry.
## Related
Same underlying bug as #10988 (`omarchy-launch-webapp`), just in the sibling
script `bin/omarchy-launch-browser` — both use the same
`sed -n 's/^Exec=\([^ ]*\).*/\1/p'` pattern to extract the browser binary from
a `.desktop` Exec= line, and both break the same way on any wrapped Exec
(`env ...`, `flatpak run ...`). Might be worth fixing both call sites with the
same approach.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 12:53 UTC