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.
Default Obsidian binding: focus = "^obsidian$" is anchored, so it can never match and SUPER+SHIFT+O never focuses an open window
Reported by muishond · filed Aug 29, 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 4.0.0.alpha, Hyprland 0.56.2. Present at main as of today indefault/hypr/bindings/applications.lua:18.
What's wrong?
The default Obsidian binding can never focus an already-open Obsidian window.SUPER + SHIFT + O always takes the launch branch, Obsidian's single-instance
lock swallows the new process, the existing window never moves — and the key
looks dead.
o.bind("SUPER + SHIFT + O", "Obsidian", { launch = "obsidian", focus = "^obsidian$" })focus is a regex fragment, not a whole pattern. omarchy-launch-or-focus
interpolates it:
test("\\b" + $p + "\\b";"i")so ^obsidian$ becomes \b^obsidian$\b, which matches nothing, ever. The
pattern is also wrong on its own terms — Obsidian's class ismd.obsidian.Obsidian (its StartupWMClass), not obsidian.
Steps to reproduce
- Open Obsidian.
- Focus any other window.
- Press
SUPER + SHIFT + O.
Nothing happens. Most visible with a fullscreen window up, where it reads as the
shortcut being broken rather than as a no-op.
Confirming the match fails, with Obsidian running:
$ hyprctl clients -j | jq -r --arg p '^obsidian$' \
'.[]|select((.class|test("\\b"+$p+"\\b";"i")))|.class'
# (nothing)
$ hyprctl clients -j | jq -r --arg p 'md.obsidian.Obsidian' \
'.[]|select((.class|test("\\b"+$p+"\\b";"i")))|.class'
md.obsidian.ObsidianSuggested fix
-o.bind("SUPER + SHIFT + O", "Obsidian", { launch = "obsidian", focus = "^obsidian$" })
+o.bind("SUPER + SHIFT + O", "Obsidian", { launch = "obsidian", focus = "md.obsidian.Obsidian" })Verified on this machine: with the class pattern, focusing works and — becausemisc:on_focus_under_fullscreen = 1 is already a default — Obsidian correctly
takes over a fullscreen window on the same workspace.
Why it is worth fixing rather than leaving to the app
It is tempting to assume Obsidian raises its own window and the binding is
redundant. It cannot, on Wayland: activating a window requires an
xdg-activation token passed from a real user interaction, and a process
spawned by uwsm-app from a keybinding has none, so the compositor is entitled
to ignore the request. The compositor has to be told explicitly, which is whatomarchy-launch-or-focus exists to do.
Possibly worth a sweep
Anchored patterns fail silently, so they are easy to miss in review. It may be
worth grepping the defaults for focus = "^. Distinct from #4927 / #3669, which
are about omarchy-launch-or-focus matching too broadly (the .title
fallback) — this one is about a pattern that matches nothing at all. A pattern
that can never match would be cheap to reject at bind time.
View raw text
### System details
Omarchy 4.0.0.alpha, Hyprland 0.56.2. Present at `main` as of today in
`default/hypr/bindings/applications.lua:18`.
### What's wrong?
The default Obsidian binding can never focus an already-open Obsidian window.
`SUPER + SHIFT + O` always takes the *launch* branch, Obsidian's single-instance
lock swallows the new process, the existing window never moves — and the key
looks dead.
```lua
o.bind("SUPER + SHIFT + O", "Obsidian", { launch = "obsidian", focus = "^obsidian$" })
```
`focus` is a **regex fragment, not a whole pattern**. `omarchy-launch-or-focus`
interpolates it:
```bash
test("\\b" + $p + "\\b";"i")
```
so `^obsidian$` becomes `\b^obsidian$\b`, which matches nothing, ever. The
pattern is also wrong on its own terms — Obsidian's class is
`md.obsidian.Obsidian` (its `StartupWMClass`), not `obsidian`.
### Steps to reproduce
1. Open Obsidian.
2. Focus any other window.
3. Press `SUPER + SHIFT + O`.
Nothing happens. Most visible with a fullscreen window up, where it reads as the
shortcut being broken rather than as a no-op.
Confirming the match fails, with Obsidian running:
```console
$ hyprctl clients -j | jq -r --arg p '^obsidian$' \
'.[]|select((.class|test("\\b"+$p+"\\b";"i")))|.class'
# (nothing)
$ hyprctl clients -j | jq -r --arg p 'md.obsidian.Obsidian' \
'.[]|select((.class|test("\\b"+$p+"\\b";"i")))|.class'
md.obsidian.Obsidian
```
### Suggested fix
```diff
-o.bind("SUPER + SHIFT + O", "Obsidian", { launch = "obsidian", focus = "^obsidian$" })
+o.bind("SUPER + SHIFT + O", "Obsidian", { launch = "obsidian", focus = "md.obsidian.Obsidian" })
```
Verified on this machine: with the class pattern, focusing works and — because
`misc:on_focus_under_fullscreen = 1` is already a default — Obsidian correctly
takes over a fullscreen window on the same workspace.
### Why it is worth fixing rather than leaving to the app
It is tempting to assume Obsidian raises its own window and the binding is
redundant. It cannot, on Wayland: activating a window requires an
**xdg-activation token** passed from a real user interaction, and a process
spawned by `uwsm-app` from a keybinding has none, so the compositor is entitled
to ignore the request. The compositor has to be told explicitly, which is what
`omarchy-launch-or-focus` exists to do.
### Possibly worth a sweep
Anchored patterns fail silently, so they are easy to miss in review. It may be
worth grepping the defaults for `focus = "^`. Distinct from #4927 / #3669, which
are about `omarchy-launch-or-focus` matching too *broadly* (the `.title`
fallback) — this one is about a pattern that matches nothing at all. A pattern
that can never match would be cheap to reject at bind time.
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 09:50 UTC