Skip to content

Workspaces + Super+# + Super+Tab not working on ported machine: implementation guide, failure modes, verification #9

Description

@nethum529

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:

  1. 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.

  2. 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.

  3. 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

  1. 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.
  2. 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.
  3. 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'.
  4. 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.
  5. Testing with hyprctl reload instead of relog. exec-once lines
    (ambxst, hyprpm reload) do NOT re-run on reload. Relog after changes.
  6. Hand-editing generated files. Anything under ~/.local/share/ambxst/ is
    axctl output and gets rewritten; put changes in binds.json instead.
  7. Different username. Seed files carry /home/nethum paths; the installer
    sed-rewrites them, but only on the seeding run (see mode 2).
  8. 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions