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

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

Received. Triage checks are recorded; not validated 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. 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

Keyboard layout reverts to en after waking from sleep instead of the default layout (e.g. fr)revision 1 · captured 2026-09-28 21:24 UTC via poll

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:

# ~/.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 with
DefaultIM=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 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):

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.

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.