// --// standalone two-bar cava rig — hand-maintained, NOT HyDE-generated (see README "Waybar") //-- //
[
{
// sourced from header module //
"layer": "top",
"position": "top",
"height": 33,
"exclusive": true,
"passthrough": false,
"gtk-layer-shell": true,
"reload_style_on_change": true,
// positions generated based on config.ctl //
"modules-left": ["custom/l_end","custom/power","custom/r_end","hyprland/workspaces", "custom/sl_end","hyprland/window","custom/sr_end","custom/l_end","custom/wallchange","custom/cliphist","custom/r_end"],
"modules-center": ["wlr/taskbar"],
"modules-right": ["custom/l_end","backlight","pulseaudio","pulseaudio#microphone","mpris","custom/r_end","custom/l_end","memory","cpu","custom/cpuinfo","battery","custom/r_end","custom/l_end","network","tray","custom/r_end","custom/l_end","idle_inhibitor","clock","custom/r_end"],
// sourced from modules based on config.ctl //
"tray": {
// exactly 22: Tela only has fixed-size monochrome icons in {16,22,24}/panel — any
// other size makes GTK fall through to scalable/devices, whose icons are colored
// circles (the blue nm-applet blob). An exact panel match keeps the tray flat/white.
"icon-size": 22,
"rotate": 0,
"spacing": 5
},
// NOTE: keep in sync with modules/window.jsonc — this layout is launched standalone
// (waybar -c), so the modules/ file is NOT read here; this inline copy is what renders.
"hyprland/window": {
"format": " {}",
"rotate": 0,
"separate-outputs": true,
"max-length": 1000,
"rewrite": {
"(.*) — Kitty": " $1",
"(.*)~": " $1",
"(.*) — Mozilla Firefox": " $1",
"(.*)Mozilla Firefox": " Firefox",
"(.*) — LibreWolf": " $1",
"(.*)LibreWolf": " LibreWolf",
"(.*) — Chromium": " $1",
"(.*)Chromium": " Chromium",
"(.*) - VSCodium": " $1",
"(.*)VSCodium": " VSCodium",
"(.*)Code - OSS": " $1",
"(.*) - Visual Studio Code": " $1",
"(.*)Visual Studio Code": " Code",
"(.*) — Dolphin": " $1",
"(.*) - Obsidian(.*)": " $1",
"(.*)Ferdium": " Ferdium",
"(.*)FreeTube": " FreeTube",
"(.*) - VLC media player": " $1",
"(.*)Steam": " Steam",
"(.*)Neovide": " Nvim",
"(.*)Neovim": " Nvim",
"(.*)Nvim": " Nvim",
"(.*)Gajim": " Gajim",
"(.*)KeePassXC": " KeePassXC",
"(.*)Betterbird": " Betterbird",
// --- apps in use on this rig (glyphs verified against JetBrainsMono NF v3) ---
"nvim (.*)": " $1",
"nvim": " Nvim",
"(.*)PyRadio - Playing: (.*)": " $2",
"(.*)PyRadio(.*)": " PyRadio",
"(.*) - mpv": " $1",
"(.*)mpv": " mpv",
"(.*) — Zen Browser": " $1",
"(.*)Zen Browser(.*)": " Zen",
"(.*) - Thorium": " $1",
"(.*)Thorium(.*)": " Thorium",
"(.*)Ghostty(.*)": " Ghostty",
"(.*)zellij(.*)": " zellij",
"(.*)btop(.*)": " btop",
"(.*)lazydocker(.*)": " lazydocker",
"(.*)Dolphin(.*)": " Dolphin",
"(.*)qBittorrent(.*)": " qBittorrent",
"(.*)GIMP(.*)": " GIMP",
"(.*)LibreOffice(.*)": " LibreOffice",
"(.*)KiCad(.*)": " KiCad",
"(.*)QGroundControl(.*)": " QGroundControl",
"(.*)Foxglove(.*)": " Foxglove",
"(.*)Bruno(.*)": " Bruno",
"(.*)RustDesk(.*)": " RustDesk",
"(.*)scrcpy(.*)": " scrcpy",
"(.*)Vial(.*)": " Vial",
"(.*)Volume Control(.*)": " Volume Control",
"(.*)Satty(.*)": " Satty"
}
},
"hyprland/workspaces": {
"window-rewrite-default":"",
"all-outputs": true,
"active-only": false,
"on-click": "activate",
"disable-scroll": false,
"on-scroll-up": "hyprctl dispatch workspace -1",
"on-scroll-down": "hyprctl dispatch workspace +1",
"persistent-workspaces": {}
},
"cpu": {
"interval": 10,
"format": " {usage}%",
"format-alt": "{icon0}{icon1}{icon2}{icon3}",
"format-icons": ["▁", "▂", "▃", "▄", "▅", "▆", "▇", "█"]
},
"custom/cpuinfo": {
"exec": " cpuinfo.sh",
"return-type": "json",
"format": "{}",
"rotate": 0,
"interval": 5, // once every 5 seconds
"tooltip": true,
"max-length": 1000
},
"memory": {
"states": {
"c": 90, // critical
"h": 60, // high
"m": 30 // medium
},
"interval": 30,
"rotate": 0,
"format": " {used:0.1f}GB",
"format-m": " {used:0.1f}GB",
"format-h": " {used:0.1f}GB",
"format-c": " {used:0.1f}GB",
"format-alt": " {percentage}%",
"max-length": 10,
"tooltip": true,
"tooltip-format": " {percentage}%\n {used:0.1f}GB/{total:0.1f}GB"
},
"custom/power": {
"format": "{}",
"rotate": 0,
"exec": "echo ; echo logout",
"on-click": "logoutlaunch.sh 2",
"on-click-right": "logoutlaunch.sh 1",
"interval" : 86400, // once every day
"tooltip": true
},
"wlr/taskbar": {
"format": "{icon}",
"rotate": 0,
"icon-size": 19,
"icon-theme": "Tela-circle-dracula",
"spacing": 0,
"tooltip-format": "{title}",
"on-click": "activate",
"on-click-middle": "close",
"ignore-list": [
"Alacritty"
],
"app_ids-mapping": {
"firefoxdeveloperedition": "firefox-developer-edition"
}
},
"idle_inhibitor": {
"format": "{icon}",
"rotate": 0,
"format-icons": {
"activated": "",
"deactivated": ""
}
},
"clock": {
"format": "{:%H:%M}",
"rotate": 0,
"format-alt": "{:%R %d·%m·%y}",
"tooltip-format": "{calendar}",
"calendar": {
"mode": "month",
"mode-mon-col": 3,
"on-scroll": 1,
"on-click-right": "mode",
"format": {
"months": "{}",
"weekdays": "{}",
"today": "{}"
}
},
"actions": {
"on-click-right": "mode",
"on-click-forward": "tz_up",
"on-click-backward": "tz_down",
"on-scroll-up": "shift_up",
"on-scroll-down": "shift_down"
}
},
"custom/cliphist": {
"format": "{}",
"rotate": 0,
"exec": "echo ; echo clipboard history",
"on-click": "sleep 0.1 && cliphist.sh c",
"on-click-right": "sleep 0.1 && cliphist.sh d",
"on-click-middle": "sleep 0.1 && cliphist.sh w",
"interval" : 86400, // once every day
"tooltip": true
},
"custom/wallchange": {
"format": "{}",
"rotate": 0,
"exec": "echo ; echo switch wallpaper",
// HyDE 26.x removed swwwallpaper.sh/swwwallselect.sh; hyde-shell wallpaper is the
// replacement (same calls as upstream's custom-wallchange module)
"on-click": "hyde-shell wallpaper -n",
"on-click-right": "hyde-shell wallpaper -p",
"on-click-middle": "sleep 0.1 && hyde-shell wallpaper --select",
"interval" : 86400, // once every day
"tooltip": true
},
"pulseaudio": {
"format": "{icon} {volume}",
"rotate": 0,
"format-muted": "",
"on-click": "pavucontrol -t 3",
"on-click-right": "volumecontrol.sh -s ''",
"on-click-middle": "volumecontrol.sh -o m",
"on-scroll-up": "volumecontrol.sh -o i",
"on-scroll-down": "volumecontrol.sh -o d",
"tooltip-format": "{icon} {desc} // {volume}%",
"scroll-step": 5,
"format-icons": {
"headphone": "",
"hands-free": "",
"headset": "",
"phone": "",
"portable": "",
"car": "",
"default": ["", "", ""]
}
},
"pulseaudio#microphone": {
"format": "{format_source}",
"rotate": 0,
"format-source": "",
"format-source-muted": "",
"on-click": "pavucontrol -t 4",
"on-click-middle": "volumecontrol.sh -i m",
"on-scroll-up": "volumecontrol.sh -i i",
"on-scroll-down": "volumecontrol.sh -i d",
"tooltip-format": "{format_source} {source_desc} // {source_volume}%",
"scroll-step": 5
},
"mpris": {
"format": "{player_icon} {dynamic}",
"rotate": 0,
"format-paused": "{status_icon} {dynamic}",
"player-icons": {
"default": "▶",
"mpv": "",
"spotify": "",
"firefox": "",
"vlc": ""
},
"status-icons": {
"paused": ""
},
"max-length": 1000,
"interval": 1
},
"battery": {
// Pinned to the laptop battery on purpose. Unpinned, waybar 0.15 scans every
// /sys/class/power_supply node, and a flapping one (the DualShock's
// ps-controller-battery-* appearing at login while opensdd/scc-daemon wake it)
// makes refreshBatteries() throw off its worker thread → SIGABRT, killing the
// whole bar (battery.cpp:142 uncaught; all 5 of 2026-08-17's coredumps). The pin
// (battery.cpp:117) gates every read/watch of non-matching nodes. On wm no BAT0
// exists so the module stays hidden — same as before. On lw verify the name with
// `ls /sys/class/power_supply` and correct here if it's BAT1 (its old default-config
// log already ruled out BAT2); a wrong name only hides the module, never crashes.
"bat": "BAT0",
"states": {
"good": 95,
"warning": 30,
"critical": 20
},
"format": "{icon} {capacity}%",
"rotate": 0,
"format-charging": " {capacity}%",
"format-plugged": " {capacity}%",
"format-alt": "{time} {icon}",
"format-icons": ["", "", "", "", "", "", "", "", "", "", ""]
},
// added 2026-08-14 — the rig never had a network indicator ("ethernet icon not working").
// Same def as HyDE's ~/.local/share/waybar/modules/network.jsonc, inline like everything
// else here; click toggles a bandwidth readout, tooltip carries the connection details.
"network": {
"tooltip": true,
"format-wifi": " ",
"rotate": 0,
"format-ethernet": " ",
"tooltip-format": "Network: {essid}\nSignal strength: {signaldBm}dBm ({signalStrength}%)\nFrequency: {frequency}MHz\nInterface: {ifname}\nIP: {ipaddr}/{cidr}\nGateway: {gwaddr}\nNetmask: {netmask}",
"format-linked": " {ifname} (No IP)",
"format-disconnected": " ",
"tooltip-format-disconnected": "Disconnected",
"format-alt": " {bandwidthDownBytes} {bandwidthUpBytes}",
"on-click-right": "nm-connection-editor", // replaces the hidden nm-applet tray menu
"interval": 2
},
"backlight": {
"device": "intel_backlight",
"rotate": 0,
"format": "{icon} {percent}%",
"format-icons": ["", "", "", "", "", "", "", "", ""],
"on-scroll-up": "brightnessctl set 1%+",
"on-scroll-down": "brightnessctl set 1%-",
"min-length": 6
},
// modules for padding //
"custom/l_end": {
"format": " ",
"interval" : "once",
"tooltip": false
},
"custom/r_end": {
"format": " ",
"interval" : "once",
"tooltip": false
},
"custom/sl_end": {
"format": " ",
"interval" : "once",
"tooltip": false
},
"custom/sr_end": {
"format": " ",
"interval" : "once",
"tooltip": false
},
"custom/rl_end": {
"format": " ",
"interval" : "once",
"tooltip": false
},
"custom/rr_end": {
"format": " ",
"interval" : "once",
"tooltip": false
},
"custom/padd": {
"format": " ",
"interval" : "once",
"tooltip": false
}
},
// full-width cava visualizer layered behind the main bar //
{
"name": "cavabar",
"layer": "bottom",
"position": "top",
"height": 36,
"margin-top": -33,
"exclusive": false,
"passthrough": true,
"modules-center": ["custom/cava"],
"custom/cava": {
"format": "{}",
"exec": "bash $HOME/.config/waybar/cava-waybar.sh $(cat $HOME/.config/waybar/cava.width 2>/dev/null || echo 94)", // per-host cava.width (bars, even; ~screen_px / (font-size*0.6)). gui default 94; wm overrides to 218
"restart-interval": 1,
"hide-empty-text": true
}
}
]