Ground truth below is verified live on the source laptop (Hyprland 0.56.1, 2026-08-09). Read all of it before touching config — most failures come from misunderstanding where binds actually come from.
How keybinds/workspaces REALLY work here
There are THREE layers; none of them is hand-written binds in hyprland.conf:
-
Ambxst-generated binds (Super+#, workspaces, ~120 binds).
Source of truth: ~/.config/ambxst/binds.json (stowed by this repo).
The axctl daemon renders it into ~/.local/share/ambxst/hyprland.conf
(verified: 49 workspace lines incl. bind = SUPER, 1, workspace, 1), which
the main ~/.config/hypr/hyprland.conf sources at line ~102. That file also
contains exec-once = ambxst, which starts the whole shell.
No Ambxst ⇒ that file missing ⇒ almost no binds ⇒ 'workspaces broken'.
parity/install-parity.sh seeds it (parity/ambxst/seed/) so binds work on
the FIRST launch, before Ambxst regenerates it.
-
Super+Tab = hyprexpo plugin, not a bind.
bind = $mod, Tab, hyprexpo:expo, toggle + a keyboard-nav submap in
hyprland.conf. The hyprexpo:* dispatchers only exist when the plugin is
loaded: hyprpm add https://github.com/sandwichfarm/hyprexpo (pinned
upstream hash 7572889), hyprpm enable hyprexpo, and hyprland.conf already
has exec-once = hyprpm reload -n.
-
Layout. The generated file sets general:layout = scrolling (native in
Hyprland 0.56; verified hyprctl getoption general:layout → scrolling).
Do not 'fix' it to dwindle — window behavior will feel wrong, though this
is NOT what breaks workspace switching.
Correct implementation order
cd ~/linux-setup && git pull
./install.sh # stow (binds.json, hyprland.conf), packages, GPU
./parity/install-parity.sh # Ambxst clone+patch+widgets, seed, hyprexpo, axctl
# then RELOG (not just hyprctl reload — exec-once only runs at session start)
Failure modes, most likely first
- Parity layer never ran / ran before install.sh. The seed + Ambxst source
are prerequisites for every bind. Symptom: ls ~/.local/share/ambxst/hyprland.conf → missing.
- Seed skipped because the dir already existed. The installer only seeds
when hyprland.conf is absent there. A half-broken previous attempt leaves
a stale/empty dir. Fix: remove ~/.local/share/ambxst and re-run parity, or start Ambxst once (ambxst) so axctl regenerates.
- Ambxst launches but dies instantly (missing quickshell, QML errors from a
partial overlay copy). Check: pgrep -af 'qs -p' — the shell process is
qs, NOT 'quickshell'; pgrep quickshell returning nothing is EXPECTED
even when healthy. axctl daemon: pgrep -af 'axctl.*daemon'.
- hyprexpo build failed. hyprpm compiles against headers; mismatched
hyprland version or missing base-devel/cmake breaks it, and
hyprpm reload -n (-n = no notify) hides the failure. Check
hyprpm list → 'enabled: true', and hyprctl dispatch hyprexpo:expo toggle by hand.
- Testing with hyprctl reload instead of relog.
exec-once lines
(ambxst, hyprpm reload) do NOT re-run on reload. Relog after changes.
- Hand-editing generated files. Anything under
~/.local/share/ambxst/ is
axctl output and gets rewritten; put changes in binds.json instead.
- Different username. Seed files carry
/home/nethum paths; the installer
sed-rewrites them, but only on the seeding run (see mode 2).
- Duplicate/conflicting binds added while debugging:
hyprctl binds | grep -c 'SUPER, 1' should be 1.
Verify correctness (expected values from the working laptop)
hyprctl configerrors # empty
test -f ~/.local/share/ambxst/hyprland.conf && grep -c workspace ~/.local/share/ambxst/hyprland.conf # ≈49
hyprctl binds | grep -c workspace # ≈58 (dozens, not <10)
hyprctl binds | grep 'SUPER, 1' | head -2 # → workspace, 1
pgrep -af 'qs -p' # qs -p ~/.local/src/ambxst/shell.qml
pgrep -af 'axctl.*daemon' # axctl -c ~/.local/share/ambxst/axctl.toml daemon
hyprpm list # hyprexpo enabled: true
hyprctl dispatch hyprexpo:expo toggle # overview opens/closes
hyprctl getoption general:layout # str: scrolling
Functional test: Super+2 switches workspace, bar numbers follow; Super+Tab opens the grid overview, arrows navigate, releasing Super confirms; Super+Comma opens the wallpaper picker (proves Ambxst IPC works end to end).
Note for whoever fixes docs: AGENTS.md's verify block says pgrep -a quickshell — wrong process name, should be pgrep -af 'qs -p'. Same fix applies here.
Ground truth below is verified live on the source laptop (Hyprland 0.56.1, 2026-08-09). Read all of it before touching config — most failures come from misunderstanding where binds actually come from.
How keybinds/workspaces REALLY work here
There are THREE layers; none of them is hand-written binds in hyprland.conf:
Ambxst-generated binds (Super+#, workspaces, ~120 binds).
Source of truth:
~/.config/ambxst/binds.json(stowed by this repo).The axctl daemon renders it into
~/.local/share/ambxst/hyprland.conf(verified: 49 workspace lines incl.
bind = SUPER, 1, workspace, 1), whichthe main
~/.config/hypr/hyprland.confsources at line ~102. That file alsocontains
exec-once = ambxst, which starts the whole shell.No Ambxst ⇒ that file missing ⇒ almost no binds ⇒ 'workspaces broken'.
parity/install-parity.shseeds it (parity/ambxst/seed/) so binds work onthe FIRST launch, before Ambxst regenerates it.
Super+Tab = hyprexpo plugin, not a bind.
bind = $mod, Tab, hyprexpo:expo, toggle+ a keyboard-nav submap inhyprland.conf. The
hyprexpo:*dispatchers only exist when the plugin isloaded:
hyprpm add https://github.com/sandwichfarm/hyprexpo(pinnedupstream hash 7572889),
hyprpm enable hyprexpo, and hyprland.conf alreadyhas
exec-once = hyprpm reload -n.Layout. The generated file sets
general:layout = scrolling(native inHyprland 0.56; verified
hyprctl getoption general:layout→ scrolling).Do not 'fix' it to dwindle — window behavior will feel wrong, though this
is NOT what breaks workspace switching.
Correct implementation order
Failure modes, most likely first
are prerequisites for every bind. Symptom:
ls ~/.local/share/ambxst/hyprland.conf→ missing.when
hyprland.confis absent there. A half-broken previous attempt leavesa stale/empty dir. Fix: remove
~/.local/share/ambxstand re-run parity, or start Ambxst once (ambxst) so axctl regenerates.partial overlay copy). Check:
pgrep -af 'qs -p'— the shell process isqs, NOT 'quickshell';pgrep quickshellreturning nothing is EXPECTEDeven when healthy. axctl daemon:
pgrep -af 'axctl.*daemon'.hyprland version or missing base-devel/cmake breaks it, and
hyprpm reload -n(-n = no notify) hides the failure. Checkhyprpm list→ 'enabled: true', andhyprctl dispatch hyprexpo:expo toggleby hand.exec-oncelines(ambxst, hyprpm reload) do NOT re-run on reload. Relog after changes.
~/.local/share/ambxst/isaxctl output and gets rewritten; put changes in
binds.jsoninstead./home/nethumpaths; the installersed-rewrites them, but only on the seeding run (see mode 2).
hyprctl binds | grep -c 'SUPER, 1'should be 1.Verify correctness (expected values from the working laptop)
Functional test: Super+2 switches workspace, bar numbers follow; Super+Tab opens the grid overview, arrows navigate, releasing Super confirms; Super+Comma opens the wallpaper picker (proves Ambxst IPC works end to end).
Note for whoever fixes docs: AGENTS.md's verify block says
pgrep -a quickshell— wrong process name, should bepgrep -af 'qs -p'. Same fix applies here.