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.
Migration 1787865477 drops the input group, silently breaking Voxtype's evdev hotkey
Reported by kurenn · filed Sep 15, 2026 · open at source
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
What happened
Upgrading to 4.0.2+ silently breaks Voxtype for anyone using Voxtype's own evdev hotkey ([hotkey] enabled = true in ~/.config/voxtype/config.toml).
migrations/1787865477.sh removes the user from the input group. Voxtype 1.0's hotkey listener reads /dev/input/event* directly, so it loses access. The daemon keeps running and looks completely healthy — it loads its model, reports Listening for hotkey: RIGHTCTRL, and the bar indicator behaves normally. The only sign of failure is a single line in the journal:
INFO Model loaded, ready for voice input
INFO Listening for hotkey: RIGHTCTRL (press to start/stop recording)
ERROR Hotkey listener error: No keyboard device found in /dev/input/Pressing the hotkey does nothing. Nothing is shown to the user.
voxtype setup check names the cause directly:
Input:
⚠ User is not in 'input' group
evdev hotkeys: unavailable
Required only for evdev hotkey mode, not compositor keybindings
To enable: sudo usermod -aG input $USER && logoutRoot cause
migrations/1787865477.sh (added in #9200) preserves input membership for exactly two opt-in features:
if id -nG "$USER" | grep -qw input; then
if pacman -Qq xpadneo-dkms &>/dev/null || pacman -Qq ydotool &>/dev/null; then
echo "Keeping $USER in the input group: controller or ydotool support is installed."
else
sudo gpasswd -d "$USER" input >/dev/nullVoxtype's evdev hotkey is a third such feature, and it isn't checked.
I want to be upfront that Omarchy's shipped Voxtype configuration does not regress. default/voxtype/config.toml sets [hotkey] enabled = false and default/hypr/bindings/voxtype.lua binds dictation through the compositor:
o.bind("SUPER + CTRL + X", "Toggle dictation", "voxtype record toggle")
o.bind("F9", "Start dictation (push-to-talk)", "voxtype record start")Those paths need no input membership and still work. This only affects users who opted into Voxtype's built-in hotkey.
That opt-in is not an exotic configuration, though. It is the only way to use a bare modifier as the trigger, because a bare modifier cannot be bound in Hyprland — something Omarchy already documents in #7302 ("Note that voxtype push-to-talk can't be rebound to a bare modifier key"). Users who chose right Ctrl or a similar key have no compositor-side fallback to fall back to.
Steps to reproduce
- Install on Omarchy 4.0.0 or earlier, where every user was placed in
inputby default. - Install Voxtype and set it to use its own hotkey, e.g.:
[hotkey]
enabled = true
key = "RIGHTCTRL"
mode = "toggle" Confirm the hotkey works.
3. Run omarchy update to 4.0.2 or later, so migrations/1787865477.sh runs.
4. Log out and back in.
5. The hotkey no longer does anything. journalctl --user -u voxtype shows No keyboard device found in /dev/input/.
On my machine the migration marker is present at ~/.local/state/omarchy/migrations/1787865477.sh, timestamped in the same update run that took voxtype-bin from 0.7.5 to 1.0.1.
Suggested fix
Extend the preserve condition to cover users who have opted into Voxtype's evdev hotkey, mirroring the existing package checks — for example, keeping membership when ~/.config/voxtype/config.toml has [hotkey] enabled = true. That keeps the security intent of #9200 intact: users on Omarchy's default compositor-binding setup still get the grant dropped, and only those who deliberately chose evdev keep it.
test/shell.d/input-group-migration-test.sh already has a run_migration "<groups>" "<packages>" harness that a case for this drops straight into.
Worth noting separately: fixing this migration only protects future upgrades. Anyone already affected has had the group removed, so restoring it for opted-in users would need a new migration.
System details
| Omarchy | 4.0.3-1 (stable) |
| Kernel | 7.2.3-arch1-3 |
| CPU | AMD Ryzen 7 5825U with Radeon Graphics |
| GPU | AMD/ATI Barcelo (rev c1) |
| Hyprland | v0.56.2 |
| voxtype-bin | 1.0.1-1 |
/dev/input/event* are root:input mode 660, so group membership is what gates access:
/dev/input/event0 root:input 660View raw text
## What happened
Upgrading to 4.0.2+ silently breaks Voxtype for anyone using Voxtype's own evdev hotkey (`[hotkey] enabled = true` in `~/.config/voxtype/config.toml`).
`migrations/1787865477.sh` removes the user from the `input` group. Voxtype 1.0's hotkey listener reads `/dev/input/event*` directly, so it loses access. The daemon keeps running and looks completely healthy — it loads its model, reports `Listening for hotkey: RIGHTCTRL`, and the bar indicator behaves normally. The only sign of failure is a single line in the journal:
```
INFO Model loaded, ready for voice input
INFO Listening for hotkey: RIGHTCTRL (press to start/stop recording)
ERROR Hotkey listener error: No keyboard device found in /dev/input/
```
Pressing the hotkey does nothing. Nothing is shown to the user.
`voxtype setup check` names the cause directly:
```
Input:
⚠ User is not in 'input' group
evdev hotkeys: unavailable
Required only for evdev hotkey mode, not compositor keybindings
To enable: sudo usermod -aG input $USER && logout
```
## Root cause
`migrations/1787865477.sh` (added in #9200) preserves `input` membership for exactly two opt-in features:
```bash
if id -nG "$USER" | grep -qw input; then
if pacman -Qq xpadneo-dkms &>/dev/null || pacman -Qq ydotool &>/dev/null; then
echo "Keeping $USER in the input group: controller or ydotool support is installed."
else
sudo gpasswd -d "$USER" input >/dev/null
```
Voxtype's evdev hotkey is a third such feature, and it isn't checked.
I want to be upfront that **Omarchy's shipped Voxtype configuration does not regress.** `default/voxtype/config.toml` sets `[hotkey] enabled = false` and `default/hypr/bindings/voxtype.lua` binds dictation through the compositor:
```lua
o.bind("SUPER + CTRL + X", "Toggle dictation", "voxtype record toggle")
o.bind("F9", "Start dictation (push-to-talk)", "voxtype record start")
```
Those paths need no `input` membership and still work. This only affects users who opted into Voxtype's built-in hotkey.
That opt-in is not an exotic configuration, though. It is the only way to use a bare modifier as the trigger, because a bare modifier cannot be bound in Hyprland — something Omarchy already documents in #7302 ("Note that voxtype push-to-talk can't be rebound to a bare modifier key"). Users who chose right Ctrl or a similar key have no compositor-side fallback to fall back to.
## Steps to reproduce
1. Install on Omarchy 4.0.0 or earlier, where every user was placed in `input` by default.
2. Install Voxtype and set it to use its own hotkey, e.g.:
```toml
[hotkey]
enabled = true
key = "RIGHTCTRL"
mode = "toggle"
```
Confirm the hotkey works.
3. Run `omarchy update` to 4.0.2 or later, so `migrations/1787865477.sh` runs.
4. Log out and back in.
5. The hotkey no longer does anything. `journalctl --user -u voxtype` shows `No keyboard device found in /dev/input/`.
On my machine the migration marker is present at `~/.local/state/omarchy/migrations/1787865477.sh`, timestamped in the same update run that took `voxtype-bin` from 0.7.5 to 1.0.1.
## Suggested fix
Extend the preserve condition to cover users who have opted into Voxtype's evdev hotkey, mirroring the existing package checks — for example, keeping membership when `~/.config/voxtype/config.toml` has `[hotkey] enabled = true`. That keeps the security intent of #9200 intact: users on Omarchy's default compositor-binding setup still get the grant dropped, and only those who deliberately chose evdev keep it.
`test/shell.d/input-group-migration-test.sh` already has a `run_migration "<groups>" "<packages>"` harness that a case for this drops straight into.
Worth noting separately: fixing this migration only protects future upgrades. Anyone already affected has had the group removed, so restoring it for opted-in users would need a new migration.
## System details
| | |
|---|---|
| Omarchy | 4.0.3-1 (stable) |
| Kernel | 7.2.3-arch1-3 |
| CPU | AMD Ryzen 7 5825U with Radeon Graphics |
| GPU | AMD/ATI Barcelo (rev c1) |
| Hyprland | v0.56.2 |
| voxtype-bin | 1.0.1-1 |
`/dev/input/event*` are `root:input` mode `660`, so group membership is what gates access:
```
/dev/input/event0 root:input 660
```
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 13:52 UTC