My CachyOS (Arch-based) desktop setup. Managed with
GNU Stow: every file under home/ mirrors
its real location under $HOME and gets symlinked there.
Tuned for one machine: an ASUS laptop with a hybrid AMD iGPU + NVIDIA RTX 4070, multi-monitor, username
nethum. The Hyprland and Ambxst configs hard-code hardware details — read before applying to different hardware.
Hyprland tiling a Firefox window alongside a clock + cmatrix column:
The Ambxst bar and control center — quick toggles, media, calendar, notifications:
home/ # stow package → symlinked into ~
.config/
hypr/ hyprland.conf # sources generated gpu.conf (see below)
monitors.conf workspaces.conf monitors.lua # nwg-displays owns these
ambxst/ binds.json + per-feature config (bar, dock, theme, …)
handy-voice/ config.toml + env # wake-word daemon config (docs/voice.md)
systemd/user/ agentdash.service # usage-indicator daemon (docs/usage-indicator.md)
fish/ config.fish + functions
kitty/ ghostty/ alacritty/ # terminals
btop/ cava/ hyprshell/ # TUIs / shell extras
autostart/ solaar.desktop # Logitech (MX Master) daemon
.peaclock/ config
.local/bin/ lidawake keybinds pomodoro tbinds usage
tools/
agentdash/ # vendored usage indicator (no upstream)
gen-gpu-conf.sh # detects GPUs → writes gpu.conf + udev rule
parity/ # 1:1 layer: Ambxst + custom widgets, hyprexpo,
# wallpapers, herdr & co, axi toolchain
AGENTS.md # agent bring-up checklist + verify steps
docs/
apps.md # curated installed-software inventory
debugging.md # symptom → cause → fix for bring-up failures
hardware.md # GPU matrix + per-machine assumptions
packages-explicit.txt # pacman -Qqe snapshot (ground truth)
tailscale.md # tailnet shape + the CachyOS MagicDNS fix
voice.md usage-indicator.md # the voice stack + usage indicator
packages.txt # core stack for pacman --needed
install.sh # one-shot: packages + stow + udev + repos + services
git clone https://github.com/nethum529/linux-setup ~/linux-setup
cd ~/linux-setup
./install.sh # or ./install.sh --no-pkgs to skip pacmanOne shot: installs the core packages (packages.txt), stows the dotfiles,
installs the udev rule, deploys the vendored agentdash + its user service,
clones tool-ring and handy-voice-activation and runs their installers, then
prints the few remaining manual steps (Handy AppImage, Claude Code login).
On a hybrid iGPU+NVIDIA laptop, Hyprland's allocator must open the iGPU
first or it crashes on launch with "no allocator available". The catch:
Aquamarine splits AQ_DRM_DEVICES on :, and PCI by-path names contain colons,
so they get shredded. The fix is colon-free, rename-stable DRM symlinks from a
generated udev rule, then:
env = AQ_DRM_DEVICES,/dev/dri/igpu-card:/dev/dri/nv-card
All of this is machine-specific, so tools/gen-gpu-conf.sh detects the GPU
topology and generates both the udev rule (real PCI addresses) and
~/.config/hypr/gpu.conf — hybrid, NVIDIA-only (RTX 50 series included), and
AMD/Intel-only boxes each get the right env. Matrix and reasoning:
docs/hardware.md.
- Voice: the Handy speech-to-text app plus the
handy-voice-activation
wake-word daemon ("mars" toggles recording hands-free). Config is stowed from
home/.config/handy-voice/; details in docs/voice.md. - Usage indicator:
tools/agentdashtracks Claude Code + Codex rate-limit windows; theusageCLI andagentdash.servicedaemon expose it. Details in docs/usage-indicator.md.
- tool-ring — the radial launcher ring
bound to
Super+G. - handy-voice-activation —
the wake-word daemon; its installer is run by
install.sh.
| script | what it does |
|---|---|
lidawake |
toggle "close lid, stay awake" via a logind inhibitor |
keybinds |
pretty-printed Hyprland keybind cheat sheet |
pomodoro |
zero-dependency peaclock-style Pomodoro TUI |
tbinds |
tmux keybind cheat sheet |
usage |
Claude Code + Codex rate-limit usage (agentdash CLI) |
Fish functions (home/.config/fish/functions/): danger / cdanger launch
Claude Code / Codex with sandboxing off (danger pre-accepts the folder-trust
dialog), opencode wrapper with --m/--e model + effort flags (in
config.fish), brave-cdp points chrome-devtools-axi at a running Brave,
kbinds kitty cheat sheet, crun compile-and-run, name/na/nethum
terminal banners, usage rate-limit readout.

