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

Third-party service plugins report enabled: false despite being correctly configured and actually running

Reported by kibendar · filed Sep 13, 2026 · open at source

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

Third-party service plugins report enabled: false despite being correctly configured and actually runningrevision 1 · captured 2026-09-28 21:23 UTC via poll

What happened

Third-party shell plugins declaring "kinds": ["service", ...] (tested with
njpatel.omapager and nosignal.omasend) are reported as "enabled": false
by omarchy plugin list --json, even though:

  • They are correctly listed in ~/.config/omarchy/shell.json's plugins[]

array, in the exact same {"id": "..."} shape as another third-party
plugin (bobbynicholas.omaland) that correctly reports "enabled": true.
- Running omarchy plugin enable <id> reports success (Enabled <id>) and
exits 0, but leaves shell.json byte-for-byte unchanged and does not
change the reported enabled status.
- omarchy-shell shell rescanPlugins, run after the above, doesn't change
the status either.
- Despite all of this, the plugins are demonstrably running and fully
functional: hyprctl layers shows live layer-shell surfaces for both
(namespace: omapager, namespace: omarchy-omasend), their IPC targets
respond correctly (omarchy-shell omapager count -> 0), and omapager
has been actively handling real desktop notifications throughout testing.

So the enabled field in omarchy plugin list / `omarchy-shell shell
listPlugins` does not reflect whether the plugin is actually loaded and
running for at least these two plugins, and the enable subcommand is a
no-op for them.

What I expected

Either:
- enabled: true once a plugin is present in plugins[] and not in
disabledPlugins[] (matching the behavior seen for bobbynicholas.omaland
and matching what the plugin is actually doing at runtime), or
- If enabled: false is intentional for some other reason, `omarchy plugin
enable <id>` should either fix it or explain why it can't.

Steps to reproduce

git clone https://github.com/njpatel/omapager.git ~/.config/omarchy/plugins/njpatel.omapager
# add {"id": "njpatel.omapager"} to shell.json's "plugins" array
omarchy restart shell
omarchy plugin list --json | jq '.[] | select(.id=="njpatel.omapager")'
# -> "enabled": false

omarchy plugin enable njpatel.omapager
# -> "Enabled njpatel.omapager", exit 0
omarchy plugin list --json | jq '.[] | select(.id=="njpatel.omapager")'
# -> still "enabled": false, shell.json unchanged

# yet:
hyprctl layers | grep omapager
# -> a real, live layer-shell surface
omarchy-shell omapager count
# -> 0 (a valid, live IPC response)

Same result with nosignal.omasend (id: nosignal.omasend), installed via
the plugins.omarchy.org listing rather than a direct git clone — its plugin
directory has no .git remote and its manifest lists no source URL, so I
can't point to its repo here, but the id/author match the marketplace entry.

What I looked at

I traced this partway into PluginRegistry.qml's isEnabled():

function isEnabled(id) {
    var key = String(id)
    var manifest = installedPlugins[key]
    var config = shellConfigProvider ? shellConfigProvider() : null
    if (manifest) {
      if (Array.isArray(manifest.kinds) && manifest.kinds.indexOf("bar") !== -1) {
        ...
      }
      if (isDisabled(config, key)) return false
      if (manifest.__isFirstParty) return true
    }
    return findEntryLocation(config, key).found
}

For both affected plugins: they're not a "bar"-kind plugin, they're not in
disabledPlugins, they're not first-party, and findEntryLocation (which
checks config.plugins[] for a matching, canonicalized id) should find
them given the shell.json contents above — the same code path that
correctly returns true for bobbynicholas.omaland. I wasn't able to find
what specifically diverges for these two from reading the QML alone; I
didn't have a way to attach a debugger to the running Quickshell engine to
go further.

System

$ omarchy version
4.0.3-1
$ uname -a
Linux omarchy 7.2.3-arch1-3 #1 SMP PREEMPT_DYNAMIC Sun, 06 Sep 2026 13:01:04 +0000 x86_64 GNU/Linux
Hyprland 0.56.2 (Wayland)
CPU: AMD Ryzen 5 5500U
Machine: IdeaPad 3 15ALC6 (82KU)
Theme: Tokyo Night

Note: omarchy debug no longer exists

Unrelated to the above, but noticed while preparing this report: the
skill/doc-referenced diagnostic command

omarchy debug --no-sudo --print

returns Unknown Omarchy command on 4.0.3-1, and omarchy commands --all
has no debug entry at all. If it was renamed or removed, the contributing
docs (and possibly in-app help) referencing it are stale.

View raw text
## What happened

Third-party shell plugins declaring `"kinds": ["service", ...]` (tested with
`njpatel.omapager` and `nosignal.omasend`) are reported as `"enabled": false`
by `omarchy plugin list --json`, even though:

- They are correctly listed in `~/.config/omarchy/shell.json`'s `plugins[]`
  array, in the exact same `{"id": "..."}` shape as another third-party
  plugin (`bobbynicholas.omaland`) that correctly reports `"enabled": true`.
- Running `omarchy plugin enable <id>` reports success (`Enabled <id>`) and
  exits 0, but leaves `shell.json` byte-for-byte unchanged and does not
  change the reported `enabled` status.
- `omarchy-shell shell rescanPlugins`, run after the above, doesn't change
  the status either.
- Despite all of this, the plugins are demonstrably running and fully
  functional: `hyprctl layers` shows live layer-shell surfaces for both
  (`namespace: omapager`, `namespace: omarchy-omasend`), their IPC targets
  respond correctly (`omarchy-shell omapager count` -> `0`), and omapager
  has been actively handling real desktop notifications throughout testing.

So the `enabled` field in `omarchy plugin list` / `omarchy-shell shell
listPlugins` does not reflect whether the plugin is actually loaded and
running for at least these two plugins, and the `enable` subcommand is a
no-op for them.

## What I expected

Either:
- `enabled: true` once a plugin is present in `plugins[]` and not in
  `disabledPlugins[]` (matching the behavior seen for `bobbynicholas.omaland`
  and matching what the plugin is actually doing at runtime), or
- If `enabled: false` is intentional for some other reason, `omarchy plugin
  enable <id>` should either fix it or explain why it can't.

## Steps to reproduce

```bash
git clone https://github.com/njpatel/omapager.git ~/.config/omarchy/plugins/njpatel.omapager
# add {"id": "njpatel.omapager"} to shell.json's "plugins" array
omarchy restart shell
omarchy plugin list --json | jq '.[] | select(.id=="njpatel.omapager")'
# -> "enabled": false

omarchy plugin enable njpatel.omapager
# -> "Enabled njpatel.omapager", exit 0
omarchy plugin list --json | jq '.[] | select(.id=="njpatel.omapager")'
# -> still "enabled": false, shell.json unchanged

# yet:
hyprctl layers | grep omapager
# -> a real, live layer-shell surface
omarchy-shell omapager count
# -> 0 (a valid, live IPC response)
```

Same result with `nosignal.omasend` (id: `nosignal.omasend`), installed via
the plugins.omarchy.org listing rather than a direct git clone — its plugin
directory has no `.git` remote and its manifest lists no source URL, so I
can't point to its repo here, but the id/author match the marketplace entry.

## What I looked at

I traced this partway into `PluginRegistry.qml`'s `isEnabled()`:

```js
function isEnabled(id) {
    var key = String(id)
    var manifest = installedPlugins[key]
    var config = shellConfigProvider ? shellConfigProvider() : null
    if (manifest) {
      if (Array.isArray(manifest.kinds) && manifest.kinds.indexOf("bar") !== -1) {
        ...
      }
      if (isDisabled(config, key)) return false
      if (manifest.__isFirstParty) return true
    }
    return findEntryLocation(config, key).found
}
```

For both affected plugins: they're not a `"bar"`-kind plugin, they're not in
`disabledPlugins`, they're not first-party, and `findEntryLocation` (which
checks `config.plugins[]` for a matching, canonicalized `id`) should find
them given the `shell.json` contents above — the same code path that
correctly returns `true` for `bobbynicholas.omaland`. I wasn't able to find
what specifically diverges for these two from reading the QML alone; I
didn't have a way to attach a debugger to the running Quickshell engine to
go further.

## System

```
$ omarchy version
4.0.3-1
$ uname -a
Linux omarchy 7.2.3-arch1-3 #1 SMP PREEMPT_DYNAMIC Sun, 06 Sep 2026 13:01:04 +0000 x86_64 GNU/Linux
Hyprland 0.56.2 (Wayland)
CPU: AMD Ryzen 5 5500U
Machine: IdeaPad 3 15ALC6 (82KU)
Theme: Tokyo Night
```

## Note: `omarchy debug` no longer exists

Unrelated to the above, but noticed while preparing this report: the
skill/doc-referenced diagnostic command

```
omarchy debug --no-sudo --print
```

returns `Unknown Omarchy command` on 4.0.3-1, and `omarchy commands --all`
has no `debug` entry at all. If it was renamed or removed, the contributing
docs (and possibly in-app help) referencing it are stale.

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 12:45 UTC