My personal Hyprland configuration for a dual-monitor desktop setup
(programming, gaming, general use). Written in Lua against the Hyprland 0.55+
Lua config API, managed by uwsm.
~/.config/hypr/
├── hyprland.lua # entry point, requires every module
├── appearance.lua # general, decorations, animations, misc
├── autostart.lua # uwsm finalize, autostart programs and commands
├── display.lua # monitor outputs, modes, positions, VRR
├── environment.lua # placeholder (env vars now live in ~/.config/uwsm/env)
├── inputs.lua # keyboard, touchpad, mouse
├── keybinds.lua # every keybinding, with hl.bind options + descriptions
├── meta/
│ └── hl.lua # Used for LSP info about hl.*
├── plugins.lua # plugin config (split_monitor_workspaces)
├── rules.lua # window rules (steam, terminal, utilities)
├── utils.lua # tiny notification helper
├── hypridle.conf # idle daemon (lock, dim, dpms, suspend)
├── hyprlock.conf # lock screen UI
├── mocha.conf # Catppuccin Mocha color palette
├── scripts/
│ ├── gen-docs.lua # build markdown tables from the config
│ ├── update-readme.sh # apply gen-docs.lua output to this file
│ └── sleep.sh # standalone swayidle wrapper (legacy)
└── wallpapers/
The tables in this README under Keybindings, Monitors, and Window Rules
are regenerated from the Lua config by scripts/update-readme.sh and a pre-commit
hook. Edit the Lua, not the tables.
| Mods |
Key |
Description |
SUPER |
Delete |
Lock screen |
SUPER + SHIFT |
Q |
Open logout menu |
| Mods |
Key |
Description |
SUPER |
Return |
Launch terminal (wezterm) |
SUPER |
E |
Launch file manager (thunar) |
SUPER |
R |
Open application launcher (rofi drun) |
SUPER |
S |
Open window switcher (rofi) |
SUPER |
V |
Open clipboard history (cliphist + rofi) |
SUPER |
period |
Open emoji picker (rofi) |
| Mods |
Key |
Description |
SUPER + SHIFT |
S |
Screenshot region to clipboard (grim + slurp + wl-copy) |
| none |
Print |
Screenshot full screen to clipboard (grim + wl-copy) |
SUPER + CONTROL |
Print |
Screenshot full screen to file (grim) |
SUPER + SHIFT |
Print |
Screenshot region to file (grim + slurp) |
| Mods |
Key |
Description |
SUPER |
Q |
Close focused window |
SUPER + SHIFT |
V |
Toggle floating mode for focused window |
SUPER |
F |
Toggle fullscreen for focused window |
SUPER |
C |
Center the focused floating window |
SUPER |
Tab |
Cycle to next window |
SUPER |
B |
Toggle waybar visibility |
| Mods |
Key |
Description |
SUPER |
grave |
Toggle terminal scratchpad (pypr) |
SUPER + SHIFT |
E |
Toggle file manager scratchpad (pypr) |
SUPER + SHIFT |
A |
Toggle volume mixer scratchpad (pypr) |
| Mods |
Key |
Description |
SUPER |
Z |
Toggle screen zoom (pypr) |
SUPER |
O |
Toggle expose / window overview (pypr) |
| Mods |
Key |
Description |
SUPER |
H |
Focus window to the left |
SUPER |
J |
Focus window below |
SUPER |
K |
Focus window above |
SUPER |
L |
Focus window to the right |
| Mods |
Key |
Description |
SUPER + SHIFT |
H |
Move focused window left |
SUPER + SHIFT |
J |
Move focused window down |
SUPER + SHIFT |
K |
Move focused window up |
SUPER + SHIFT |
L |
Move focused window right |
| Mods |
Key |
Description |
SUPER + CONTROL |
H |
Shrink focused window horizontally |
SUPER + CONTROL |
L |
Grow focused window horizontally |
SUPER + CONTROL |
K |
Shrink focused window vertically |
SUPER + CONTROL |
J |
Grow focused window vertically |
| Mods |
Key |
Description |
SUPER |
mouse:272 |
Move window by dragging (Super + LMB) |
SUPER |
mouse:273 |
Resize window by dragging (Super + RMB) |
| Mods |
Key |
Description |
| none |
XF86AudioRaiseVolume |
Volume up |
| none |
XF86AudioLowerVolume |
Volume down |
| none |
XF86AudioMute |
Toggle mute (output) |
| none |
XF86AudioMicMute |
Toggle mute (microphone) |
| none |
XF86AudioPlay |
Play / pause |
| none |
XF86AudioPause |
Play / pause |
| none |
XF86AudioNext |
Next track |
| none |
XF86AudioPrev |
Previous track |
| Mods |
Key |
Description |
| none |
XF86MonBrightnessUp |
Brightness up (laptop backlight; see TODO for DDC) |
| none |
XF86MonBrightnessDown |
Brightness down (laptop backlight; see TODO for DDC) |
| Mods |
Key |
Description |
SUPER |
1 |
Switch to workspace 1 |
SUPER + SHIFT |
1 |
Move focused window to workspace 1 |
SUPER |
2 |
Switch to workspace 2 |
SUPER + SHIFT |
2 |
Move focused window to workspace 2 |
SUPER |
3 |
Switch to workspace 3 |
SUPER + SHIFT |
3 |
Move focused window to workspace 3 |
SUPER |
4 |
Switch to workspace 4 |
SUPER + SHIFT |
4 |
Move focused window to workspace 4 |
SUPER |
5 |
Switch to workspace 5 |
SUPER + SHIFT |
5 |
Move focused window to workspace 5 |
| Output |
Mode |
Position |
Scale |
VRR |
DP-1 |
3840x2160@144 |
0x0 |
1 |
fullscreen |
DP-2 |
3840x2160@144 |
3840x0 |
1 |
fullscreen |
| Name |
Match |
Applies |
steam-popups |
class=steam, title=^$ |
min_size=1 1, stay_focused=true |
steam-games |
class=steam_app_.*, fullscreen=true, no_blur=true |
`` |
terminal-opacity |
class=org.wezfurlong.wezterm |
opacity=0.95 |
file-dialogs |
title=Open.*|Save.*|Select.* |
float=true |
utilities |
class=file-roller|ark|pavucontrol |
float=true |
Configured in hypridle.conf:
| Timeout |
Action |
| 5:00 |
Dim external monitors via ddcutil |
| 9:40 |
Notification: "Locking in 20s" |
| 10:00 |
Lock session (loginctl lock-session) |
| 10:30 |
Turn off displays (DPMS off) |
| 30:00 |
Suspend (systemctl suspend) |
Python plugin system providing advanced scratchpads, magnifier, and expose view.
Per-monitor workspaces, AwesomeWM-style.
hyprpm add https://github.com/Duckonaut/split-monitor-workspaces
hyprpm enable split-monitor-workspaces
hyprpm reload
Steam games launched fullscreen are handled by a window rule (see the
Window Rules table above) that disables blur. VRR is enabled per-monitor
in display.lua (fullscreen-only mode), and general:allow_tearing = true
is set globally so any window that opts in via immediate = true will tear
instead of stalling on VSync. See
Hyprland tearing docs
for the trade-offs.
This repo has a pre-commit setup that runs file-hygiene
checks, formats Lua with StyLua,
lints with luacheck, formats and
lints shell scripts (shfmt, shellcheck), scans for secrets with
gitleaks, catches typos with
typos, and keeps the autodoc tables in
this README in sync with the Lua config.
# one-time setup (per clone)
pre-commit install
# run all hooks against every tracked file
pre-commit run --all-files
# bump hook pins to latest
pre-commit autoupdate
# regenerate the README autodoc tables manually
scripts/update-readme.sh
Tool configs live at the repo root:
.pre-commit-config.yaml,
.stylua.toml,
.luacheckrc,
.typos.toml,
.editorconfig.
GPL-3.0 license