// ============================================================
// Waybar Config — Hyprland Cyberqueer Setup
// ============================================================
// Waybar is the taskbar/statusbar displayed at the top of the
// Hyprland Wayland compositor. This JSON5 file (comments and
// trailing commas allowed) defines every module shown on the
// bar: position, update intervals, display formats, click
// actions, and hover tooltips.
//
// Cyberqueer color palette (referenced throughout):
// #1a1a1a — near-black background
// #5018dd — deep electric purple (inactive / cool accent)
// #E40046 — hot neon red/pink (active / warm accent)
// #d6abab — muted dusty rose (readable text / neutral)
// #f50505 — bright red (critical / alert states)
// ============================================================
{
// ── Bar placement ──────────────────────────────────────────
// "layer": "top" — the bar sits above all other windows so
// it is never covered by maximized applications.
// "position": "top" — anchored to the top edge of the screen.
"layer": "top", "position": "top",
// ── Module layout ──────────────────────────────────────────
// Waybar divides the bar into three zones: left, center, right.
// The order within each list is the left-to-right display order.
"modules-left": ["clock", "disk", "memory", "cpu", "temperature" ],
// Center: Hyprland workspace switcher + currently focused window title.
"modules-center": [ "hyprland/workspaces", "hyprland/window"],
// Right: network icon, local IP, system tray, audio volume, battery.
"modules-right": [ "network", "custom/netaddrsimple", "tray", "pulseaudio", "battery" ],
// Automatically reload style.css when the file changes on disk,
// so appearance tweaks take effect without restarting waybar.
"reload_style_on_change":true,
// ── custom/netaddrsimple ───────────────────────────────────
// A bare-minimum custom module that shows the machine's local IP.
// Handy for quickly finding the address to SSH into.
"custom/netaddrsimple": {
// {} is substituted with the stdout of the exec command.
"format": "IP:{}",
// No tooltip needed — the IP text in the bar is sufficient.
"tooltip":false,
// (Commented out) would limit the displayed text to 15 characters.
//"max-length": 15,
// Refresh every 10 seconds — local IP rarely changes.
"interval": 10,
// "hostname -i" prints the machine's primary local IP address.
"exec": "hostname -i",
},
// ── hyprland/workspaces ───────────────────────────────────
// Shows clickable workspace number buttons.
// Mouse-wheel scrolling switches workspaces sequentially.
"hyprland/workspaces": {
// Display the workspace name (typically its number) as label text.
"format": "{name}",
// These icon overrides replace the label when a workspace matches
// the "default", "active", or "urgent" state keys.
"format-icons": {
// Unfocused, non-urgent workspaces get a plain bullet.
"default": " ",
// The currently focused workspace is marked with "@".
"active": "@",
// A workspace with an urgent app (needs attention) shows "!".
"urgent": "!"
},
// Scroll wheel up → move to numerically higher workspace.
"on-scroll-up": "hyprctl dispatch workspace e+1",
// Scroll wheel down → move to numerically lower workspace.
"on-scroll-down": "hyprctl dispatch workspace e-1",
},
// NOTE: this clock block is structurally inside the workspaces
// object due to a brace mismatch in the original config.
// The top-level "clock" block defined further below takes
// precedence and is what waybar actually uses.
"clock": {
// Locale-aware HH:MM format (24-hour).
"format": "{:L%H:%M}",
"tooltip": true,
// Tooltip shows a large date line and a small monthly calendar.
"tooltip-format": "{:%A, %d.%B %Y }\n{calendar}"
}
},
// ── idle_inhibitor ────────────────────────────────────────
// Prevents the system from going idle / blanking the screen
// while activated. Toggle by clicking the module.
"idle_inhibitor":{
// Wrap the icon in a larger font-size span so the glyph is readable.
"format": "{icon} ",
"format-icons": {
// Nerd Font "eye open" — currently inhibiting idle / screen-off.
"activated":"",
// Nerd Font "eye closed" — idle allowed normally.
"deactivated":""
}
},
// ── clock ─────────────────────────────────────────────────
// Real-time HH:MM:SS clock shown in the left section.
// Updates every second so the seconds digit stays live.
"clock": {
// Show hours, minutes, and seconds with a trailing space.
"format": "{:%H:%M:%S }",
// 1-second interval to keep the clock accurate to the second.
"interval":1,
// Tooltip: a large date header plus a mini monthly calendar.
"tooltip-format": "\n{:%d %m %Y}\n{calendar}",
// Display ISO week numbers on the right side of the calendar grid.
"calendar-weeks-pos": "right",
// Highlight today's date cell in the cyberqueer purple (#7645AD).
"today-format": "{}",
// Calendar day numbers in muted grey so they don't compete visually.
"format-calendar": "{}",
// Week-number column label (e.g. "W24") in the same muted grey.
"format-calendar-weeks": "W{:%V}",
// Weekday header row (Mon, Tue…) in muted grey.
"format-calendar-weekdays": "{}"
},
// ── bluetooth ────────────────────────────────────────────
// Bluetooth state indicator using Nerd Font glyphs.
// Clicking opens rofi-bluetooth for pairing/device management.
"bluetooth": {
// Bluetooth is on but nothing is connected.
"format-on": "",
// Bluetooth is turned off.
"format-off": "",
// Bluetooth hardware is disabled at the kernel/driver level.
"format-disabled": "",
// At least one device is connected.
"format-connected": "",
// Connected device reports battery level — show it alongside the icon.
"format-connected-battery": "{device_battery_percentage}% ",
// Base tooltip: controller name, MAC, and connection count.
"tooltip-format": "{controller_alias}\t{controller_address}\n\n{num_connections} connected",
// Extended tooltip listing each connected device when count > 0.
"tooltip-format-connected": "{controller_alias}\t{controller_address}\n\n{num_connections} connected\n\n{device_enumerate}",
// Per-device line in the enumeration: alias + MAC.
"tooltip-format-enumerate-connected": "{device_alias}\t{device_address}",
// Per-device line when battery info is available.
"tooltip-format-enumerate-connected-battery": "{device_alias}\t{device_address}\t{device_battery_percentage}%",
// Left-click launches rofi-bluetooth for a GUI device list.
"on-click": "rofi-bluetooth",
},
// ── battery ─────────────────────────────────────────────
// Shows remaining battery capacity and charging state.
// 1-second interval so the "PWR-" / "PWR+" prefix switches instantly.
"battery": {
"interval":1,
// Named thresholds that trigger CSS state classes:
// .good ≥ 95% (full — no visual warning)
// .warning ≤ 30% (getting low)
// .critical ≤ 20% (nearly empty — style.css colors this bright red)
"states": {
"good": 95,
"warning": 30,
"critical": 20
},
// Discharging: "PWR-" prefix + capacity + level icon.
"format": "PWR- {capacity}% {icon} ",
// Charging via AC: "PWR+" prefix + the charging glyph.
"format-charging": "PWR+ {capacity}% ",
// Plugged in at 100%: show charger icon even though full.
"format-plugged": "PWR+ {capacity}% ",
// Right-click (alt format) shows estimated time remaining.
"format-alt": "{time} {icon}",
// Six Nerd Font battery glyphs mapping roughly to 0→100% in steps.
"format-icons": [
"", // 0–20 %
"", // 20–40 %
"", // 40–60 %
"", // 60–80 %
"", // 80–95 %
"" // 95–100 %
],
},
// ── backlight ──────────────────────────────────────────────
// Screen brightness via the intel_backlight sysfs interface.
// Scroll wheel on this module adjusts brightness by ±10 units.
"backlight": {
// Target the Intel integrated GPU backlight node specifically.
"device": "intel_backlight",
// Display only the icon — brightness level communicated visually.
"format": "{icon}",
// Ten sun/brightness Nerd Font icons mapping 0%→100% in 10% steps.
"format-icons": [
"", // 0–10 %
"", // 10–20 %
"", // 20–30 %
"", // 30–40 %
"", // 40–50 %
"", // 50–60 %
"", // 60–70 %
"", // 70–80 %
"", // 80–90 %
"", // 90–100 %
],
// Scroll down decreases brightness (note: flag names are swapped in `light`).
"on-scroll-down": "light -A 10",
// Scroll up increases brightness.
"on-scroll-up": "light -U 10",
// Threshold of 1 means no acceleration — every scroll tick = 10 units.
"smooth-scrolling-threshold": 1
},
// ── disk ─────────────────────────────────────────────────
// Shows how much of the root partition is used, as a percentage.
// 30-second interval is fine — disk usage changes slowly.
"disk": {
"interval": 30,
// Hard-drive Nerd Font glyph + used-space percentage.
"format": " {percentage_used}%",
// Watch the root filesystem specifically (not /home or other mounts).
"path": "/"
},
// ── custom/colorpicker ───────────────────────────────────
// Wraps hyprpicker into a waybar button.
// Clicking launches the eyedropper; the picked hex is copied to
// clipboard and the module refreshes to show a colored dot.
"custom/colorpicker": {
// {} is replaced with the JSON "text" field from the script.
"format": "{}",
// Script returns {text, tooltip} JSON — waybar parses both fields.
"return-type": "json",
// "once" means only run at startup; RTMIN+1 triggers re-execution.
"interval": "once",
// On load: render the most-recently-picked color as a dot.
"exec": "~/.config/waybar/scripts/colorpicker.sh -j",
// Click: 1-second delay prevents the click from interfering with the
// hyprpicker window, then launch the picker.
"on-click": "sleep 1 && ~/.config/waybar/scripts/colorpicker.sh",
// colorpicker.sh sends RTMIN+1 to waybar after saving a new color,
// which causes this module to re-exec and show the new color.
"signal": 1
},
// ── cpu ──────────────────────────────────────────────────
// Aggregate CPU usage across all cores, updated every second.
"cpu": {
"interval": 1,
// Nerd Font CPU chip icon + usage %. Fixed 6-char width stops the
// bar from shifting when the value goes from single to double digits.
"format": " {usage}%",
"min-length": 6,
"max-length": 6,
// Bar-graph Unicode chars available for use in custom format strings.
"format-icons": ["▁", "▂", "▃", "▄", "▅", "▆", "▇", "█"],
},
// ── memory ────────────────────────────────────────────────
// RAM usage as a percentage. Compact single-field display.
"memory": {
// Memory chip Nerd Font glyph + percentage of RAM used.
"format": " {percentage}%"
},
// ── hyprland/window ──────────────────────────────────────
// Shows the WM_CLASS of the currently focused window in the bar center.
// Rewrite rules transform noisy titles into cleaner short labels.
"hyprland/window": {
// Wrap the class name in parentheses for a "terminal prompt" aesthetic.
"format": "( {class} )",
"rewrite": {
// Strip " - Mozilla Firefox" from page titles; prepend a globe.
"(.*) - Mozilla Firefox": "🌎 $1",
// Kitty/foot terminal: show the current directory in brackets.
"(.*) - zsh": "> [$1]"
}
},
// ── temperature ──────────────────────────────────────────
// CPU package temperature. Turns to a "critical" CSS class above 80 °C.
// Clicking opens btop for a full system-monitoring view.
"temperature": {
// Normal state: thermometer glyph + temperature in Celsius.
"format": " {temperatureC}°C",
// Critical state: fire glyph replaces the thermometer icon.
"format-critical": " {temperatureC}°C",
// 1-second interval to catch sudden thermal spikes quickly.
"interval": 1,
// Above 80 °C the module switches to the "critical" CSS class.
"critical-threshold": 80,
// Left-click opens btop in the foot Wayland terminal.
"on-click": "foot btop",
},
// ── pulseaudio ───────────────────────────────────────────
// Volume level and mute control via PulseAudio or PipeWire-pulse.
// Left-click: toggle mute. Right-click: open pavucontrol GUI mixer.
"pulseaudio": {
// Default format: percentage + device-type icon.
"format": "{volume}% {icon}",
// When the active sink is a Bluetooth device, show a BT-speaker glyph.
"format-bluetooth":"",
// Muted: show a crossed-speaker glyph, hide the volume number.
"format-muted": "",
// Icon set keyed by audio device type reported by PulseAudio.
"format-icons": {
"headphones": "",
"bluetooth": "",
"handsfree": "",
"headset": "",
"phone": "",
"portable": "",
"car": "",
// Default (built-in speaker): three-tier glyphs for low/mid/high volume.
"default": ["","",""]
},
// Center-align the label within the module's allocated width.
"justify": "center",
// Toggle Master channel mute via amixer on left-click.
"on-click": "amixer sset Master toggle",
// Open the graphical PulseAudio volume control on right-click.
"on-click-right": "pavucontrol",
// Tooltip shows icon + volume % for a quick glance.
"tooltip-format": "{icon} {volume}%"
},
// ── jack ─────────────────────────────────────────────────
// JACK Audio Connection Kit DSP load monitor.
// Relevant when running pro-audio software that uses JACK directly.
"jack": {
// {} = current DSP percentage (how busy the JACK graph is).
"format": "{} ",
// Xruns are buffer underruns — audio glitches. Non-zero = problem.
"format-xrun": "{xruns} xruns",
// JACK server is not running.
"format-disconnected": "DSP off",
// Poll in real-time (rather than on an interval) for accuracy.
"realtime": true
},
// ── tray ────────────────────────────────────────────────
// System tray using the StatusNotifierItem / libdbusmenu protocol.
// Apps like NetworkManager applet, Blueman, etc. dock here.
"tray": {
// Icon render size in pixels — 14 px is compact but readable.
"icon-size": 14,
// Horizontal gap between tray icons in pixels.
"spacing": 10
},
// ── upower ──────────────────────────────────────────────
// Displays UPower-tracked peripheral battery levels (mice, keyboards).
// The icon is suppressed; info appears only in the tooltip to save space.
"upower": {
// Don't show a persistent icon in the bar.
"show-icon": false,
// Collapse the module entirely when no UPower devices are present.
"hide-if-empty": true,
"tooltip": true,
// Vertical spacing between device entries in the tooltip.
"tooltip-spacing": 20
},
// ── network ─────────────────────────────────────────────
// Connection-type indicator: one icon for wifi, one for ethernet,
// one for disconnected. Hovering reveals SSID, signal, or IP.
"network":{
// Wireless: show only a wifi Nerd Font glyph (no text).
"format-wifi": " ",
// Wired: ethernet cable Nerd Font glyph.
"format-ethernet":" ",
// Not connected to anything.
"format-disconnected": "",
// Ethernet tooltip: just the interface name (eth0, enp3s0, etc.).
"tooltip-format": "{ifname}",
// Wi-Fi tooltip: SSID, signal percentage, and IP address.
"tooltip-format-wifi": "{essid} ({signalStrength}%) | {ipaddr}",
// Ethernet tooltip: interface name and IP address.
"tooltip-format-ethernet": "{ifname} 🖧 | {ipaddr}"
},
// ── custom/powerDraw ─────────────────────────────────────
// Reads instantaneous battery power draw in watts from sysfs.
// Useful for identifying rogue processes spiking power consumption.
"custom/powerDraw": {
// {} replaced by the JSON "text" field from the script output.
"format": "{}",
// Poll every second — power draw is volatile.
"interval": 1,
// Script reads /sys/class/power_supply/BAT*/power_now and formats JSON.
"exec": "~/.config/waybar/scripts/powerdraw.sh",
// JSON return type lets the script provide both text and tooltip.
"return-type": "json"
}
}