diff --git a/agent/HARDWARE-QUEUE.md b/agent/HARDWARE-QUEUE.md
index 61da91b..56fd3ad 100644
--- a/agent/HARDWARE-QUEUE.md
+++ b/agent/HARDWARE-QUEUE.md
@@ -8,16 +8,18 @@ the failure as a NOW bug in BACKLOG.md. Machines: the **AMD dev box**
QA machine), the **T14s** (webcam case).
## Any machine (dev box is fine)
-- [ ] **Unfree CLI default (2026-07-10)** — after `sys-rebuild` + new
- shell/login: `echo $NIXPKGS_ALLOW_UNFREE` → `1`; `nix-shell -p
- vscode --run 'code --version'` (or another unfree pkg) succeeds
- without a manual export; `cat ~/.config/nixpkgs/config.nix` has
- `allowUnfree = true`. (Flake-pure `nix shell nixpkgs#…` still may
- need `--impure` — that is expected.)
-- [ ] **Waybar icon+percentage spacing (2026-07-10)** — switch to
- executive-slate (and spot-check boreal/summer): battery glyph and
- capacity% do not collide; volume glyph and volume% do not collide.
- Unified clock reads as one module (`HH:MM · Day DD Mon`).
+- [x] **Unfree CLI default (2026-07-10)** — PASS (Bernardo, Latitude).
+- [ ] **Waybar icon+percentage spacing (2026-07-10, retest)** — after
+ `home-update`: executive-slate (and boreal/summer) — high-volume
+ glyph + `%`, keyboard layout glyph + code, battery glyph + `%`
+ each have a clear gap (double-pad + mono face). Unified clock is
+ one module (`HH:MM · Day DD Mon`). First pass: volume-high and
+ keyboard still tight → pad doubled.
+- [x] **Calendar on unified clock (2026-07-10)** — PASS (Bernardo).
+- [ ] **Rofi case-insensitive search (2026-07-10)** — SUPER+Space: type
+ `ste` → Steam listed (not only `Ste`/`STE`); type `sys` → System
+ menu row if testing nomarchy-menu. Config: matching normal,fuzzy +
+ case-sensitive false + case-smart false.
- [ ] **Charge-limit live apply (2026-07-10)** — on a laptop with
`charge_control_end_threshold`: System › Battery limit → 80%;
confirm `cat …/charge_control_end_threshold` is 80 without rebuild;
diff --git a/modules/home/rofi.nix b/modules/home/rofi.nix
index 67078e3..5edd1c1 100644
--- a/modules/home/rofi.nix
+++ b/modules/home/rofi.nix
@@ -1159,19 +1159,18 @@ in
# reserving `lines` (8) — so a 6-entry menu doesn't leave empty space,
# while the app launcher still fills + scrolls past `lines`.
fixed-num-lines = false;
- # Search: case-insensitive fuzzy across every menu + the launcher, so
- # "system" finds "System" and "fzr" finds "Firefox". `normal` sorting
- # ranks by match distance so the closest match lands on top (the
- # per-keystroke modules — calc/emoji — opt out per-invocation with
- # -no-sort).
+ # Search: case-insensitive, substring first + fuzzy forgiveness.
+ # "ste" must find "Steam", "system" finds "System", "fzr" still
+ # reaches "Firefox". Comma list = match if ANY method hits (rofi 1.7+).
#
- # NOT `fzf`: rofi 2.0.0's fzf sorter mis-ranks with fuzzy matching —
- # typing "steam" left ghostty selected on top instead of Steam
- # (confirmed on hardware: `-sorting-method normal` and `-matching
- # normal` both fixed it, `-no-sort` did not). Keep fuzzy matching for
- # forgiveness; use the normal sorter to rank it (item 31).
- matching = "fuzzy";
+ # History: fuzzy-only + fzf sorter mis-ranked (ghostty over Steam);
+ # fuzzy-only still failed short lowercase queries on hardware
+ # 2026-07-10 despite case-sensitive=false. normal covers the
+ # prefix/substring case; fuzzy stays for typo-tolerant hits.
+ # case-smart off so all-lowercase never flips to case-sensitive.
+ matching = "normal,fuzzy";
case-sensitive = false;
+ case-smart = false;
sort = true;
sorting-method = "normal";
};
diff --git a/modules/home/waybar.nix b/modules/home/waybar.nix
index de2d27f..b8b1f4d 100644
--- a/modules/home/waybar.nix
+++ b/modules/home/waybar.nix
@@ -215,17 +215,18 @@ let
# Active keyboard layout (per focused device) — only placed in
# modules-right when showLanguage (see above).
"hyprland/language" = {
- format = " {short}";
+ # Two spaces after the glyph: the keyboard icon's right bearing
+ # otherwise kisses the layout code (esp. mono Nerd faces).
+ format = " {short}";
tooltip = false;
};
pulseaudio = {
- # Trailing spaces on icons (not only between span and text): Nerd Font
- # glyphs often have tight right bearings and otherwise collide with
- # the percentage digits.
- format = "{icon} {volume}%";
+ # Two trailing spaces on every icon level: high-volume glyphs are the
+ # widest and still kissed the % with a single pad (hardware report).
+ format = "{icon}{volume}%";
format-muted = "";
- format-icons.default = [ " " " " " " ];
+ format-icons.default = [ " " " " " " ];
on-click = "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle";
# Right-click → the full mixer (per-app volumes) in a floating window
# (item 35). pwvucontrol ships in the template suite; the Hyprland
@@ -251,10 +252,10 @@ let
battery = {
states = { warning = 25; critical = 10; };
- # Same icon-bearing fix as pulseaudio (see format-icons note there).
- format = "{icon} {capacity}%";
- format-charging = " {capacity}%";
- format-icons = [ " " " " " " " " " " ];
+ # Same double-pad as pulseaudio (single space still tight on some glyphs).
+ format = "{icon}{capacity}%";
+ format-charging = " {capacity}%";
+ format-icons = [ " " " " " " " " " " ];
# Click either the battery or the power-profile icon → the combined
# power menu (profile + charge cap). The granular System rows stay.
on-click = "nomarchy-menu powermgmt";
diff --git a/themes/boreal/waybar.jsonc b/themes/boreal/waybar.jsonc
index 937f621..638362e 100644
--- a/themes/boreal/waybar.jsonc
+++ b/themes/boreal/waybar.jsonc
@@ -85,7 +85,7 @@
"on-click": "nomarchy-nightlight toggle"
},
"hyprland/language": {
- "format": " {short}",
+ "format": " {short}",
"tooltip": false
},
"custom/vpn": {
@@ -97,20 +97,20 @@
"pulseaudio": {
"scroll-step": 5,
"format": "{icon}{volume}%",
- "format-bluetooth": "{icon} {volume}%",
+ "format-bluetooth": "{icon} {volume}%",
"format-bluetooth-muted": " {icon}",
- "format-muted": " muted",
+ "format-muted": " muted",
"format-icons": {
- "headphone": " ",
- "hands-free": " ",
- "headset": " ",
- "phone": " ",
- "portable": " ",
- "car": " ",
+ "headphone": " ",
+ "hands-free": " ",
+ "headset": " ",
+ "phone": " ",
+ "portable": " ",
+ "car": " ",
"default": [
- " ",
- " ",
- " "
+ " ",
+ " ",
+ " "
]
},
"on-click": "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle",
@@ -124,14 +124,14 @@
"critical": 10
},
"format": "{icon}{capacity}%",
- "format-charging": " {capacity}%",
- "format-plugged": " {capacity}%",
+ "format-charging": " {capacity}%",
+ "format-plugged": " {capacity}%",
"format-icons": [
- " ",
- " ",
- " ",
- " ",
- " "
+ " ",
+ " ",
+ " ",
+ " ",
+ " "
],
"on-click": "nomarchy-menu powermgmt",
"tooltip-format": "Battery status"
diff --git a/themes/executive-slate/waybar.jsonc b/themes/executive-slate/waybar.jsonc
index 5a29998..602b672 100644
--- a/themes/executive-slate/waybar.jsonc
+++ b/themes/executive-slate/waybar.jsonc
@@ -70,7 +70,7 @@
"on-click": "nomarchy-nightlight toggle"
},
"hyprland/language": {
- "format": " {short}",
+ "format": " {short}",
"tooltip": false
},
"custom/updates": {
@@ -83,20 +83,20 @@
"pulseaudio": {
"scroll-step": 5,
"format": "{icon}{volume}%",
- "format-bluetooth": "{icon} {volume}%",
+ "format-bluetooth": "{icon} {volume}%",
"format-bluetooth-muted": " {icon}",
- "format-muted": " muted",
+ "format-muted": " muted",
"format-icons": {
- "headphone": " ",
- "hands-free": " ",
- "headset": " ",
- "phone": " ",
- "portable": " ",
- "car": " ",
+ "headphone": " ",
+ "hands-free": " ",
+ "headset": " ",
+ "phone": " ",
+ "portable": " ",
+ "car": " ",
"default": [
- " ",
- " ",
- " "
+ " ",
+ " ",
+ " "
]
},
"on-click": "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle",
@@ -116,14 +116,14 @@
"critical": 10
},
"format": "{icon}{capacity}%",
- "format-charging": " {capacity}%",
- "format-plugged": " {capacity}%",
+ "format-charging": " {capacity}%",
+ "format-plugged": " {capacity}%",
"format-icons": [
- " ",
- " ",
- " ",
- " ",
- " "
+ " ",
+ " ",
+ " ",
+ " ",
+ " "
],
"on-click": "nomarchy-menu powermgmt",
"tooltip-format": "Battery status"
diff --git a/themes/summer-day/waybar.jsonc b/themes/summer-day/waybar.jsonc
index 9aae8c6..0c7a227 100644
--- a/themes/summer-day/waybar.jsonc
+++ b/themes/summer-day/waybar.jsonc
@@ -8,11 +8,28 @@
"position": "top",
"spacing": 15,
"reload_style_on_change": true,
-
- "modules-left": ["custom/launcher", "clock"],
- "modules-center": ["hyprland/workspaces"],
- "modules-right": ["custom/recording", "idle_inhibitor", "pulseaudio", "custom/powerprofile", "custom/nightlight", "hyprland/language", "custom/updates", "battery", "tray", "custom/vpn", "custom/doctor", "custom/notification", "custom/powermenu"],
-
+ "modules-left": [
+ "custom/launcher",
+ "clock"
+ ],
+ "modules-center": [
+ "hyprland/workspaces"
+ ],
+ "modules-right": [
+ "custom/recording",
+ "idle_inhibitor",
+ "pulseaudio",
+ "custom/powerprofile",
+ "custom/nightlight",
+ "hyprland/language",
+ "custom/updates",
+ "battery",
+ "tray",
+ "custom/vpn",
+ "custom/doctor",
+ "custom/notification",
+ "custom/powermenu"
+ ],
"hyprland/workspaces": {
"disable-scroll": true,
"all-outputs": true,
@@ -20,14 +37,12 @@
"on-scroll-up": "hyprctl dispatch workspace r+1",
"on-scroll-down": "hyprctl dispatch workspace r-1"
},
-
"custom/launcher": {
"interval": "once",
- "format": "\uf000",
+ "format": "",
"on-click": "nomarchy-menu",
"tooltip-format": "Nomarchy menu"
},
-
"idle_inhibitor": {
"format": "{icon}",
"format-icons": {
@@ -35,55 +50,64 @@
"deactivated": " "
}
},
-
"pulseaudio": {
"format": "{icon}{volume}%",
- "format-bluetooth": "{icon} {volume}%",
+ "format-bluetooth": "{icon} {volume}%",
"format-bluetooth-muted": " muted",
- "format-muted": " muted",
+ "format-muted": " muted",
"format-icons": {
- "headphone": " ",
- "hands-free": " ",
- "headset": " ",
- "phone": " ",
- "portable": " ",
- "car": " ",
- "default": [" ", " ", " "]
+ "headphone": " ",
+ "hands-free": " ",
+ "headset": " ",
+ "phone": " ",
+ "portable": " ",
+ "car": " ",
+ "default": [
+ " ",
+ " ",
+ " "
+ ]
},
"on-click": "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle",
"on-click-right": "pwvucontrol",
"tooltip-format": "Playing at {volume}%"
},
-
"battery": {
"interval": 60,
- "states": { "warning": 25, "critical": 10 },
+ "states": {
+ "warning": 25,
+ "critical": 10
+ },
"max-length": 14,
"format": "{icon}{capacity}%",
- "format-charging": " {capacity}%",
- "format-plugged": " {capacity}%",
+ "format-charging": " {capacity}%",
+ "format-plugged": " {capacity}%",
"format-full": " 100%",
- "format-icons": [" ", " ", " ", " ", " "],
+ "format-icons": [
+ " ",
+ " ",
+ " ",
+ " ",
+ " "
+ ],
"on-click": "nomarchy-menu powermgmt",
"tooltip-format": "Battery status"
},
-
"clock": {
"format": " {:%H:%M · %a %d %b}",
"on-click": "nomarchy-calendar",
"tooltip": true,
"tooltip-format": "{:%A %d %B %Y}\n{:%Z (UTC%z)}\n{calendar}"
},
-
- "tray": { "spacing": 8 },
-
+ "tray": {
+ "spacing": 8
+ },
"custom/powerprofile": {
"return-type": "json",
"interval": 5,
"exec": "nomarchy-powerprofile-status",
"on-click": "nomarchy-menu powermgmt"
},
-
"custom/recording": {
"return-type": "json",
"interval": 10,
@@ -91,7 +115,6 @@
"exec": "nomarchy-record status",
"on-click": "nomarchy-record stop"
},
-
"custom/doctor": {
"return-type": "json",
"format": "{}",
@@ -100,26 +123,22 @@
"exec": "nomarchy-doctor-status",
"on-click": "nomarchy-menu doctor"
},
-
"custom/vpn": {
"return-type": "json",
"interval": 5,
"exec": "nomarchy-vpn-status",
"on-click": "nomarchy-vpn"
},
-
"hyprland/language": {
- "format": " {short}",
+ "format": " {short}",
"tooltip": false
},
-
"custom/nightlight": {
"return-type": "json",
"interval": 3,
"exec": "nomarchy-nightlight status",
"on-click": "nomarchy-nightlight toggle"
},
-
"custom/updates": {
"return-type": "json",
"interval": 1800,
@@ -127,7 +146,6 @@
"exec": "nomarchy-updates status",
"on-click": "sh -c '$TERMINAL -e nomarchy-updates upgrade'"
},
-
"custom/notification": {
"format": "{icon}",
"return-type": "json",
@@ -148,7 +166,6 @@
"dnd-inhibited-notification": ""
}
},
-
"custom/powermenu": {
"format": "",
"on-click": "nomarchy-menu power",
diff --git a/themes/summer-night/waybar.jsonc b/themes/summer-night/waybar.jsonc
index 7435824..4e81bfe 100644
--- a/themes/summer-night/waybar.jsonc
+++ b/themes/summer-night/waybar.jsonc
@@ -8,11 +8,28 @@
"position": "top",
"spacing": 15,
"reload_style_on_change": true,
-
- "modules-left": ["custom/nomarchy", "clock"],
- "modules-center": ["hyprland/workspaces"],
- "modules-right": ["custom/recording", "idle_inhibitor", "pulseaudio", "custom/powerprofile", "custom/nightlight", "hyprland/language", "custom/updates", "battery", "tray", "custom/vpn", "custom/doctor", "custom/notification", "custom/powermenu"],
-
+ "modules-left": [
+ "custom/nomarchy",
+ "clock"
+ ],
+ "modules-center": [
+ "hyprland/workspaces"
+ ],
+ "modules-right": [
+ "custom/recording",
+ "idle_inhibitor",
+ "pulseaudio",
+ "custom/powerprofile",
+ "custom/nightlight",
+ "hyprland/language",
+ "custom/updates",
+ "battery",
+ "tray",
+ "custom/vpn",
+ "custom/doctor",
+ "custom/notification",
+ "custom/powermenu"
+ ],
"hyprland/workspaces": {
"disable-scroll": true,
"all-outputs": true,
@@ -20,14 +37,12 @@
"on-scroll-up": "hyprctl dispatch workspace r+1",
"on-scroll-down": "hyprctl dispatch workspace r-1"
},
-
"custom/nomarchy": {
"interval": "once",
- "format": "\uf000",
+ "format": "",
"on-click": "nomarchy-menu",
"tooltip-format": "Nomarchy menu"
},
-
"idle_inhibitor": {
"format": "{icon}",
"format-icons": {
@@ -35,54 +50,63 @@
"deactivated": " "
}
},
-
"pulseaudio": {
"scroll-step": 5,
"format": "{icon}{volume}%",
- "format-bluetooth": "{icon} {volume}%",
+ "format-bluetooth": "{icon} {volume}%",
"format-bluetooth-muted": " {icon}",
- "format-muted": " muted",
+ "format-muted": " muted",
"format-icons": {
- "headphone": " ",
- "hands-free": " ",
- "headset": " ",
- "phone": " ",
- "portable": " ",
- "car": " ",
- "default": [" ", " ", " "]
+ "headphone": " ",
+ "hands-free": " ",
+ "headset": " ",
+ "phone": " ",
+ "portable": " ",
+ "car": " ",
+ "default": [
+ " ",
+ " ",
+ " "
+ ]
},
"on-click": "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle",
"on-click-right": "pwvucontrol",
"tooltip-format": "{desc} | {volume}%"
},
-
"battery": {
"interval": 30,
- "states": { "warning": 25, "critical": 10 },
+ "states": {
+ "warning": 25,
+ "critical": 10
+ },
"format": "{icon}{capacity}%",
- "format-charging": " {capacity}%",
- "format-plugged": " {capacity}%",
- "format-icons": [" ", " ", " ", " ", " "],
+ "format-charging": " {capacity}%",
+ "format-plugged": " {capacity}%",
+ "format-icons": [
+ " ",
+ " ",
+ " ",
+ " ",
+ " "
+ ],
"on-click": "nomarchy-menu powermgmt",
"tooltip-format": "Battery status"
},
-
"clock": {
"format": " {:%H:%M · %a %d %b}",
"on-click": "nomarchy-calendar",
"tooltip": true,
"tooltip-format": "{:%A %d %B %Y}\n{:%Z (UTC%z)}\n{calendar}"
},
-
- "tray": { "spacing": 8 },
-
+ "tray": {
+ "spacing": 8
+ },
"custom/powerprofile": {
"return-type": "json",
"interval": 5,
"exec": "nomarchy-powerprofile-status",
"on-click": "nomarchy-menu powermgmt"
},
-
"custom/recording": {
"return-type": "json",
"interval": 10,
@@ -90,7 +114,6 @@
"exec": "nomarchy-record status",
"on-click": "nomarchy-record stop"
},
-
"custom/doctor": {
"return-type": "json",
"format": "{}",
@@ -99,26 +122,22 @@
"exec": "nomarchy-doctor-status",
"on-click": "nomarchy-menu doctor"
},
-
"custom/vpn": {
"return-type": "json",
"interval": 5,
"exec": "nomarchy-vpn-status",
"on-click": "nomarchy-vpn"
},
-
"hyprland/language": {
- "format": " {short}",
+ "format": " {short}",
"tooltip": false
},
-
"custom/nightlight": {
"return-type": "json",
"interval": 3,
"exec": "nomarchy-nightlight status",
"on-click": "nomarchy-nightlight toggle"
},
-
"custom/updates": {
"return-type": "json",
"interval": 1800,
@@ -126,7 +145,6 @@
"exec": "nomarchy-updates status",
"on-click": "sh -c '$TERMINAL -e nomarchy-updates upgrade'"
},
-
"custom/notification": {
"format": "{icon}",
"return-type": "json",
@@ -147,7 +165,6 @@
"dnd-inhibited-notification": ""
}
},
-
"custom/powermenu": {
"format": "",
"on-click": "nomarchy-menu power",