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.
Qt 6.12's new QtQuick `Color` singleton shadows `qs.Commons.Color`, leaving the bar, menu and panels blank
Reported by danielrod36 · 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.
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
Summary
Qt 6.12.0 ships a new built-in QtQuick/Color singleton, which shadows Omarchy's qs.Commons.Color singleton. Every Color.<surface>.<role> expression in the shell now evaluates to undefined, so the bar, SUPER + SPACE menu, OSD, lock screen, polkit agent and all panels render blank or black.
This is not a quickshell or ABI problem, and not stale caches: it reproduces in plain Qt 6.12 QML with no quickshell involved.
Environment
- Omarchy
4.0.4-1(/usr/share/omarchy/shell/Commons/Color.qmlowned by theomarchypackage) - `qt6-base` `6.12.0-2`,
qt6-declarative6.12.0-1(extra), upgraded 2026-10-08 13:25 quickshell0.3.1-1- Hyprland session, Wayland
Steps to reproduce
- Have Qt 6.12 installed with an
omarchybuild that exportsqs.Commons.Color(any release through4.0.4). omarchy restart shell- Open
SUPER + SPACE, or just look at the bar.
The shell's journal fills with:
WARN scene: @plugins/bar/Bar.qml[81:-1]: TypeError: Cannot read property 'active' of undefined
WARN scene: @plugins/bar/Bar.qml[75:3]: Unable to assign [undefined] to QColor
WARN scene: @Ui/PanelToolTip.qml[21:-1]: TypeError: Cannot read property 'text' of undefined
WARN scene: @Ui/PanelToolTip.qml[22:-1]: TypeError: Cannot read property 'background' of undefined
WARN scene: file:///usr/share/omarchy/shell/plugins/lock/LockView.qml[127:-1]: TypeError: Cannot read property 'background' of undefined
WARN scene: @Commons/Border.qml[25:-1]: TypeError: Cannot read property 'polkit.border-alpha' of undefinedRoot cause
Qt 6.12 added a Color singleton to QtQuick — https://doc.qt.io/qt-6.12/qml-qtquick-color.html (Since: Qt 6.12, backed by QQuickColor in private/qquickcolor_p.h, exported as QtQuick/Color 6.12).
Every shell file does an unversioned import QtQuick, which resolves to 6.12, and that built-in wins over qs.Commons.Color. The QML engine then hands back the QtQuick singleton:
$ /usr/lib/qt6/bin/qml --version
Qml Runtime 6.12.0
// bare QtQuick import, no quickshell, custom singleton also named Color
console.log(String(Color)) // QQuickColor(0x...)
console.log(Color.foreground) // undefined
console.log(Color.marker) // undefinedMinimal reproduction with no quickshell, a module that exports singleton Color, and an unversioned import QtQuick:
import QtQuick
import MyModule // exports `singleton Color 1.0 Color.qml`
QtObject { Component.onCompleted: console.log(String(Color), Color.foreground) }
// => QQuickColor(0x...) undefinedEvidence that this is the 6.12 upgrade and not a pre-existing problem, from the user journal:
| window | count of Cannot read property 'border' of undefined |
|---|---|
| 2026-10-08 00:00 → 13:25 (before the upgrade) | 0 |
| 2026-10-08 13:25 → 15:00 | 30,604 |
Pinning the import below 6.12 restores the singleton immediately:
import QtQuick 6.11
import qs.Commons
console.log(String(Color), Color.bar.text) // Color_QMLTYPE_8(0x...) #caccccNote import QtQuick 2.15 is also unaffected; only unversioned imports resolve to 6.12.
Impact
- Bar renders blank/black;
SUPER + SPACEmenu never appears or paints an empty black rectangle. omarchy-menuIPC still answersok, so the CLI looks healthy while the UI is unusable.- Lock screen, polkit agent and every panel are affected the same way, since they all read
Color.*. - Anyone on
omarchy+ Qt 6.12 hits this on every shell start; it is not self-healing and survives restarts.
Suggested fix
Rename the singleton away from Color so QtQuick can never shadow it again — e.g. Palette in shell/Commons/qmldir plus a grep -ro '\bColor\.' sweep across shell/, themes/ and the shipped plugins. That is robust against future QtQuick additions too.
If renaming is too invasive for now, pinning the import is a one-line-per-file workaround:
sed -i -E 's/^([[:space:]]*)import QtQuick[[:space:]]*$/\1import QtQuick 6.11/' $(grep -rlE '\bColor\.' shell --include=*.qml)(54 files in 4.0.4.) Worth noting for anyone else affected: the same collision applies to any user plugin that reads Color.*, so a rename needs to consider third-party plugins as well.
Diagnostics
omarchy version → 4.0.4-1quickshell --version → Quickshell 0.3.1 (revision , distributed by Arch Linux)/usr/lib/qt6/bin/qml --version → Qml Runtime 6.12.0pacman -Q qt6-base qt6-declarative → 6.12.0-2, 6.12.0-1
Screenshots of the broken bar/menu versus the same build with the import pinned are available on request.
View raw text
## Summary
Qt 6.12.0 ships a new built-in `QtQuick/Color` singleton, which shadows Omarchy's `qs.Commons.Color` singleton. Every `Color.<surface>.<role>` expression in the shell now evaluates to `undefined`, so the bar, `SUPER + SPACE` menu, OSD, lock screen, polkit agent and all panels render blank or black.
This is not a quickshell or ABI problem, and not stale caches: it reproduces in plain Qt 6.12 QML with no quickshell involved.
## Environment
- Omarchy `4.0.4-1` (`/usr/share/omarchy/shell/Commons/Color.qml` owned by the `omarchy` package)
- **`qt6-base` `6.12.0-2`**, `qt6-declarative` `6.12.0-1` (extra), upgraded 2026-10-08 13:25
- `quickshell` `0.3.1-1`
- Hyprland session, Wayland
## Steps to reproduce
1. Have Qt 6.12 installed with an `omarchy` build that exports `qs.Commons.Color` (any release through `4.0.4`).
2. `omarchy restart shell`
3. Open `SUPER + SPACE`, or just look at the bar.
The shell's journal fills with:
```
WARN scene: @plugins/bar/Bar.qml[81:-1]: TypeError: Cannot read property 'active' of undefined
WARN scene: @plugins/bar/Bar.qml[75:3]: Unable to assign [undefined] to QColor
WARN scene: @Ui/PanelToolTip.qml[21:-1]: TypeError: Cannot read property 'text' of undefined
WARN scene: @Ui/PanelToolTip.qml[22:-1]: TypeError: Cannot read property 'background' of undefined
WARN scene: file:///usr/share/omarchy/shell/plugins/lock/LockView.qml[127:-1]: TypeError: Cannot read property 'background' of undefined
WARN scene: @Commons/Border.qml[25:-1]: TypeError: Cannot read property 'polkit.border-alpha' of undefined
```
## Root cause
Qt 6.12 added a `Color` singleton to QtQuick — https://doc.qt.io/qt-6.12/qml-qtquick-color.html (`Since: Qt 6.12`, backed by `QQuickColor` in `private/qquickcolor_p.h`, exported as `QtQuick/Color 6.12`).
Every shell file does an unversioned `import QtQuick`, which resolves to 6.12, and that built-in wins over `qs.Commons.Color`. The QML engine then hands back the QtQuick singleton:
```
$ /usr/lib/qt6/bin/qml --version
Qml Runtime 6.12.0
// bare QtQuick import, no quickshell, custom singleton also named Color
console.log(String(Color)) // QQuickColor(0x...)
console.log(Color.foreground) // undefined
console.log(Color.marker) // undefined
```
Minimal reproduction with no quickshell, a module that exports `singleton Color`, and an unversioned `import QtQuick`:
```
import QtQuick
import MyModule // exports `singleton Color 1.0 Color.qml`
QtObject { Component.onCompleted: console.log(String(Color), Color.foreground) }
// => QQuickColor(0x...) undefined
```
Evidence that this is the 6.12 upgrade and not a pre-existing problem, from the user journal:
| window | count of `Cannot read property 'border' of undefined` |
| --- | --- |
| 2026-10-08 00:00 → 13:25 (before the upgrade) | **0** |
| 2026-10-08 13:25 → 15:00 | **30,604** |
Pinning the import below 6.12 restores the singleton immediately:
```
import QtQuick 6.11
import qs.Commons
console.log(String(Color), Color.bar.text) // Color_QMLTYPE_8(0x...) #cacccc
```
Note `import QtQuick 2.15` is also unaffected; only unversioned imports resolve to 6.12.
## Impact
- Bar renders blank/black; `SUPER + SPACE` menu never appears or paints an empty black rectangle.
- `omarchy-menu` IPC still answers `ok`, so the CLI looks healthy while the UI is unusable.
- Lock screen, polkit agent and every panel are affected the same way, since they all read `Color.*`.
- Anyone on `omarchy` + Qt 6.12 hits this on every shell start; it is not self-healing and survives restarts.
## Suggested fix
Rename the singleton away from `Color` so QtQuick can never shadow it again — e.g. `Palette` in `shell/Commons/qmldir` plus a `grep -ro '\bColor\.'` sweep across `shell/`, `themes/` and the shipped plugins. That is robust against future QtQuick additions too.
If renaming is too invasive for now, pinning the import is a one-line-per-file workaround:
```
sed -i -E 's/^([[:space:]]*)import QtQuick[[:space:]]*$/\1import QtQuick 6.11/' $(grep -rlE '\bColor\.' shell --include=*.qml)
```
(54 files in 4.0.4.) Worth noting for anyone else affected: the same collision applies to any user plugin that reads `Color.*`, so a rename needs to consider third-party plugins as well.
## Diagnostics
`omarchy version` → `4.0.4-1`
`quickshell --version` → `Quickshell 0.3.1 (revision , distributed by Arch Linux)`
`/usr/lib/qt6/bin/qml --version` → `Qml Runtime 6.12.0`
`pacman -Q qt6-base qt6-declarative` → `6.12.0-2`, `6.12.0-1`
Screenshots of the broken bar/menu versus the same build with the import pinned are available on request.
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.