<feed xmlns='http://www.w3.org/2005/Atom'>
<title>dotfiles/dot_config/waybar, branch master</title>
<subtitle>My linux config and rc files</subtitle>
<id>https://git.sommerfeld.dev/dotfiles/atom/dot_config/waybar?h=master</id>
<link rel='self' href='https://git.sommerfeld.dev/dotfiles/atom/dot_config/waybar?h=master'/>
<link rel='alternate' type='text/html' href='https://git.sommerfeld.dev/dotfiles/'/>
<updated>2026-06-05T10:06:02Z</updated>
<entry>
<title>Move more host tooling to Nix</title>
<updated>2026-06-05T10:06:02Z</updated>
<author>
<name>sommerfeld</name>
<email>sommerfeld@sommerfeld.dev</email>
</author>
<published>2026-06-05T10:06:02Z</published>
<link rel='alternate' type='text/html' href='https://git.sommerfeld.dev/dotfiles/commit/?id=b0e83e2ee3fc328e55119ee7c1f09ad7ed20a635'/>
<id>urn:sha1:b0e83e2ee3fc328e55119ee7c1f09ad7ed20a635</id>
<content type='text'>
</content>
</entry>
<entry>
<title>fix(waybar): refactor A &amp;&amp; B || C patterns to avoid shellcheck SC2015</title>
<updated>2026-05-20T13:01:04Z</updated>
<author>
<name>sommerfeld</name>
<email>sommerfeld@sommerfeld.dev</email>
</author>
<published>2026-05-20T13:01:04Z</published>
<link rel='alternate' type='text/html' href='https://git.sommerfeld.dev/dotfiles/commit/?id=d90f59f78b7312da3ed55738a1d2fa11baa78843'/>
<id>urn:sha1:d90f59f78b7312da3ed55738a1d2fa11baa78843</id>
<content type='text'>
Older shellcheck (Ubuntu's in CI) flags '[ test ] &amp;&amp; cmd || true'
as SC2015 because, despite the intent, A &amp;&amp; B || C is not
equivalent to if-then-else (C runs when A is true but B fails).
Replace with explicit 'if … fi' or split into two 'A || continue'
guards. Functionally identical, lint-clean across versions.
</content>
</entry>
<entry>
<title>revert: drop snxctl-chromium wrapper, snx-rs works with default browser now</title>
<updated>2026-05-19T14:16:09Z</updated>
<author>
<name>sommerfeld</name>
<email>sommerfeld@sommerfeld.dev</email>
</author>
<published>2026-05-19T14:16:09Z</published>
<link rel='alternate' type='text/html' href='https://git.sommerfeld.dev/dotfiles/commit/?id=027fa12fc3fbc138dc8bbbb50b066735943d8b27'/>
<id>urn:sha1:027fa12fc3fbc138dc8bbbb50b066735943d8b27</id>
<content type='text'>
User confirms snx-rs's SAML loopback no longer needs chromium routing.
Remove:

- dot_local/bin/snxctl-chromium             (PATH-override wrapper)
- dot_local/share/snx-rs/bin/xdg-open       (chromium shim)
- snx-rs LibreWolf SAML note in user-overrides.js

The waybar snx-vpn toggle now just runs `snxctl connect` detached,
no wrapper indirection.
</content>
</entry>
<entry>
<title>feat(waybar): snx-rs VPN status indicator + click toggle</title>
<updated>2026-05-14T09:58:38Z</updated>
<author>
<name>sommerfeld</name>
<email>sommerfeld@sommerfeld.dev</email>
</author>
<published>2026-05-14T09:58:38Z</published>
<link rel='alternate' type='text/html' href='https://git.sommerfeld.dev/dotfiles/commit/?id=ec3fa96850ff534a241f7ebf2e4cdc13efdf3891'/>
<id>urn:sha1:ec3fa96850ff534a241f7ebf2e4cdc13efdf3891</id>
<content type='text'>
New custom/snx-vpn module sits next to custom/vpn (the wireguard one):

- snx-vpn-status.sh shells out to `snxctl status` (timeout 2s) and maps
  the output to three states: down (grey strikethrough), connecting/MFA
  (amber), up (green). Tooltip shows the full status block when up.
- snx-vpn-toggle.sh disconnects when up, runs snxctl-chromium detached
  when down (so SAML lands in the flatpak ungoogled-chromium without
  blocking waybar). Both paths refresh the module via SIGRTMIN+9.
</content>
</entry>
<entry>
<title>style: apply shfmt/prettier/just fmt drift</title>
<updated>2026-05-14T09:58:37Z</updated>
<author>
<name>sommerfeld</name>
<email>sommerfeld@sommerfeld.dev</email>
</author>
<published>2026-05-14T09:58:37Z</published>
<link rel='alternate' type='text/html' href='https://git.sommerfeld.dev/dotfiles/commit/?id=726005786ab398e89673bf8c141e50645f676c57'/>
<id>urn:sha1:726005786ab398e89673bf8c141e50645f676c57</id>
<content type='text'>
Pure formatter output from shfmt (2-space indent, '|' line breaks),
prettier (KEYBINDS.md), and 'just fmt' (justfile blank line).
No behavior change.
</content>
</entry>
<entry>
<title>refactor(notifications): drop dismissed-state machinery; pending = visible</title>
<updated>2026-05-13T12:43:42Z</updated>
<author>
<name>sommerfeld</name>
<email>sommerfeld@sommerfeld.dev</email>
</author>
<published>2026-05-13T12:43:42Z</published>
<link rel='alternate' type='text/html' href='https://git.sommerfeld.dev/dotfiles/commit/?id=26ceab690dff09d5162443b14adccfbe0e9bcd5d'/>
<id>urn:sha1:26ceab690dff09d5162443b14adccfbe0e9bcd5d</id>
<content type='text'>
Set mako default-timeout=0 so notifications stay until acted upon. With
auto-timeout off, mako's list IS the pending set, so the
$XDG_RUNTIME_DIR/mako-dismissed bridge becomes dead weight.

- mako/config: default-timeout=0; drop redundant [urgency=critical]
  default-timeout=0 override.
- Delete dismiss-visible.sh and restore-pending.sh; sway calls makoctl
  directly (Mod+n=dismiss, Mod+Shift+n=dismiss --all,
  Mod+Ctrl+n=restore as undo).
- Shrink mako-status.sh to a 20-line counter of makoctl list.
- Rename mako-history.py -&gt; notification-picker.py; lists only
  visible, dismisses via makoctl dismiss -n &lt;id&gt;.
- Update waybar config.jsonc on-click path.
- Update KEYBINDS.md wording (no more 'marks seen' / 'pending set').
</content>
</entry>
<entry>
<title>fix(mako): Super+Shift+n also clears history from pending count</title>
<updated>2026-05-13T12:43:37Z</updated>
<author>
<name>sommerfeld</name>
<email>sommerfeld@sommerfeld.dev</email>
</author>
<published>2026-05-13T12:43:37Z</published>
<link rel='alternate' type='text/html' href='https://git.sommerfeld.dev/dotfiles/commit/?id=f726a9afa6ba815ac8b5f4ce94a6295e74ff3980'/>
<id>urn:sha1:f726a9afa6ba815ac8b5f4ce94a6295e74ff3980</id>
<content type='text'>
dismiss-visible.sh's 'all' mode previously only recorded visible
notification ids and ran 'makoctl dismiss --all'. Notifications already
in mako's history (auto-expired) still counted as pending in waybar's
mako-status. Now also append history ids to the dismissed state file so
the pending counter actually drops to zero.
</content>
</entry>
<entry>
<title>fix(sudoers-rs,waybar): pass DIFFPROG (and friends) through sudo-rs</title>
<updated>2026-05-13T12:43:36Z</updated>
<author>
<name>sommerfeld</name>
<email>sommerfeld@sommerfeld.dev</email>
</author>
<published>2026-05-13T12:43:36Z</published>
<link rel='alternate' type='text/html' href='https://git.sommerfeld.dev/dotfiles/commit/?id=767a54e48163ea0db701c926e6bf69f2237fce33'/>
<id>urn:sha1:767a54e48163ea0db701c926e6bf69f2237fce33</id>
<content type='text'>
The previous fix sidestepped sudo-rs's env scrubbing by setting
DIFFPROG inside a nested root shell. That works but it's the wrong
shape — every command that wants to honour a user UX env var would
have to do the same dance. Configure the policy once instead.

etc/sudoers-rs:
  Defaults env_keep += "DIFFPROG"
  Defaults env_keep += "EDITOR VISUAL SUDO_EDITOR GIT_EDITOR"
  Defaults env_keep += "PAGER MANPAGER GIT_PAGER SYSTEMD_PAGER"
  Defaults env_keep += "LESS LESSOPEN SYSTEMD_LESS"

env_keep is the unconditional pass-through list, so no '-E' is needed
on the call site — `DIFFPROG='nvim -d' sudo pacdiff` Just Works, same
as it does for `EDITOR=nvim sudo systemctl edit foo`,
`PAGER=less sudo journalctl …`, etc. None of these vars influence
privilege boundaries; they only configure user-facing program
behaviour, so widening env_keep to cover them carries no security
trade-off worth accounting for. The existing per-visudo env_keep
lines are kept for documentation value (they're now subsumed by the
global rule but make the intent explicit at the visudo call sites).

The waybar pacdiff click handler reverts to the canonical form
`DIFFPROG='nvim -d' sudo pacdiff`, matching the recipe pacman.git
ships in /usr/share/doc/pacman/.

Will take effect after the next `chezmoi apply` redeploys
/etc/sudoers-rs (the run_onchange_after_deploy-etc.sh.tmpl script
re-installs it with mode 0440 whenever its hash changes).
</content>
</entry>
<entry>
<title>fix(waybar): pacdiff click — set DIFFPROG inside the root shell</title>
<updated>2026-05-13T12:43:36Z</updated>
<author>
<name>sommerfeld</name>
<email>sommerfeld@sommerfeld.dev</email>
</author>
<published>2026-05-13T12:43:36Z</published>
<link rel='alternate' type='text/html' href='https://git.sommerfeld.dev/dotfiles/commit/?id=1238e4dfc33bc4347564350bbfadac50aa8da0cd'/>
<id>urn:sha1:1238e4dfc33bc4347564350bbfadac50aa8da0cd</id>
<content type='text'>
sudo-rs scrubs the env by default, so neither `DIFFPROG=… sudo pacdiff`
nor `sudo DIFFPROG=… pacdiff` reaches pacdiff with the variable set.
Sidestep the env-policy question entirely by running

  sudo sh -c 'DIFFPROG="nvim -d" pacdiff'

so the assignment happens inside the privileged shell, after the
env-scrubbing boundary. No sudoers-rs change required, and the same
form works identically under stock sudo if the user ever switches
back.
</content>
</entry>
<entry>
<title>feat(waybar,systemd-units): wire up new system-health modules and timers</title>
<updated>2026-05-13T12:43:36Z</updated>
<author>
<name>sommerfeld</name>
<email>sommerfeld@sommerfeld.dev</email>
</author>
<published>2026-05-13T12:43:36Z</published>
<link rel='alternate' type='text/html' href='https://git.sommerfeld.dev/dotfiles/commit/?id=f685f20f7a41e6b5c4d56e46a9c8fba7c3287a68'/>
<id>urn:sha1:f685f20f7a41e6b5c4d56e46a9c8fba7c3287a68</id>
<content type='text'>
Bar layout: insert the four new modules between custom/update and
custom/thunderbird so that all 'something needs your attention'
indicators live as a contiguous group on the right side, in roughly
escalating actionability:

  custom/notifications  -- mako history (always present, gray baseline)
  custom/update         -- '`just update` was N hours/days ago'
  custom/pacdiff        -- '.pacnew/.pacsave waiting'
  custom/arch-audit     -- 'fixable CVE in installed package'
  custom/failed-units   -- 'systemd unit failed'
  custom/lostfiles      -- 'unowned files under tracked dirs'
  custom/thunderbird    -- 'unread mail'

Click handlers all use the floating-ghostty + 'press enter to close'
idiom established by the existing update module so output stays
inspectable. arch-audit and lostfiles open their /run report in
`nvim -R` (read-only) since the source of truth lives in those files.

style.css: extend the shared 6px-padding selector list, the .fresh
zero-padding rule (so empty-state modules disappear cleanly), and add
.warn/.critical color rules consistent with the rest of the palette
(yellow #fabd2f for 'review when convenient', red #fb4934 for 'review
soon').

systemd-units/system.txt: enable the three new system timers
  - btrfs-balance@-.timer  (monthly partial balance on /)
  - arch-audit.timer       (daily CVE report refresh)
  - lostfiles.timer        (weekly unowned-files report refresh)

Picked up automatically on the next `just unit-apply`.
</content>
</entry>
</feed>
