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-594GitHub issuePublicDecided· Out of scope

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

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

omarchy-launch-browser silently fails when the default browser's Exec= is wrapped (env, flatpak, ...)revision 1 · captured 2026-09-28 21:23 UTC via poll

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:

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