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.
Keyboard layout reverts to en after waking from sleep instead of the default layout (e.g. fr)
Reported by ziouf · filed Aug 24, 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?
- 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. So far: matches no known issue — decided by agents · verified. The outcome (valid, duplicate, not a bug, …) is not decided yet. See the decision.
Original report
Summary
On a non-US install (here fr, from /etc/vconsole.conf: XKBLAYOUT=fr), two
different text fields silently fall back to an en_US keymap, while the
Hyprland session itself is correct (hyprctl -j devices reports every keyboard
as French/fr):
- The lock screen password field after waking from sleep.
- The SDDM login field shown after explicit logout.
Both look like "the keymap resets to en_US" but they have **independent root
causes**, detailed below.
Environment
- Omarchy 4.0.0-1, Hyprland 0.56.2, SDDM (Wayland), fcitx5
/etc/vconsole.conf→KEYMAP=fr,XKBLAYOUT=fr- Session layout seeded by Omarchy from vconsole works correctly at runtime
Bug A — Lock screen types en_US after wake from sleep
Root cause
Omarchy ships a session-wide fcitx5 integration:/usr/lib/environment.d/10-omarchy-fcitx.conf exportsQT_IM_MODULE=fcitx / XMODIFIERS=@im=fcitx / SDL_IM_MODULE=fcitx, fcitx5 is
autostarted, and /usr/lib/systemd/user/omarchy-fcitx5.service keeps it alive
with the graphical session.
fcitx5 registers a virtual keyboard with the compositor
(hl-virtual-keyboard-fcitx5, reported as main: true by hyprctl devices),
so any focused text field receives its effective keymap from the active fcitx5
engine.
The lock screen password field is a Qt TextInput (Quickshell), therefore its
keystrokes are routed through fcitx5. With a user profile whose only configured
input method is keyboard-us:
# ~/.config/fcitx5/profile (before fix)
[Groups/0]
Default Layout=us
DefaultIM=keyboard-us
[Groups/0/Items/0]
Name=keyboard-us…typing at the lock prompt happens on an en_US keymap. Wake from sleep merely
makes it visible: the password field is the first text input focused after
resume (journal timeline: 16:26:51 PM: suspend entry → 16:33:34 exit →16:33:37 unlock prompt + PAM session).
Workaround
Point the fcitx5 default group at the console layout
(~/.config/fcitx5/profile):
Default Layout=fr
DefaultIM=keyboard-fr
[Groups/0/Items/0]
Name=keyboard-fr
Layout=then restart fcitx5. Verified: hyprctl -j devices now reports the fcitx5
virtual keyboard as French/fr.
Suggested upstream fix
Seed or validate the fcitx5 default input method against /etc/vconsole.conf
— the same source Omarchy already uses to set Hyprland's kb_layout — during
install/first setup, so a non-US system never ends up withDefaultIM=keyboard-us.
Bug B — Login greeter types en_US after logout
Root cause
The Wayland greeter runs its own Hyprland instance:
# /etc/sddm.conf.d/10-wayland.conf
[Wayland]
CompositorCommand=start-hyprland -- --config /usr/share/sddm/hyprland.lua/usr/share/sddm/hyprland.lua (package omarchy-settings) is minimal — misc +
animations only, no `input.kb_layout` — so the greeter compositor falls back
to Hyprland's built-in us. The sddm daemon environment carries noQT_IM_MODULE (systemctl show sddm.service -p Environment → empty), so the
greeter does direct input with the compositor keymap.
This is masked at boot by autologin (/etc/sddm.conf.d/autologin.conf): SDDM
skips the greeter entirely, so after a restart the user never sees it and every
field they meet is inside the correctly-configured session. It only surfaces on
explicit logout, where the greeter is actually displayed (logind session
class greeter) and the login field types QWERTY-US.
Workaround
Drop-in pointing SDDM at an enriched copy of the greeter config (survives
package updates):
sudo cp /usr/share/sddm/hyprland.lua /etc/sddm/greeter-hyprland.lua
sudo tee -a /etc/sddm/greeter-hyprland.lua > /dev/null <<'EOF'
-- Keymap from the system console config (same source as the main session).
local layout = "us"
local f = io.open("/etc/vconsole.conf", "r")
if f then
for line in f:lines() do
local k, v = line:match("^%s*([%w_]+)%s*=%s*(.-)%s*$")
if k == "XKBLAYOUT" then layout = v:gsub("%s+#.*$", "") end
end
f:close()
end
hl.config({ input = { kb_layout = layout } })
EOF
sudo tee /etc/sddm.conf.d/50-keymap.conf > /dev/null <<'EOF'
[Wayland]
CompositorCommand=start-hyprland -- --config /etc/sddm/greeter-hyprland.lua
EOFSuggested upstream fix
Seed input.kb_layout in /usr/share/sddm/hyprland.lua from/etc/vconsole.conf, exactly like default/hypr/input.lua already does for
the user session, instead of relying on the compositor's built-in default.
These investigations were largely conducted with the help of an AI agent.
View raw text
## Summary
On a non-US install (here `fr`, from `/etc/vconsole.conf`: `XKBLAYOUT=fr`), two
different text fields silently fall back to an **en_US keymap**, while the
Hyprland session itself is correct (`hyprctl -j devices` reports every keyboard
as `French/fr`):
1. The **lock screen password field** after waking from sleep.
2. The **SDDM login field** shown after explicit logout.
Both look like "the keymap resets to en_US" but they have **independent root
causes**, detailed below.
## Environment
- Omarchy 4.0.0-1, Hyprland 0.56.2, SDDM (Wayland), fcitx5
- `/etc/vconsole.conf` → `KEYMAP=fr`, `XKBLAYOUT=fr`
- Session layout seeded by Omarchy from vconsole works correctly at runtime
## Bug A — Lock screen types en_US after wake from sleep
### Root cause
Omarchy ships a session-wide fcitx5 integration:
`/usr/lib/environment.d/10-omarchy-fcitx.conf` exports
`QT_IM_MODULE=fcitx` / `XMODIFIERS=@im=fcitx` / `SDL_IM_MODULE=fcitx`, fcitx5 is
autostarted, and `/usr/lib/systemd/user/omarchy-fcitx5.service` keeps it alive
with the graphical session.
fcitx5 registers a virtual keyboard with the compositor
(`hl-virtual-keyboard-fcitx5`, reported as `main: true` by `hyprctl devices`),
so any focused text field receives its effective keymap from the active fcitx5
engine.
The lock screen password field is a Qt `TextInput` (Quickshell), therefore its
keystrokes are routed through fcitx5. With a user profile whose only configured
input method is `keyboard-us`:
```ini
# ~/.config/fcitx5/profile (before fix)
[Groups/0]
Default Layout=us
DefaultIM=keyboard-us
[Groups/0/Items/0]
Name=keyboard-us
```
…typing at the lock prompt happens on an en_US keymap. Wake from sleep merely
makes it visible: the password field is the first text input focused after
resume (journal timeline: `16:26:51 PM: suspend entry` → `16:33:34 exit` →
`16:33:37 unlock prompt + PAM session`).
### Workaround
Point the fcitx5 default group at the console layout
(`~/.config/fcitx5/profile`):
```ini
Default Layout=fr
DefaultIM=keyboard-fr
[Groups/0/Items/0]
Name=keyboard-fr
Layout=
```
then restart fcitx5. Verified: `hyprctl -j devices` now reports the fcitx5
virtual keyboard as `French/fr`.
### Suggested upstream fix
Seed or validate the fcitx5 default input method against `/etc/vconsole.conf`
— the same source Omarchy already uses to set Hyprland's `kb_layout` — during
install/first setup, so a non-US system never ends up with
`DefaultIM=keyboard-us`.
## Bug B — Login greeter types en_US after logout
### Root cause
The Wayland greeter runs its own Hyprland instance:
```ini
# /etc/sddm.conf.d/10-wayland.conf
[Wayland]
CompositorCommand=start-hyprland -- --config /usr/share/sddm/hyprland.lua
```
`/usr/share/sddm/hyprland.lua` (package `omarchy-settings`) is minimal — misc +
animations only, **no `input.kb_layout`** — so the greeter compositor falls back
to Hyprland's built-in `us`. The sddm daemon environment carries no
`QT_IM_MODULE` (`systemctl show sddm.service -p Environment` → empty), so the
greeter does direct input with the compositor keymap.
This is masked at boot by autologin (`/etc/sddm.conf.d/autologin.conf`): SDDM
skips the greeter entirely, so after a restart the user never sees it and every
field they meet is inside the correctly-configured session. It only surfaces on
explicit **logout**, where the greeter is actually displayed (logind session
class `greeter`) and the login field types QWERTY-US.
### Workaround
Drop-in pointing SDDM at an enriched copy of the greeter config (survives
package updates):
```bash
sudo cp /usr/share/sddm/hyprland.lua /etc/sddm/greeter-hyprland.lua
sudo tee -a /etc/sddm/greeter-hyprland.lua > /dev/null <<'EOF'
-- Keymap from the system console config (same source as the main session).
local layout = "us"
local f = io.open("/etc/vconsole.conf", "r")
if f then
for line in f:lines() do
local k, v = line:match("^%s*([%w_]+)%s*=%s*(.-)%s*$")
if k == "XKBLAYOUT" then layout = v:gsub("%s+#.*$", "") end
end
f:close()
end
hl.config({ input = { kb_layout = layout } })
EOF
sudo tee /etc/sddm.conf.d/50-keymap.conf > /dev/null <<'EOF'
[Wayland]
CompositorCommand=start-hyprland -- --config /etc/sddm/greeter-hyprland.lua
EOF
```
### Suggested upstream fix
Seed `input.kb_layout` in `/usr/share/sddm/hyprland.lua` from
`/etc/vconsole.conf`, exactly like `default/hypr/input.lua` already does for
the user session, instead of relying on the compositor's built-in default.
---
These investigations were largely conducted with the help of an AI agent. 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.
- Decided by agents · verified: matches no known issue
The outcome (valid, duplicate, not a bug, …) is not decided yet.