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.
Editable TextFields (weather, clock, network, tailscale) trigger unbounded native clipboard reads on every system clipboard change
Reported by iampoul · filed Oct 11, 2026 · open at source
R-1312 is the earliest report of this defect — filed Aug 28, 2026, open upstream. This report (filed Oct 11, 2026) describes the same defect, so it is folded under it in the inbox.
Decided by agents · verified· Oct 11, 2026
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?
- 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
Affected component
shell/Ui/TextField.qml (shared wrapper around QtQuick.Controls.TextField) and every first-party panel that embeds a non-readOnly instance of it. Found while reviewing a marketplace plugin update at omacom/omarchy-plugin-marketplace#10868; on inspection it is not specific to that plugin.
Omarchy version: 4.0.4-1 (installed). Checked against the quattro branch source on GitHub, which has the identical code.
What happens
Every editable TextField connects, unconditionally and for its whole lifetime, to the process-global QClipboard::dataChanged() signal (QQuickTextInput::init(), qquicktextinput.cpp:2894 at Qt 6.11.2, the version installed here). The handler, q_canPasteChanged(), calls mimeData->text() on every firing of that signal — i.e. whenever any application in the session writes to the clipboard, regardless of which field has focus or whether the user ever pastes (qquicktextinput.cpp:3001-3011, same version). This is skipped only when the field is readOnly.
mimeData->text() on Wayland reads through QWaylandMimeData::readData() (qwaylanddataoffer.cpp), which loops poll() + read() with only a 1-second timeout between chunks and no total byte cap and no overall deadline. A clipboard source that keeps producing data (or stalls just under the per-chunk timeout) can hold that read open indefinitely inside the shared Quickshell process, since all panels run in one process.
Because readOnly is the only gate in Qt, and it also disables keyboard editing entirely, there is no way to keep a field both typeable and exempt from this from inside the field itself.
Where it's instantiated
All of these are plain, non-readOnly TextFields, created once their panel loads and only toggled via visible: (not gated behind a Loader { active: ... }), so each is connected to the global clipboard signal for the panel's full lifetime:
shell/plugins/panels/weather/Panel.qml:615— location searchshell/plugins/panels/clock/Panel.qml:384and:407— birth year / life expectancyshell/plugins/panels/network/Panel.qml:2020and:2044— WiFi identity + passphraseshell/plugins/panels/tailscale/Panel.qml:602— Mullvad region search
The WiFi passphrase field is the most sensitive instance, since it's where users type a secret into a field that's reading the system clipboard on every unrelated clipboard write elsewhere in the session.
Impact
Any application in the same session with ordinary clipboard write access — no elevated privilege, nothing beyond what any GUI app already has — can keep this native read open against the shared shell process whenever it broadcasts clipboard changes. This is a shared-process reliability/memory concern (the shell can stall or grow memory while one of these fields exists), not a privilege-boundary crossing, so per .github/SECURITY.md this is filed as a regular issue rather than a private report.
Suggested directions (not prescriptive)
- Gate each field behind
Loader { active: <actively editing> }, matching the pattern already used in the plugin that surfaced this (omacom/omarchy-plugin-marketplace#10868,Panel.qml+LocationPicker.qml), so the clipboard connection only exists while the field is genuinely in use rather than for the panel's whole lifetime. This narrows the window but doesn't eliminate it while editing. - If a full fix needs to happen upstream in Qt/Qt Wayland (bounding
QWaylandMimeData::readData(), or makingcanPastecomputation lazy instead of eager on every clipboard change), it may be worth tracking there and treating this issue as the Omarchy-side mitigation tracker.
Happy to share the exact source citations/commit SHAs I checked them against if useful.
View raw text
## Affected component
`shell/Ui/TextField.qml` (shared wrapper around `QtQuick.Controls.TextField`) and every first-party panel that embeds a non-`readOnly` instance of it. Found while reviewing a marketplace plugin update at omacom/omarchy-plugin-marketplace#10868; on inspection it is not specific to that plugin.
Omarchy version: `4.0.4-1` (installed). Checked against the `quattro` branch source on GitHub, which has the identical code.
## What happens
Every editable `TextField` connects, unconditionally and for its whole lifetime, to the **process-global** `QClipboard::dataChanged()` signal (`QQuickTextInput::init()`, `qquicktextinput.cpp:2894` at Qt 6.11.2, the version installed here). The handler, `q_canPasteChanged()`, calls `mimeData->text()` on every firing of that signal — i.e. whenever *any* application in the session writes to the clipboard, regardless of which field has focus or whether the user ever pastes (`qquicktextinput.cpp:3001-3011`, same version). This is skipped only when the field is `readOnly`.
`mimeData->text()` on Wayland reads through `QWaylandMimeData::readData()` (`qwaylanddataoffer.cpp`), which loops `poll()` + `read()` with only a **1-second timeout between chunks** and **no total byte cap and no overall deadline**. A clipboard source that keeps producing data (or stalls just under the per-chunk timeout) can hold that read open indefinitely inside the shared Quickshell process, since all panels run in one process.
Because `readOnly` is the only gate in Qt, and it also disables keyboard editing entirely, there is no way to keep a field both typeable and exempt from this from inside the field itself.
## Where it's instantiated
All of these are plain, non-`readOnly` `TextField`s, created once their panel loads and only toggled via `visible:` (not gated behind a `Loader { active: ... }`), so each is connected to the global clipboard signal for the panel's full lifetime:
- `shell/plugins/panels/weather/Panel.qml:615` — location search
- `shell/plugins/panels/clock/Panel.qml:384` and `:407` — birth year / life expectancy
- `shell/plugins/panels/network/Panel.qml:2020` and `:2044` — WiFi identity + **passphrase**
- `shell/plugins/panels/tailscale/Panel.qml:602` — Mullvad region search
The WiFi passphrase field is the most sensitive instance, since it's where users type a secret into a field that's reading the system clipboard on every unrelated clipboard write elsewhere in the session.
## Impact
Any application in the same session with ordinary clipboard write access — no elevated privilege, nothing beyond what any GUI app already has — can keep this native read open against the shared shell process whenever it broadcasts clipboard changes. This is a shared-process reliability/memory concern (the shell can stall or grow memory while one of these fields exists), not a privilege-boundary crossing, so per `.github/SECURITY.md` this is filed as a regular issue rather than a private report.
## Suggested directions (not prescriptive)
- Gate each field behind `Loader { active: <actively editing> }`, matching the pattern already used in the plugin that surfaced this (omacom/omarchy-plugin-marketplace#10868, `Panel.qml` + `LocationPicker.qml`), so the clipboard connection only exists while the field is genuinely in use rather than for the panel's whole lifetime. This narrows the window but doesn't eliminate it while editing.
- If a full fix needs to happen upstream in Qt/Qt Wayland (bounding `QWaylandMimeData::readData()`, or making `canPaste` computation lazy instead of eager on every clipboard change), it may be worth tracking there and treating this issue as the Omarchy-side mitigation tracker.
Happy to share the exact source citations/commit SHAs I checked them against if useful.
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
- Duplicate ofR-1312Quickshell freezes for 1–2 seconds when a focused panel reads from a stalled Wayland clipboard owner· decided by agents · verified
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.