Custom keybindings stopped working after upgrading to Omarchy 4
Omarchy 4 Quattro stopped loading ~/.config/hypr/bindings.conf. Port your custom keybindings to bindings.lua with o.bind and hl.unbind, then reload Hyprland.
Omarchy 4 moved the Hyprland config to Lua. Your old ~/.config/hypr/bindings.conf is still on disk but nothing loads it, and there is no error. Copy each custom binding into ~/.config/hypr/bindings.lua using o.bind("SUPER + SHIFT + R", "SSH", "command") and hl.unbind("SUPER + SPACE"), then run hyprctl reload. Check the other orphaned .conf files too.
Omarchy 4.0.0 “Quattro” moved the Hyprland configuration from .conf files to Lua. The release notes describe it as converting bindings, monitors and toggles to “expressive Lua”. Your old ~/.config/hypr/bindings.conf survives the upgrade untouched, but nothing loads it any more, so every custom shortcut in it stops working. There is no error banner and hyprctl configerrors stays clean, which is what makes this hard to spot.
This was verified on 4.0.4 (2026-09-15) and reported against 4.0.0-1 in issue #6933. On 3.x, ~/.config/hypr/hyprland.conf carried a source = ~/.config/hypr/bindings.conf line. On 4.x, ~/.config/hypr/hyprland.lua calls require("hypr.bindings"), which loads ~/.config/hypr/bindings.lua and nothing else.
The fix
-
List the files that went inert:
ls ~/.config/hypr/*.confAnything printed here is dead weight on 4.x.
bindings.confis the one people notice, butinput.conf,envs.conf,looknfeel.confand window rules left inhyprland.confare equally ignored. -
Print only the lines you actually wrote:
grep -vE '^\s*(#|$)' ~/.config/hypr/bindings.conf -
Open the new override file. Either press
Super + Spaceand pick Setup > Keybindings, which opens~/.config/hypr/bindings.luain your editor, or edit it directly:$EDITOR ~/.config/hypr/bindings.lua -
Translate each line. The dispatcher goes in as a plain string for a shell command, and the description that
binddused to carry becomes the second argument:3.x bindings.conf4.x bindings.luabind = SUPER SHIFT, R, exec, my-scripto.bind("SUPER + SHIFT + R", nil, "my-script")bindd = SUPER SHIFT, R, SSH, exec, my-scripto.bind("SUPER + SHIFT + R", "SSH", "my-script")unbind = SUPER, SPACEhl.unbind("SUPER + SPACE")bind = SUPER, S, togglesplito.bind("SUPER + S", "Split", hl.dsp.layout("togglesplit"))bind = SUPER, H, movefocus, lo.bind("SUPER + H", "Focus left", hl.dsp.focus({ direction = "l" }))bind = SUPER SHIFT, H, swapwindow, lo.bind("SUPER + SHIFT + H", "Swap left", hl.dsp.window.swap({ direction = "l" }))bindr = ...fourth argument { release = true }bindl = ...fourth argument { locked = true }bindm = ...fourth argument { mouse = true }For graphical apps, prefer the table forms Omarchy’s own defaults use, because they wrap the command in
uwsm-appfor you:{ launch = "obsidian", focus = "^obsidian$" },{ webapp = "https://example.com" },{ tui = "cliamp", focus = true }. -
To change a default, unbind it first, then bind your own. Binding on top of an existing combination does not replace it:
hl.unbind("SUPER + SPACE") o.bind("SUPER + SPACE", "Omarchy menu", "omarchy-menu toggle root") -
Reload:
hyprctl reloadThat is exactly what
omarchy-restart-hyprctlruns. -
Once the new bindings work, move the old files out of the way so you do not read them again by mistake:
mkdir -p ~/omarchy-3x-conf-backup mv ~/.config/hypr/*.conf ~/omarchy-3x-conf-backup/
Verify it worked
Press the shortcut. If it does nothing, check the live bind table:
hyprctl binds | grep -B2 -A4 'your description'
A bind registered from Lua shows up with the dispatcher __lua, which is normal on 4.x. What matters is that the entry exists and that key holds the key you expect.
omarchy-menu-keybindings --print lists everything with descriptions, which is the quickest way to see whether your entry landed. Do not copy its output back into Lua verbatim. The printed combo joins the modifiers with spaces and puts a single + before the key (SUPER SHIFT + S), but the Lua helpers want a + after every token (SUPER + SHIFT + S). temper303 reported in #7627 that an hl.unbind written in the printed form does nothing and the default stays bound, with no error to tell you why. That issue is still open on 4.0.4.
Finally, run hyprctl configerrors. A syntax error anywhere in bindings.lua stops the whole file from compiling, so one typo can take out every binding in it, not just the broken line.
Why it happens
Quattro replaced the whole Hyprland config layer. The upgrade path installs fresh stock copies of hypr/hyprland.lua, hypr/bindings.lua, hypr/input.lua, hypr/looknfeel.lua, hypr/monitors.lua and hypr/autostart.lua, backing up any file already at those paths with a .omarchy-upgrade-to-quattro.<timestamp>.bak suffix. The old .conf files are not in that list, so they are neither converted nor removed. They just stop being sourced.
The upgrade script does detect a live legacy config: it builds a temporary .conf shim so the running 3.x session survives the package swap until you reboot. What it does not do is tell you that your own .conf customizations will be inert on the other side. In #6933, the reporter found a working binddr dictation binding still sitting in bindings.conf while hyprctl binds -j showed no matching entry at all. Commenters on the same thread reported the same pattern for envs.conf NVIDIA variables, input.conf keyboard options and looknfeel.conf settings, so treat this as a whole-directory problem rather than a bindings problem.
If that did not work
The binding is registered but fires the wrong thing, or a plain SUPER chord walks you through workspaces. Avoid code:N in your own bindings. Issue #12050, opened 2026-09-16 against a stock 4.0.4 config, reports that the Lua bind API does not resolve a spec like "SUPER + code:10". Hyprland keeps the literal text as the key name with a zero keycode, and the result is that all binds on that modifier set fire together. Use key names such as "SUPER + 1" while that is open.
A punctuation key does nothing. Use the xkbcommon keysym name in lower case. Omarchy’s own defaults bind "SUPER + comma" with a source comment noting that the upper-case COMMA does not match.
Your bindings load but everything Omarchy ships is gone. Check whether omarchy_default_bindings = false or omarchy_preinstalled_bindings = false is set in ~/.config/hypr/hyprland.lua. The second is also implied by a ~/.local/state/omarchy/preinstalls-removed marker file.
hyprctl configerrors reports attempt to index a nil value (global 'o'). That is a different problem: your hyprland.lua is not loading Omarchy’s helper module. See /fix/hyprland-lua-attempt-to-index-nil-global-o/.
Your monitor layout also reverted. Same cause, different file. See /fix/monitors-conf-replaced-by-monitors-lua/.
Related
- /upgrade/3-to-4-quattro/ for what else the Quattro upgrade changes under your home directory
- /reference/hyprland-conf-to-lua-migration/ for the full
.confto Lua mapping - /reference/keybindings/ for the 4.0.4 default shortcut list
- /reference/commands/omarchy-menu-keybindings/
- The official manual chapters Dotfiles and Hotkeys
Upstream threads about this error
59 issues on the Omarchy tracker match this error cluster. Newest fixes often appear as comments on the most-discussed threads.
| Issue | State | Comments | Opened |
|---|---|---|---|
| #2184 Chrome crashes when moving tile between monitors on Hyprland · fixed by #2394 | closed | 33 | 2025-10-03 |
| #2314 Moving browser between monitors kill all apps · fixed by #2394 | closed | 31 | 2025-10-08 |
| #619 Add way to lock a config so Omarchy won't ever auto-update it | closed | 10 | 2025-08-10 |
| #1881 Flatpak Support In omarchy menu | closed | 18 | 2025-09-22 |
| #4511 Nautilus drag and copy doesn't work | closed | 24 | 2026-02-05 |
| #478 Walker appears and disappears | closed | 20 | 2025-08-03 |
| #1115 Use $mainMod instead of SUPER for keybinds | closed | 6 | 2025-08-26 |
| #1410 OMARCHY WAYBAR WORKSPACE SELECTORS MISBEHAVE | closed | 19 | 2025-09-02 |
| #2610 SUPER+ALT+SPACE broken after upgrading to 3.1.0 | closed | 15 | 2025-10-20 |
| #1560 Add Notification Center to waybar | closed | 8 | 2025-09-10 |
Accepted answers upstream
- VI(M) keybindings for moving between hyprland windows · answered by maxhungry
- Guide: Adapting Omarchy's Screenshot & Media Keys for MacBooks (or Keyboards without a Print Screen key) · answered by JoenvandeVorle
- Preventing Accidental Window Kills with `SUPER+W` · answered by strasse86
- Best way to change default apps, including browser? · answered by khalido
Questions people ask
- Did the update delete my old keybindings?
- No. ~/.config/hypr/bindings.conf is still there with every line intact. Omarchy 4 simply never reads it, because the Hyprland entry point is now ~/.config/hypr/hyprland.lua and it only requires the .lua override files. That is why the shortcuts fail with no error and no missing file.
- Will a future update port the file for me?
- Nothing has shipped for it. Issue #6933 was opened on 2026-08-15 and was still open on 2026-09-16, through 4.0.1, 4.0.2, 4.0.3 and 4.0.4. Treat the manual port as the fix for now.
- Can I just keep my 3.x defaults instead of Omarchy's?
- Yes. Put omarchy_default_bindings = false in ~/.config/hypr/hyprland.lua above require("default.hypr.omarchy") and define everything yourself in bindings.lua. Setting omarchy_preinstalled_bindings = false instead keeps the window-manager bindings and drops only the preinstalled app and web app shortcuts.
- Is it safe to edit bindings.lua, or will an update overwrite it?
- It is safe. The Omarchy migration that refreshes bindings.lua compares the file against known stock checksums first and only replaces it when it is still untouched. An edited file is left alone.
Sources and credit
Fixes on this page were worked out by evo-social-world (Reported the silent orphaning of bindings.conf on two machines and published the working o.bind translation), temper303 (Found that the printed keybinding format does not match the syntax hl.unbind and o.bind expect), ryanmoreau-ctrl (Showed that MODS + code:N bind specs are not parsed by the Lua bind API). Text here is our own paraphrase; follow the links for the original threads.
- issueIssue #6933: Quattro update preserves bindings.conf but silently stops loading custom keybindings · evo-social-world · 2026-08-15
- issueIssue #7627: keybindings --print uses a different format than hl.unbind / o.bind · temper303 · 2026-08-20
- issueIssue #12050: [hyprland] Lua binds written as "MODS + code:N" don't parse · ryanmoreau-ctrl · 2026-09-16
- releaseOmarchy v4.0.0 release notes: convert the Hyprland configuration to Lua · dhh · 2026-08-14
- manualOmarchy manual: Dotfiles
- manualOmarchy manual: Hotkeys