Files
Nomarchy/modules/home/battery-notify.nix
Bernardo Magri fb78c814cc
All checks were successful
Check / eval (push) Successful in 3m4s
feat(battery): low-battery notifications at the bar's 25/10% thresholds (item 13 slice)
The bar colored the battery at 25/10% but nothing notified. New
shellcheck-gated watcher (pkgs/nomarchy-battery-notify, overlay) polls
the same sysfs the bar reads — type=Battery, scope!=Device — and fires
one toast per downward crossing (normal at 25%, critical at 10%; swaync
keeps critical up until dismissed), re-armed by charging. Self-gates on
battery presence (the powerprofile pattern), so desktops get a silent
no-op. HM user unit behind nomarchy.batteryNotify.enable (default on)
with libnotify on the unit PATH; notify-send resolves from PATH so the
VM check can shim it. poweralertd rejected: its UPower thresholds
(20/5) wouldn't match the bar, and it toasts every plug/unplug.

Verified: V0 (flake check, bash -n); V1 (template-home builds, unit in
the generation); V2 GREEN (new checks.battery-notify, test_power fake
battery: self-gate, silence at 80%, one toast per crossing, critical
urgency, charging re-arms). Remains: V3 — real swaync toast on a
draining laptop (HARDWARE-QUEUE).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-05 15:11:06 +01:00

30 lines
1.3 KiB
Nix

# Low-battery notifications (nomarchy.batteryNotify) — the bar colors the
# battery @warn/@bad at 25/10% (waybar.nix battery.states) but nothing
# *notified*; this watcher fires a toast at those same thresholds. Session-
# side and self-gating on a battery being present (the powerprofile-script
# pattern — no system→home coupling), so it's a silent no-op on desktops.
# swaync shows critical toasts until dismissed (timeout-critical = 0), so
# the 10% one can't slip by unseen. Logic lives in pkgs/nomarchy-battery-
# notify (overlay), where checks.battery-notify exercises it.
{ config, lib, pkgs, ... }:
{
config = lib.mkIf config.nomarchy.batteryNotify.enable {
systemd.user.services.nomarchy-battery-notify = {
Unit = {
Description = "Low-battery notifications (25/10%, the bar's thresholds)";
PartOf = [ "graphical-session.target" ];
After = [ "graphical-session.target" ];
};
Service = {
# The script resolves notify-send from PATH (that's what the VM
# check shims); here libnotify provides the real one.
Environment = "PATH=${lib.makeBinPath [ pkgs.libnotify ]}";
ExecStart = "${pkgs.nomarchy-battery-notify}/bin/nomarchy-battery-notify";
Restart = "on-failure";
};
Install.WantedBy = [ "graphical-session.target" ];
};
};
}