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-5236GitHub issuePublicReceived

Qt 6.12: QtQuick.Color shadows qs.Commons.Color singleton — menus render as a fullscreen black screen

Reported by playGitboy · filed Oct 8, 2026Closed upstream on 2026-10-08 by the bot omarchybot; the closing comment says it was fixed by PR #14553. GitHub close reason: completed.

Received and recorded verbatim. Nothing has been checked yet.

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?
Not yet mapped to any requirement or component.
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?
Our staff decide whether the report is valid. Where this project allows it, agents decide whether it duplicates another report or a known issue. No decision has been recorded yet.

Original report

Qt 6.12: QtQuick.Color shadows qs.Commons.Color singleton — menus render as a fullscreen black screenrevision 1 · captured 2026-10-08 10:20 UTC via poll

Summary

After today's system update to Qt 6.12, every Quickshell surface that uses the shell's Color singleton renders as solid black. The most visible symptom is that SUPER+SPACE (root menu) and SUPER+ESCAPE (system menu) both turn the whole screen black — the omarchy-menu layer paints an opaque black fullscreen rectangle instead of the menu card.

Root cause: `QtQuick.Color` is a new built-in QML type in Qt 6.12, and it now shadows Omarchy's `qs.Commons.Color` singleton. This is not fixed by rebuilding quickshell (see "Why rebuilding quickshell does not help").

Steps to reproduce

  1. sudo pacman -Syu — brings qt6-base 6.11.2 -> 6.12.0 and qt6-declarative 6.11.2 -> 6.12.0
  2. Restart the shell (omarchy restart shell) or reboot
  3. Press SUPER+SPACE, or SUPER+ESCAPE

Expected

The Omarchy menu opens as a rounded card over a dimmed desktop.

Actual

The entire screen turns opaque black. Pressing SUPER+ALT+SPACE, SUPER+CTRL+SPACE (background switcher) and SUPER+SHIFT+CTRL+SPACE (theme menu) — all the same omarchy-menu layer — are affected too. The bar loses its themed colors as well.

Screenshot

Black screen on omarchy menu summon root (1920x1080, nothing but black):

<!-- attach: menu-black.png -->

Root cause

Qt 6.12 added Color as a built-in QtQuick QML singleton (QQuickColor):

Omarchy's shell declares its own singleton named Color in /usr/share/omarchy/shell/Commons/qmldir:

module qs.Commons
singleton Border 1.0 Border.qml
singleton Color 1.0 Color.qml     # <-- collides with the new QtQuick.Color
singleton Style 1.0 Style.qml
singleton Util 1.0 Util.qml

Shell QML files import both modules unqualified:

import QtQuick
import Quickshell
import qs.Commons

so every reference to Color.<surface>.<role> now binds to QtQuick's built-in Color singleton instead of qs.Commons.Color. Color.menu (and Color.bar, Color.lock, Color.polkit, …) is undefined, and the resulting bindings feed undefined into color properties.

Verification (isolated repro, no Omarchy code involved)

A minimal Quickshell config importing the real /usr/share/omarchy/shell/Commons modules:

import QtQuick
import Quickshell
import qs.Commons
import qs.Commons as QC
unqualified Color         -> QQuickColor(0x7f2f57fd4a80)      <-- QtQuick built-in, WRONG
QC.Color                 -> Color_QMLTYPE_10(0x7f2f60680ee0) <-- qs.Commons singleton, correct
QC.Color.menu.background -> #101315
QC.Color.menu.text       -> #cacccc
QC.Color.menu.scrim      -> #80101315
typeof Color.menu        -> undefined

So the singleton itself is registered correctly — only the unqualified name lookup now prefers the built-in type.

Why the screen goes black

Ui/OverlayWindow.qml (a fullscreen PanelWindow) sets color: "transparent", and plugins/menu/Menu.qml puts a fullscreen scrim inside it:

OverlayWindow {
  id: panel
  shown: root.opened && root.rowsLoaded
  WlrLayershell.namespace: "omarchy-menu"
  ...
  Rectangle {
    anchors.fill: parent
    color: root.scrim        // root.scrim = Color.menu.scrim -> undefined
  }

An invalid / `undefined` `color` renders as opaque black in Qt Quick (verified with a standalone fullscreen PanelWindow + Rectangle { anchors.fill: parent; property color bad: undefined; color: bad }):

fullscreen PanelWindow, color: "transparent", no children  -> #84BEFD (wallpaper shows through)
fullscreen PanelWindow + Rectangle with undefined color     -> #000000 (opaque black)

hyprctl layers while the menu is "open":

Monitor HEADLESS-1:
        Layer 55e2d5f46e70: xywh: 0 0 1536 26,  a: 1, namespace: omarchy-bar,     pid: 6864
        Layer 55e2d5f31860: xywh: 0 0 1536 864, a: 1, namespace: omarchy-menu,    pid: 6864

Shell log evidence

The shell log (/run/user/1000/quickshell/by-id/<id>/log.qslog) is full of this pattern right after startup:

file:///usr/share/omarchy/shell/plugins/menu/Menu.qml[91:-1]: TypeError: Cannot read property 'scrim' of undefined
file:///usr/share/omarchy/shell/plugins/menu/Menu.qml[87:-1]: TypeError: Cannot read property 'background' of undefined
file:///usr/share/omarchy/shell/Commons/Border.qml[25:-1]:  TypeError: Cannot read property 'menu.border-alpha' of undefined
@Ui/Button.qml[35:3]: Unable to assign [undefined] to QColor
file:///usr/share/omarchy/shell/plugins/clipboard/Clipboard.qml[25:-1]: TypeError: Cannot read property 'background' of undefined
file:///usr/share/omarchy/shell/plugins/emojis/Emojis.qml[26:-1]: TypeError: Cannot read property 'background' of undefined
file:///usr/share/omarchy/shell/plugins/osd/Osd.qml[143:-1]: TypeError: Cannot read property 'border' of undefined
file:///usr/share/omarchy/shell/plugins/lock/...: TypeError: ...

Impact

  • Color is used in 66 of 90 stock shell QML files, and in 14 installed third-party plugin files under ~/.config/omarchy/plugins — so first-party and community plugins break together.
  • Affected surfaces: menu, bar, notifications, lock screen, polkit, OSD, clipboard, emoji picker, image picker, reminders, confirm dialogs.
  • Community plugins that read Color.* are also broken and cannot be fixed from their own side.

Why rebuilding quickshell does not help

Quickshell prints this on every start:

WARN: Quickshell was built against Qt 6.11.2 but the system has updated to Qt 6.12.0
without rebuilding the package. This is likely to cause crashes, so the quickshell
package must be rebuilt.

That warning is real but it is not the cause of this bug, and rebuilding quickshell will not fix it. Type-name resolution for import qs.Commons happens inside Qt's QML engine (libQt6Qml), not inside quickshell — the isolated repro above resolves the same way regardless of which quickshell build is installed. Rebuilding quickshell against 6.12 is still worth doing for its own sake, but the menu will stay black.

Suggested fix

Do not rely on an unqualified Color identifier. Options, cheapest first:

  1. Namespace the import — import qs.Commons as Commons, then Commons.Color.menu.background. Verified working. Downside: touches ~66 files and breaks the public plugin API, so every third-party plugin would need updating too.
  2. Rename the singleton so it can never collide again — e.g. singleton ShellColor 1.0 Color.qml, keeping Color.qml as a thin re-export shim so existing plugins keep compiling during the transition. This is a one-line change in Commons/qmldir plus a mechanical rename in the shell.
  3. Rename the file only and let qmldir keep exporting it as Color — insufficient on its own, because the collision is on the type name, not the filename.

Option 2 looks like the best trade-off: it is additive, it fixes first-party code, and it lets the plugin ecosystem migrate at its own pace.

Workaround until fixed

Pin Qt to 6.11.2, e.g. in /etc/pacman.conf:

IgnorePkg = qt6-base qt6-declarative qt6-svg qt6-wayland qt6-shadertools qt6-5compat \
            qt6-imageformats qt6-multimedia qt6-multimedia-ffmpeg qt6-networkauth \
            qt6-positioning qt6-speech qt6-translations qt6-webchannel

Then sudo pacman -Syu and omarchy restart shell.

System details

Omarchy:            4.0.0.r6807.g902fd8a-1
Kernel:             7.2.8-5-omarchy-bore (x86_64)
Hyprland:           0.56.2
Quickshell:         0.3.1-1 (built against Qt 6.11.2)
Qt:                 qt6-base 6.12.0-2, qt6-declarative 6.12.0-1
GPU:                AMD Radeon 680M (amdgpu), Wayland

Update that triggered it (/var/log/pacman.log, 2026-10-08 16:47):

[ALPM] upgraded qt6-base (6.11.2-3 -> 6.12.0-2)
[ALPM] upgraded qt6-declarative (6.11.2-2 -> 6.12.0-1)
[ALPM] upgraded qt6-wayland (6.11.2-1 -> 6.12.0-1)
[ALPM] upgraded qt6-svg (6.11.2-1 -> 6.12.0-1)
...
View raw text
## Summary

After today's system update to **Qt 6.12**, every Quickshell surface that uses the shell's `Color` singleton renders as solid black. The most visible symptom is that **SUPER+SPACE (root menu) and SUPER+ESCAPE (system menu) both turn the whole screen black** — the `omarchy-menu` layer paints an opaque black fullscreen rectangle instead of the menu card.

**Root cause: `QtQuick.Color` is a new built-in QML type in Qt 6.12, and it now shadows Omarchy's `qs.Commons.Color` singleton.** This is *not* fixed by rebuilding quickshell (see "Why rebuilding quickshell does not help").

## Steps to reproduce

1. `sudo pacman -Syu` — brings `qt6-base 6.11.2 -> 6.12.0` and `qt6-declarative 6.11.2 -> 6.12.0`
2. Restart the shell (`omarchy restart shell`) or reboot
3. Press SUPER+SPACE, or SUPER+ESCAPE

## Expected

The Omarchy menu opens as a rounded card over a dimmed desktop.

## Actual

The entire screen turns opaque black. Pressing SUPER+ALT+SPACE, SUPER+CTRL+SPACE (background switcher) and SUPER+SHIFT+CTRL+SPACE (theme menu) — all the same `omarchy-menu` layer — are affected too. The bar loses its themed colors as well.

### Screenshot

Black screen on `omarchy menu summon root` (1920x1080, nothing but black):

<!-- attach: menu-black.png -->

## Root cause

Qt 6.12 added `Color` as a **built-in QtQuick QML singleton** (`QQuickColor`):

- https://doc.qt.io/qt-6.12/newclasses612.html — `Color` is listed under **"New QML Types"** for Qt 6.12
- https://doc.qt.io/qt-6.12/qml-qtquick-color.html — 404 on the same path for qt-6.9 / qt-6.10 / qt-6.11

Omarchy's shell declares its own singleton named `Color` in `/usr/share/omarchy/shell/Commons/qmldir`:

```
module qs.Commons
singleton Border 1.0 Border.qml
singleton Color 1.0 Color.qml     # <-- collides with the new QtQuick.Color
singleton Style 1.0 Style.qml
singleton Util 1.0 Util.qml
```

Shell QML files import both modules unqualified:

```qml
import QtQuick
import Quickshell
import qs.Commons
```

so every reference to `Color.<surface>.<role>` now binds to QtQuick's built-in `Color` singleton instead of `qs.Commons.Color`. `Color.menu` (and `Color.bar`, `Color.lock`, `Color.polkit`, …) is `undefined`, and the resulting bindings feed `undefined` into `color` properties.

### Verification (isolated repro, no Omarchy code involved)

A minimal Quickshell config importing the real `/usr/share/omarchy/shell/Commons` modules:

```
import QtQuick
import Quickshell
import qs.Commons
import qs.Commons as QC
```

```
unqualified Color         -> QQuickColor(0x7f2f57fd4a80)      <-- QtQuick built-in, WRONG
QC.Color                 -> Color_QMLTYPE_10(0x7f2f60680ee0) <-- qs.Commons singleton, correct
QC.Color.menu.background -> #101315
QC.Color.menu.text       -> #cacccc
QC.Color.menu.scrim      -> #80101315
typeof Color.menu        -> undefined
```

So the singleton itself is registered correctly — only the **unqualified name lookup** now prefers the built-in type.

### Why the screen goes black

`Ui/OverlayWindow.qml` (a fullscreen `PanelWindow`) sets `color: "transparent"`, and `plugins/menu/Menu.qml` puts a fullscreen scrim inside it:

```qml
OverlayWindow {
  id: panel
  shown: root.opened && root.rowsLoaded
  WlrLayershell.namespace: "omarchy-menu"
  ...
  Rectangle {
    anchors.fill: parent
    color: root.scrim        // root.scrim = Color.menu.scrim -> undefined
  }
```

An **invalid / `undefined` `color` renders as opaque black** in Qt Quick (verified with a standalone fullscreen `PanelWindow` + `Rectangle { anchors.fill: parent; property color bad: undefined; color: bad }`):

```
fullscreen PanelWindow, color: "transparent", no children  -> #84BEFD (wallpaper shows through)
fullscreen PanelWindow + Rectangle with undefined color     -> #000000 (opaque black)
```

`hyprctl layers` while the menu is "open":

```
Monitor HEADLESS-1:
        Layer 55e2d5f46e70: xywh: 0 0 1536 26,  a: 1, namespace: omarchy-bar,     pid: 6864
        Layer 55e2d5f31860: xywh: 0 0 1536 864, a: 1, namespace: omarchy-menu,    pid: 6864
```

### Shell log evidence

The shell log (`/run/user/1000/quickshell/by-id/<id>/log.qslog`) is full of this pattern right after startup:

```
file:///usr/share/omarchy/shell/plugins/menu/Menu.qml[91:-1]: TypeError: Cannot read property 'scrim' of undefined
file:///usr/share/omarchy/shell/plugins/menu/Menu.qml[87:-1]: TypeError: Cannot read property 'background' of undefined
file:///usr/share/omarchy/shell/Commons/Border.qml[25:-1]:  TypeError: Cannot read property 'menu.border-alpha' of undefined
@Ui/Button.qml[35:3]: Unable to assign [undefined] to QColor
file:///usr/share/omarchy/shell/plugins/clipboard/Clipboard.qml[25:-1]: TypeError: Cannot read property 'background' of undefined
file:///usr/share/omarchy/shell/plugins/emojis/Emojis.qml[26:-1]: TypeError: Cannot read property 'background' of undefined
file:///usr/share/omarchy/shell/plugins/osd/Osd.qml[143:-1]: TypeError: Cannot read property 'border' of undefined
file:///usr/share/omarchy/shell/plugins/lock/...: TypeError: ...
```

## Impact

- `Color` is used in **66 of 90** stock shell QML files, and in **14 installed third-party plugin files** under `~/.config/omarchy/plugins` — so first-party and community plugins break together.
- Affected surfaces: menu, bar, notifications, lock screen, polkit, OSD, clipboard, emoji picker, image picker, reminders, confirm dialogs.
- Community plugins that read `Color.*` are also broken and cannot be fixed from their own side.

## Why rebuilding quickshell does not help

Quickshell prints this on every start:

```
WARN: Quickshell was built against Qt 6.11.2 but the system has updated to Qt 6.12.0
without rebuilding the package. This is likely to cause crashes, so the quickshell
package must be rebuilt.
```

That warning is real but it is **not** the cause of this bug, and rebuilding quickshell will not fix it. Type-name resolution for `import qs.Commons` happens inside Qt's QML engine (`libQt6Qml`), not inside quickshell — the isolated repro above resolves the same way regardless of which quickshell build is installed. Rebuilding quickshell against 6.12 is still worth doing for its own sake, but the menu will stay black.

## Suggested fix

Do not rely on an unqualified `Color` identifier. Options, cheapest first:

1. **Namespace the import** — `import qs.Commons as Commons`, then `Commons.Color.menu.background`. Verified working. Downside: touches ~66 files and breaks the public plugin API, so every third-party plugin would need updating too.
2. **Rename the singleton** so it can never collide again — e.g. `singleton ShellColor 1.0 Color.qml`, keeping `Color.qml` as a thin re-export shim so existing plugins keep compiling during the transition. This is a one-line change in `Commons/qmldir` plus a mechanical rename in the shell.
3. **Rename the file only** and let `qmldir` keep exporting it as `Color` — insufficient on its own, because the collision is on the *type name*, not the filename.

Option 2 looks like the best trade-off: it is additive, it fixes first-party code, and it lets the plugin ecosystem migrate at its own pace.

## Workaround until fixed

Pin Qt to 6.11.2, e.g. in `/etc/pacman.conf`:

```ini
IgnorePkg = qt6-base qt6-declarative qt6-svg qt6-wayland qt6-shadertools qt6-5compat \
            qt6-imageformats qt6-multimedia qt6-multimedia-ffmpeg qt6-networkauth \
            qt6-positioning qt6-speech qt6-translations qt6-webchannel
```

Then `sudo pacman -Syu` and `omarchy restart shell`.

## System details

```
Omarchy:            4.0.0.r6807.g902fd8a-1
Kernel:             7.2.8-5-omarchy-bore (x86_64)
Hyprland:           0.56.2
Quickshell:         0.3.1-1 (built against Qt 6.11.2)
Qt:                 qt6-base 6.12.0-2, qt6-declarative 6.12.0-1
GPU:                AMD Radeon 680M (amdgpu), Wayland
```

Update that triggered it (`/var/log/pacman.log`, 2026-10-08 16:47):

```
[ALPM] upgraded qt6-base (6.11.2-3 -> 6.12.0-2)
[ALPM] upgraded qt6-declarative (6.11.2-2 -> 6.12.0-1)
[ALPM] upgraded qt6-wayland (6.11.2-1 -> 6.12.0-1)
[ALPM] upgraded qt6-svg (6.11.2-1 -> 6.12.0-1)
...
```

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.

No decision has been recorded yet.