Skip to content

Compass — Audio App, Desktop Keybinds & the Duplication Trap

Date: 2026-07-06 Session: audio-desktop-keybinds Status: ✅ TESTED (audio + binds) · 🔴 PLANNED (duplication cleanup)


0. TL;DR — the meta-lesson

Most of this session's confusion had one root cause: duplicated files across locations, where edits land in a copy nothing loads. Before editing ANY config/script on this box, confirm which copy is authoritative (which one the running process actually reads). See §5 — this is the part that kept making work get "done over again."


1. Audio — the Gaming Headset

Hardware/stack (verified): - USB "Gaming Headset" = ALSA card 2, ID 0c76:1652 JMTek, LLC. - Stack: PipeWire + pipewire-pulse + wireplumber (control via pactl/wpctl). - Sinks: onboard alsa_output.pci-0000_00_1b.0.analog-stereo, headset alsa_output.usb-0c76_Gaming_Headset-00.analog-stereo. - Mic (default source): alsa_input.usb-0c76_Gaming_Headset-00.mono-fallback.

Original "not working" cause: headset was fine; audio was just routed to the onboard speakers. Fix = set headset as default sink + move streams + unmute.

Persistent one-liner (menu or CLI): pactl set-default-sink alsa_output.usb-0c76_Gaming_Headset-00.analog-stereo

⚠️ Use 127.0.0.1 not localhost for proxy tests etc.; unrelated but same "looks dead" trap.


2. ~/scripts/nexus-audio.sh — the combined audio app (NEW, TESTED)

One script = the whole audio front door. Plain CLI + a TUI (single-keypress ANSI, not ncurses). Bare nexus-audio.sh launches the TUI.

Commands: status · fix (revive stack + auto-pick best sink USB>BT>analog) · list · out [pick|next|<name|idx>] · in [pick|next|…] · vol <up|down|N> · mute · rec [-m mix|tracks] [-f opus|mp3|flac|wav] [-g gain] [-t secs] [-o file].

rec records system audio (default sink .monitor) + mic together — mixed (ffmpeg amix) or two-track .mkv. Recordings → ~/recordings/.

Folded in (originals KEPT in place, per no-delete): nexus-audio-fix.sh → fix; volume_control.sh → vol/mute; new mic+system recording → rec. Also created ~/scripts/nexus-rec.sh (standalone recorder, superseded by nexus-audio.sh rec).

NOTE nexus-recorder.sh is a terminal/asciinema recorder, NOT audio — misleading name.


3. Desktop keybindings (added this session)

Added to all four compositor configs (backed up first, *.bak-<ts>):

Combo Action Command
Ctrl+Alt+S NeXuS Audio app foot --app-id=nexus-audio ~/scripts/nexus-audio.sh
Super+/ Desktop keys cheatsheet foot --app-id=nexus-cheatsheet ~/scripts/nexus-cheatsheet.sh
  • Ctrl+Alt+S chosen because Super+S was taken (sway=stacking, hypr=nibrasshell) and Super+A taken (sway=focus-parent). Ctrl+Alt+S was free on all four.
  • Super+/ was already the cheatsheet key on hypr (nibrasshell); added to wayfire/sway/labwc.

Config files & syntax (all four differ): - ~/.config/wayfire.ini — [command] binding_X = <ctrl> <alt> KEY_S + command_X = … - ~/.config/sway/config — bindsym Ctrl+Alt+s exec … (⚠️ pre-existing broken line 24: wallpaper points at a directory, so sway --validate FAILS — unrelated to our edits) - ~/.config/labwc/rc.xml — <keybind key="C-A-s"><action name="Execute"><command>… - ~/.config/hypr/binding.conf — bindd = CTRL ALT, S, …, exec, … (mods space-separated)

Daily driver = Wayfire (per user profile). But 4 compositors configured → a binding tested in the wrong one looks "missing."


4. The keybinding map (as-built, live)

Wayfire (Super = ⊞): Super+Return foot · Super+D wofi · Ctrl+Alt+S audio · Super+/ cheatsheet · Super+Shift+L lock · Super+Q/Alt+F4 close · Super+H/J/K/L focus · Super+arrows grid · Super+T tiling · Super+Tab switcher · Super+E expo · Ctrl+Super+F fullscreen · PrintScr/Super+PrintScr screenshot.

tmux — prefix Ctrl+Z (or F12): - Direct: Ctrl+Space popup · Ctrl+=/-/0 popup size · Ctrl+T term · Ctrl+A launcher · Alt+U/D/M volume · Alt+H/L window · Alt+J/K pane. - Prefix+: \ tmux-menus · Space popup · d dashboard · s settings(=wallpaper) · n notes · Tab fzf · '/" snippets.

Two different "keys lists" (don't conflate): - Missing Keys (prefix+\ → M) — tmux-menus built-in, tmux keys only. - nexus-cheatsheet.sh (Super+/) — desktop/compositor keys. Content is STALE (says "fuzzel" but Wayfire uses wofi; missing the new binds).


5. ⚠️ THE DUPLICATION TRAP (root cause of all the confusion)

tmux-menus exists in THREE diverged copies: | Path | Live? | |---|---| | ~/.config/tmux/plugins/tmux-menus | ✅ LIVE (TMUX_PLUGIN_MANAGER_PATH=~/.config/tmux/plugins/) | | ~/.tmux/plugins/tmux-menus | ❌ dead copy (I mistakenly edited this first; reverted) | | ~/01/.tmux/plugins/tmux-menus | ❌ dead copy |

The dead and live copies have different menu structures (different keys, different NeXuS wiring). Editing a dead copy = changes never appear → "do it again."

Nested script dirs: ~/scripts/ and ~/scripts/scripts/ both contain copies of the same tools (tmux-popup-launcher.sh, volume_control.sh, nexus-play.sh, …). Menus/binds may point at either; editing the wrong one does nothing.

How Notes/keys are actually wired in the LIVE copy: - prefix+\ → Extras (E) → NeXuS Notes (n) via scripts/nexus_notes_popup.sh (tmux display-popup -E -h 85% -w 75% "bash ~/scripts/scripts/nexus-notes.sh"). - Live main menu uses the Custom items mechanism (items/main.sh line ~19) + standard items (Panes/Windows/Sessions/Buffers/Advanced/Extras/Missing Keys). - No desktop-keys popup was ever wired into the live menu — the script existed, that's all. - @menus_trigger_prefix = '\' → menu opens on prefix+\. DO NOT TOUCH prefix+\ — user's special menu. To add items: mirror nexus_notes_popup.sh + add an 0.0 E <k> "label" <script> line to items/extras.sh (live copy), OR use custom_items/. - tmux-menus caches rendered menus in cache/; it auto-invalidates by mtime (dialog_handling.sh ~line 578: regenerates when the item script is newer than its cache). No manual clear needed.


6. Pending / next actions (NOT yet done — user paused)

  1. Reconcile the duplication (HIGH): non-destructive audit first — map all dup copies (tmux-menus ×3, ~/scripts vs ~/scripts/scripts), pick live as canonical, archive (never delete) the dead ones, collapse nested script dir. This stops the "done over again" loop.
  2. Wire desktop-keys popup into the live tmux menu (optional): add "NeXuS Keys" to live items/extras.sh → new scripts/nexus_keys_popup.sh → pops nexus-cheatsheet.sh. User leaning toward a grouped "NeXuS" submenu (Keys + Audio).
  3. Refresh nexus-cheatsheet.py content — it's stale (fuzzel/wrong keys, missing Ctrl+Alt+S, Super+/). Option: auto-generate from live configs so it never goes stale.
  4. Fix prefix+Space → 127 — tmux-resizable-popup.sh calls deleted wtf-interactive-launcher.sh; repoint to existing ~/scripts/tmux-popup-launcher.sh.
  5. Fix sway wallpaper (line 24) — points at a directory; sway won't load until it's a file.
  6. Fix stale tmux-cheatsheet.sh — claims prefix is Ctrl+Space; it's actually Ctrl+Z/F12.

7. Golden rule reinforced

Before editing a config or script, find the copy the running process actually loads. Check TMUX_PLUGIN_MANAGER_PATH, the compositor actually running, and whether a scripts/scripts nested twin exists. Back up first (*.bak-<ts>), archive—never delete.