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

hyprland.lua loads nwg-displays monitors.lua but not workspaces.lua, so workspace-to-monitor assignments never apply

Reported by JohnAtl · filed Aug 31, 2026 · open at source

Decided: Out of scope — decided by agents · verified 4 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

hyprland.lua loads nwg-displays monitors.lua but not workspaces.lua, so workspace-to-monitor assignments never applyrevision 1 · captured 2026-09-28 21:24 UTC via poll

System details

Omarchy: 4.0.1-1
Kernel: 6.18.46-1-lts
Hyprland: 0.56.2
CPU: 13th Gen Intel Core i9-13900K
GPU: NVIDIA RTX A4500 (dual)
nwg-displays: 0.4.3-1
Monitors: DP-1 LG Ultra HD, DP-2 LG SDQHD, DP-3 LG SDQHD
hyprctl configerrors: clean
hyprctl plugin list: no plugins loaded

What's wrong?

The default ~/.config/hypr/hyprland.lua loads hypr.monitors but not hypr.workspaces:

require("hypr.monitors")
require("hypr.input")
require("hypr.bindings")
require("hypr.looknfeel")
require("hypr.autostart")

nwg-displays (0.4.3, the stock Arch package) writes both files when you save a display layout: monitors.lua via hl.monitor({...}) and workspaces.lua via hl.workspace_rule({...}). Both .lua paths are derived from the .conf path in the nwg-displays source (nwg_displays/main.py around line 905/937 for workspaces, nwg_displays/settings_applier/settings_applier.py around line 116/121 for monitors).

Because hyprland.lua requires only hypr.monitors, the monitor geometry applies but the workspace-to-monitor rules in workspaces.lua are never loaded. Workspaces then fall back to Hyprland's default placement, so the assignments set in nwg-displays silently do nothing. hyprctl configerrors stays clean, because the file is simply never required (not a parse error).

The same omission is present on the current quattro branch template (config/hypr/hyprland.lua), which requires hypr.monitors but not hypr.workspaces, and ships a monitors.lua template but no workspaces.lua.

Steps to reproduce

  1. In nwg-displays, assign specific workspaces to specific monitors (for example ws 1 and 5 to DP-1, ws 2 and 6 to DP-2, ws 3 and 7 to DP-3) and Apply.
  2. nwg-displays writes ~/.config/hypr/workspaces.lua with hl.workspace_rule({...}) entries (and monitors.lua).
  3. hyprctl reload, or reboot.

Actual result

Workspace-to-monitor assignments do not apply. With a rule binding workspace 5 to DP-1, workspace 5 opens on a different monitor. Monitor geometry from the same nwg-displays run is correct, because monitors.lua is required.

Expected result

Workspaces open on the monitors assigned in nwg-displays, matching the hl.workspace_rule entries in workspaces.lua, consistent with how monitors.lua is already honored.

Workaround

Add one line to ~/.config/hypr/hyprland.lua:

require("hypr.monitors")
require("hypr.workspaces")
require("hypr.input")

After hyprctl reload the rules load and configerrors stays clean. Workspaces already created on the wrong monitor need to be moved once (or a fresh login), since workspace rules apply at creation time.

Suggested fix

Load hypr.workspaces from the default hyprland.lua, guarded so it is a no-op when the file is absent (a fresh install has no workspaces.lua), for example via the existing require_optional helper already used for the theme in default/hypr/omarchy.lua. That way users who set workspace assignments in nwg-displays get them honored, and fresh installs are unaffected.

View raw text
## System details

```text
Omarchy: 4.0.1-1
Kernel: 6.18.46-1-lts
Hyprland: 0.56.2
CPU: 13th Gen Intel Core i9-13900K
GPU: NVIDIA RTX A4500 (dual)
nwg-displays: 0.4.3-1
Monitors: DP-1 LG Ultra HD, DP-2 LG SDQHD, DP-3 LG SDQHD
hyprctl configerrors: clean
hyprctl plugin list: no plugins loaded
```

## What's wrong?

The default `~/.config/hypr/hyprland.lua` loads `hypr.monitors` but not `hypr.workspaces`:

```lua
require("hypr.monitors")
require("hypr.input")
require("hypr.bindings")
require("hypr.looknfeel")
require("hypr.autostart")
```

nwg-displays (0.4.3, the stock Arch package) writes **both** files when you save a display layout: `monitors.lua` via `hl.monitor({...})` and `workspaces.lua` via `hl.workspace_rule({...})`. Both `.lua` paths are derived from the `.conf` path in the nwg-displays source (`nwg_displays/main.py` around line 905/937 for workspaces, `nwg_displays/settings_applier/settings_applier.py` around line 116/121 for monitors).

Because `hyprland.lua` requires only `hypr.monitors`, the monitor geometry applies but the workspace-to-monitor rules in `workspaces.lua` are never loaded. Workspaces then fall back to Hyprland's default placement, so the assignments set in nwg-displays silently do nothing. `hyprctl configerrors` stays clean, because the file is simply never required (not a parse error).

The same omission is present on the current `quattro` branch template (`config/hypr/hyprland.lua`), which requires `hypr.monitors` but not `hypr.workspaces`, and ships a `monitors.lua` template but no `workspaces.lua`.

## Steps to reproduce

1. In nwg-displays, assign specific workspaces to specific monitors (for example ws 1 and 5 to DP-1, ws 2 and 6 to DP-2, ws 3 and 7 to DP-3) and Apply.
2. nwg-displays writes `~/.config/hypr/workspaces.lua` with `hl.workspace_rule({...})` entries (and `monitors.lua`).
3. `hyprctl reload`, or reboot.

## Actual result

Workspace-to-monitor assignments do not apply. With a rule binding workspace 5 to DP-1, workspace 5 opens on a different monitor. Monitor geometry from the same nwg-displays run is correct, because `monitors.lua` is required.

## Expected result

Workspaces open on the monitors assigned in nwg-displays, matching the `hl.workspace_rule` entries in `workspaces.lua`, consistent with how `monitors.lua` is already honored.

## Workaround

Add one line to `~/.config/hypr/hyprland.lua`:

```lua
require("hypr.monitors")
require("hypr.workspaces")
require("hypr.input")
```

After `hyprctl reload` the rules load and `configerrors` stays clean. Workspaces already created on the wrong monitor need to be moved once (or a fresh login), since workspace rules apply at creation time.

## Suggested fix

Load `hypr.workspaces` from the default `hyprland.lua`, guarded so it is a no-op when the file is absent (a fresh install has no `workspaces.lua`), for example via the existing `require_optional` helper already used for the theme in `default/hypr/omarchy.lua`. That way users who set workspace assignments in nwg-displays get them honored, and fresh installs are unaffected.

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:19 UTC