<feed xmlns='http://www.w3.org/2005/Atom'>
<title>archsetup/dotfiles/hyprland/.local, branch main</title>
<subtitle>Builds a full dev workstation from a bare Arch Linux install.
</subtitle>
<id>https://git.cjennings.net/archsetup/atom?h=main</id>
<link rel='self' href='https://git.cjennings.net/archsetup/atom?h=main'/>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/'/>
<updated>2026-06-02T17:16:38+00:00</updated>
<entry>
<title>refactor: drop in-repo dotfiles/, move stow tooling to the dotfiles repo</title>
<updated>2026-06-02T17:16:38+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-02T17:16:38+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/commit/?id=b10cba594db836c0747066addad48bda4d30cd02'/>
<id>urn:sha1:b10cba594db836c0747066addad48bda4d30cd02</id>
<content type='text'>
Since the installer clones DOTFILES_REPO into ~/.dotfiles and stows from there, the in-repo dotfiles/ tree was dead weight. Nothing reads it at install time. I removed it (831 files) now that both machines are migrated.

The Makefile's stow / restow / reset / unstow / import targets and the dotfile-script unit suites moved to the dotfiles repo. They sit alongside the scripts they manage and run standalone (cd ~/.dotfiles &amp;&amp; make ...). This Makefile keeps the VM-integration targets and the installer-helper suite (safe-rm-rf).

I updated CLAUDE.md and README.md so stow operations run from ~/.dotfiles, and the dotfile-management, theme, and unit-test sections point at the standalone repo. The README was already describing the old in-repo model from before the installer switched to cloning. This brings it in line.
</content>
</entry>
<entry>
<title>feat(notify): add --silent flag, volume knob, and level sound files</title>
<updated>2026-05-22T00:16:34+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-22T00:16:34+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/commit/?id=f7079db3aa3e0073df6ce5409d4b6de0a431e26f'/>
<id>urn:sha1:f7079db3aa3e0073df6ce5409d4b6de0a431e26f</id>
<content type='text'>
The touchpad toggle's notification was too loud, and the eight notify sounds varied by ~13 dB in RMS loudness — bug and fail came out two to three times louder than info or security.

I added a --silent flag to notify (shows the popup, plays no sound) and a NOTIFY_VOLUME knob (paplay scale, default 65536) so the master level can drop without re-encoding. toggle-touchpad now passes --silent on both enable and disable. normalize-notify-sounds.sh measures each .ogg and shifts it to a uniform -31 dB mean. It writes through the file instead of mv-ing over it, so the stow symlinks survive when the script runs against the live sound dir. I re-encoded all eight sounds to the new level.

Tests: a new tests/notify suite (12 tests) covers --silent, the volume knob, flag composition, and the error paths.
</content>
</entry>
<entry>
<title>feat(hyprland): add airplane-mode waybar toggle</title>
<updated>2026-05-21T21:48:47+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-21T21:48:47+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/commit/?id=09f4d205fe463faf676f95e798d08e8bf498be96'/>
<id>urn:sha1:09f4d205fe463faf676f95e798d08e8bf498be96</id>
<content type='text'>
I added a laptop-only waybar button that drops the machine into a low-power state and restores it on a second click. Engaging turns wifi off, sets the CPU energy-performance preference to power, dims the backlight to 35%, and stops network-only services (tailscale, proton-vpn, avahi, cups, wsdd, geoclue, sshd, fail2ban, syncthing). Bluetooth is left alone so earbuds keep working.

Disengaging replays the state recorded when airplane mode was engaged rather than writing hardcoded defaults. A lever already in its low-power position is left untouched: wifi that was already off stays off, and a service that was already stopped isn't restarted.

The indicator hides itself on machines with no battery, so desktops never show the button. State lives in $XDG_RUNTIME_DIR/airplane-state, and the bar refreshes the moment the toggle fires via a realtime signal.
</content>
</entry>
<entry>
<title>feat(hyprland): add touchpad state indicator to waybar</title>
<updated>2026-05-21T01:55:13+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-21T01:55:13+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/commit/?id=62e45197bb4d440e002b731715343e565cf50ff3'/>
<id>urn:sha1:62e45197bb4d440e002b731715343e565cf50ff3</id>
<content type='text'>
The $mod+F9 toggle and the toggle-touchpad / touchpad-auto scripts already worked, but the scripts lived only in ~/.local/bin and were never committed, and there was no way to see the touchpad's state at a glance.

I committed both scripts into the repo so stow installs them, and added a waybar indicator: a waybar-touchpad status script and a custom/touchpad module that shows a mouse glyph when the touchpad is on and a mouse-off glyph (in the dupre orange) when it's off. The scripts signal the module with pkill -RTMIN+9 waybar after each state change, so the icon updates the moment the touchpad toggles. touchpad-auto now runs at login via exec-once.

The waybar-touchpad script has unit tests under tests/waybar-touchpad/ covering the enabled, disabled, and missing-state-file cases.
</content>
</entry>
<entry>
<title>fix(hyprland): Escape special workspace on navigate</title>
<updated>2026-04-24T12:36:47+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-04-24T12:36:47+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/commit/?id=5477bf4a366dd2038b144aa542ce3785f205f368'/>
<id>urn:sha1:5477bf4a366dd2038b144aa542ce3785f205f368</id>
<content type='text'>
When focus is inside a special workspace (e.g. special:stash),
layoutmsg cyclenext/cycleprev only operates within that workspace,
trapping $mod+J inside the scratchpad overlay.

Detect workspace name starting with "special:" on focus navigation
(not move), toggle the overlay off first, re-read active window
state, then fall through to the normal layout/floating branches.

Add unit tests with a fake hyprctl harness in
tests/layout-navigate/. ```
</content>
</entry>
<entry>
<title>feat: Zoom HiDPI scaling and Hyprland window rules</title>
<updated>2026-04-11T14:17:13+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-04-11T14:17:13+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/commit/?id=9a680c8c1ad722b7bd04b33c8e8466d36c28d2f3'/>
<id>urn:sha1:9a680c8c1ad722b7bd04b33c8e8466d36c28d2f3</id>
<content type='text'>
Add Zoom.desktop override with QT_SCALE_FACTOR=1.5 for HiDPI displays.
Float all Zoom windows and fix disappearing popup menus.
</content>
</entry>
<entry>
<title>fix(hyprland): escape floating window focus trap in layout-navigate</title>
<updated>2026-04-09T06:17:15+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-04-09T06:17:15+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/commit/?id=0e534357edd3ea85dfd96cc18fba3a9d13c56db6'/>
<id>urn:sha1:0e534357edd3ea85dfd96cc18fba3a9d13c56db6</id>
<content type='text'>
layoutmsg cyclenext only operates on tiled windows, so $mod+J was a
no-op when focus was on a floating/pinned scratchpad. Detect floating
state and use cyclenext dispatcher instead.
</content>
</entry>
<entry>
<title>feat: comprehensive mime type associations with emacsclient defaults</title>
<updated>2026-03-07T20:31:27+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-03-07T20:31:27+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/commit/?id=a2a2887288b767643aa2d9ae99ffd026be36bef1'/>
<id>urn:sha1:a2a2887288b767643aa2d9ae99ffd026be36bef1</id>
<content type='text'>
Merge all mime associations into mimeapps.list as single source of truth.
Set emacsclient as default for all text/code files. Add TypeScript mime
override, emacsclient.desktop with fixed Exec line, and simplify
resetmimetypes to just restow + rebuild caches.
</content>
</entry>
<entry>
<title>feat(hyprland): remove plugins, add layout cycling</title>
<updated>2026-03-07T20:03:02+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-03-07T20:03:02+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/commit/?id=4a3056a8b32cf67535ecd59b15068c80b8e01253'/>
<id>urn:sha1:4a3056a8b32cf67535ecd59b15068c80b8e01253</id>
<content type='text'>
Hyprland 0.54 brings scrolling and monocle layouts into core, making
hyprpm plugins unnecessary. Remove hyprland-plugins-setup, focus-restore,
hyprpm pacman hook, and allfloat keybinding. Add layout-cycle script and
$mod+Shift+Arrow keybindings to cycle master/scrolling/monocle. Move cpio
to System Utilities section.
</content>
</entry>
<entry>
<title>fix: update layout-resize and waybar-netspeed for 0.54</title>
<updated>2026-03-07T19:00:34+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-03-07T19:00:34+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/commit/?id=8b694a79afda88fc769a1c9ad61af77aa4104d6e'/>
<id>urn:sha1:8b694a79afda88fc769a1c9ad61af77aa4104d6e</id>
<content type='text'>
layout-resize: replace removed splitratio dispatcher with layoutmsg
mfact for master layout resizing.

waybar-netspeed: replace iwgetid/proc/net/wireless with iw commands
for SSID and signal strength (old tools no longer populated by kernel).
</content>
</entry>
</feed>
