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

Hardware macro loses Shift when modifier and key use different HID endpoints with Fcitx5

Reported by anthonyrussano · filed Aug 17, 2026Closed upstream on 2026-10-08 by the bot omarchybot, as a duplicate (target not recorded).

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

Hardware macro loses Shift when modifier and key use different HID endpoints with Fcitx5revision 1 · captured 2026-09-28 21:29 UTC via poll

System details

  • Omarchy: 4.0.0-1
  • Hyprland: 0.56.2
  • Kernel: 7.1.8-arch1-3
  • Fcitx5: 5.1.21-1
  • Active Fcitx input method: keyboard-us
  • CPU: AMD Ryzen AI 9 HX 370
  • GPU: AMD Radeon 880M / 890M
  • Keyboard: EPOMAKER TH80 SE, USB ID 3151:4015

What's wrong?

The EPOMAKER has hardware macros stored in keyboard firmware. With Omarchy's stock omarchy-fcitx5.service running, uppercase letters and shifted symbols emitted by a macro lose Shift. For example, an intended uppercase letter becomes lowercase, and an intended shifted number-row symbol becomes the base number. Lowercase text is unaffected.

The original macro contents are credential-like and are intentionally redacted.

Expected behavior

The macro should preserve its Shift modifiers and produce the same text it produces when Fcitx5 is temporarily stopped.

Raw input evidence

The keyboard firmware emits the Shift key and character key on different evdev keyboard endpoints while preserving correct ordering:

event4  LEFTSHIFT DOWN
event7  D DOWN
event4  LEFTSHIFT UP
event7  D UP

event4  LEFTSHIFT DOWN
event7  3 DOWN
event7  3 UP
event4  LEFTSHIFT UP

Both endpoints report the same identity:

ID_VENDOR_ID=3151
ID_MODEL_ID=4015
ID_SERIAL=ROYUAN_EPOMAKER_TH80_SE
ID_INPUT_KEYBOARD=1

Hyprland exposes the physical endpoints separately as royuan-epomaker-th80-se and royuan-epomaker-th80-se-keyboard.

Steps to reproduce

  1. Use an EPOMAKER TH80 SE hardware macro containing an uppercase letter or shifted number-row symbol.
  2. Confirm the stock input-method service is running:
   systemctl --user is-active omarchy-fcitx5.service
  1. Run the macro in a harmless Wayland text field. The uppercase/symbol characters arrive as their unshifted base keys.
  2. Schedule an automatic restart, then stop Fcitx5 temporarily:
   systemd-run --user --quiet --unit=restart-fcitx-test --on-active=40s \
     /usr/bin/systemctl --user start omarchy-fcitx5.service
   systemctl --user stop omarchy-fcitx5.service
  1. Run the same macro during that window. It now preserves uppercase letters and shifted symbols.
  2. Allow the timer to restore Fcitx5.

This A/B test was repeated and the service was confirmed active afterward.

Verified workaround

Installing keyd and matching the EPOMAKER interfaces in one configuration fixes all of the keyboard's hardware macros while leaving Fcitx5 active:

[ids]

k:3151:4015

[main]

keyd combines the endpoints into keyd-virtual-keyboard, so modifier state is preserved before events reach Hyprland/Fcitx5. The original macro passed an end-to-end test with both keyd.service and omarchy-fcitx5.service active.

Notes on likely ownership

The evidence shows that the failure requires the stock Fcitx5 input-method path, but it does not conclusively identify Fcitx5 as the ultimate owner. Hyprland normally merges physical keyboard modifier state, while input-method virtual keyboards have special state-sharing behavior. This may need routing upstream to Hyprland or Fcitx5 after the Omarchy integration is reviewed.

No matching Omarchy issue was found for searches involving Fcitx5, hardware macros, split HID endpoints, EPOMAKER, and modifier state.

Diagnostics available

I collected a local omarchy-debug --print --no-sudo log but did not upload it because it contains unrelated private network journal entries. I can provide a reviewed/redacted diagnostic excerpt, hyprctl devices -j, fcitx5-diagnose, or a non-sensitive demonstration capture if needed.

View raw text
### System details

- Omarchy: 4.0.0-1
- Hyprland: 0.56.2
- Kernel: 7.1.8-arch1-3
- Fcitx5: 5.1.21-1
- Active Fcitx input method: `keyboard-us`
- CPU: AMD Ryzen AI 9 HX 370
- GPU: AMD Radeon 880M / 890M
- Keyboard: EPOMAKER TH80 SE, USB ID `3151:4015`

### What's wrong?

The EPOMAKER has hardware macros stored in keyboard firmware. With Omarchy's stock `omarchy-fcitx5.service` running, uppercase letters and shifted symbols emitted by a macro lose Shift. For example, an intended uppercase letter becomes lowercase, and an intended shifted number-row symbol becomes the base number. Lowercase text is unaffected.

The original macro contents are credential-like and are intentionally redacted.

### Expected behavior

The macro should preserve its Shift modifiers and produce the same text it produces when Fcitx5 is temporarily stopped.

### Raw input evidence

The keyboard firmware emits the Shift key and character key on different evdev keyboard endpoints while preserving correct ordering:

```text
event4  LEFTSHIFT DOWN
event7  D DOWN
event4  LEFTSHIFT UP
event7  D UP

event4  LEFTSHIFT DOWN
event7  3 DOWN
event7  3 UP
event4  LEFTSHIFT UP
```

Both endpoints report the same identity:

```text
ID_VENDOR_ID=3151
ID_MODEL_ID=4015
ID_SERIAL=ROYUAN_EPOMAKER_TH80_SE
ID_INPUT_KEYBOARD=1
```

Hyprland exposes the physical endpoints separately as `royuan-epomaker-th80-se` and `royuan-epomaker-th80-se-keyboard`.

### Steps to reproduce

1. Use an EPOMAKER TH80 SE hardware macro containing an uppercase letter or shifted number-row symbol.
2. Confirm the stock input-method service is running:

   ```bash
   systemctl --user is-active omarchy-fcitx5.service
   ```

3. Run the macro in a harmless Wayland text field. The uppercase/symbol characters arrive as their unshifted base keys.
4. Schedule an automatic restart, then stop Fcitx5 temporarily:

   ```bash
   systemd-run --user --quiet --unit=restart-fcitx-test --on-active=40s \
     /usr/bin/systemctl --user start omarchy-fcitx5.service
   systemctl --user stop omarchy-fcitx5.service
   ```

5. Run the same macro during that window. It now preserves uppercase letters and shifted symbols.
6. Allow the timer to restore Fcitx5.

This A/B test was repeated and the service was confirmed active afterward.

### Verified workaround

Installing keyd and matching the EPOMAKER interfaces in one configuration fixes all of the keyboard's hardware macros while leaving Fcitx5 active:

```ini
[ids]

k:3151:4015

[main]
```

keyd combines the endpoints into `keyd-virtual-keyboard`, so modifier state is preserved before events reach Hyprland/Fcitx5. The original macro passed an end-to-end test with both `keyd.service` and `omarchy-fcitx5.service` active.

### Notes on likely ownership

The evidence shows that the failure requires the stock Fcitx5 input-method path, but it does not conclusively identify Fcitx5 as the ultimate owner. Hyprland normally merges physical keyboard modifier state, while input-method virtual keyboards have special state-sharing behavior. This may need routing upstream to Hyprland or Fcitx5 after the Omarchy integration is reviewed.

No matching Omarchy issue was found for searches involving Fcitx5, hardware macros, split HID endpoints, EPOMAKER, and modifier state.

### Diagnostics available

I collected a local `omarchy-debug --print --no-sudo` log but did not upload it because it contains unrelated private network journal entries. I can provide a reviewed/redacted diagnostic excerpt, `hyprctl devices -j`, `fcitx5-diagnose`, or a non-sensitive demonstration capture if needed.

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.