Hyprland — Wayland Compositor
Hyprland compositor patterns — config debugging with hyprctl configerrors, bind conflict detection, deprecated options for 0.53+, IPC queries, and the tmux socket fix.
Config Debugging
The Two Error Systems
Hyprland has two separate error sources — mixing them up wastes hours.
| System | Command | What it shows |
|---|---|---|
Config parser |
|
Syntax errors with file + line number. This is what you want 95% of the time. |
Runtime log |
|
GPU page-flips, DRM commits, renderer issues. Noisy. Not for config errors. |
Core Commands
hyprctl configerrors
# Output (when errors exist):
# /home/evan/.config/hypr/hyprland.conf:136 - invalid value "true" for variable "new_optimizations"
hyprctl reload
hyprctl reload && hyprctl configerrors
hyprctl getoption decoration:dim_inactive
hyprctl getoption cursor:no_hardware_cursors
Inspecting Binds
# Flag BEFORE subcommand — hyprctl -j binds, NOT hyprctl binds -j
hyprctl -j binds | jq -r '.[] | "\(.modmask) \(.key) → \(.dispatcher) \(.arg)"'
hyprctl -j binds | jq -r '.[] | "\(.modmask) \(.key) → \(.dispatcher) \(.arg)"' | sort | uniq -d -w 20
# Duplicate binds = later one silently shadows earlier one
# No error, no warning — the first bind just stops working
Runtime Log (GPU/DRM)
/run/user/$(id -u)/hypr/$(ls /run/user/$(id -u)/hypr/)/hyprland.log
grep -n -iE 'err|fail|invalid' /run/user/$(id -u)/hypr/$(ls /run/user/$(id -u)/hypr/)/hyprland.log | \
grep -vi 'gesture\|libinput\|GL_\|EGL\|drm'
Hyprland IPC
hyprctl -j version | jq -r '.tag' # current version
hyprctl -j clients # list all windows
hyprctl -j monitors # list all displays
hyprctl systeminfo # full system/config dump
Config Patterns and Gotchas
Bind Conflicts — Silent Shadowing
Later binds override earlier ones with no warning. The first bind silently stops working.
| Original bind | Was shadowing | Remapped to |
|---|---|---|
SUPER+J → DJ toggle |
movefocus, d (vim nav down) |
SUPER+SHIFT+A |
SUPER+SHIFT+S → shader cycle |
scratchpad toggle |
SUPER+SHIFT+/ |
SUPER+SHIFT+G → animated wallpaper |
moveintogroup |
SUPER+ALT+SHIFT+G |
hyprctl -j binds | jq -r '.[] | "\(.modmask) \(.key) → \(.dispatcher) \(.arg)"' | sort | uniq -d -w 20
Deprecated Options (Hyprland 0.53+)
| Removed | Replacement |
|---|---|
|
Always on — remove the line entirely |
|
Moved to |
|
|
|
Removed — workspace swipe is native, configure in |
tmux + Hyprland Socket Fix
tmux inherits environment at server start — HYPRLAND_INSTANCE_SIGNATURE is missing in new sessions.
export HYPRLAND_INSTANCE_SIGNATURE=$(ls /run/user/$(id -u)/hypr/ | head -1)
set-option -g update-environment "HYPRLAND_INSTANCE_SIGNATURE WAYLAND_DISPLAY DISPLAY"
Optimization Patterns
# WRONG — shows raw value like 19200%
brightnessctl get
# CORRECT — machine-readable output, extract percentage
brightnessctl -m | awk -F, '{print $4}'
# Output: 75%
# BEFORE — 5-pipe sed chain
uptime | sed 's/.*up //' | sed 's/, .*//' | sed 's/ days/d/' | sed 's/ hours/h/' | sed 's/ min/m/'
# AFTER — single awk with gsub
uptime | awk '{gsub(/.*up |, .*/, ""); gsub(/ days?/, "d"); gsub(/ hours?/, "h"); gsub(/ min/, "m"); print}'
# WRONG — flag after subcommand
hyprctl devices -j
# CORRECT — flag before subcommand
hyprctl -j devices
See Also
-
Safe Workflows — validate-before-act pattern applies to config changes
-
systemd — service management for compositor-adjacent services