aboutsummaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
* feat(install): add uv to the Python tooling setCraig Jennings11 days1-0/+1
| | | | Fresh installs were skipping uv, so PEP 723 inline-script shebangs (#!/usr/bin/env -S uv run --script) failed with env: uv: No such file or directory. ratio and velox had it hand-installed.
* chore(todo): file the waybar theme-CSS drift taskCraig Jennings11 days1-0/+8
|
* chore(todo): file and close the mic-mute toggle taskCraig Jennings11 days1-0/+17
|
* chore(todo): tag the ratio-local visual tweaks soloCraig Jennings12 days1-2/+2
| | | | Add :solo: to the waybar even-spacing and Chrome dupre-theme tasks. Both are ratio-local and objectively verifiable (measure the gaps, confirm the palette hex values), with the eyeball confirmation handed off as a manual-testing reminder. Velox-only or design-call visual tasks stay off.
* chore(todo): tag the security-dashboard task soloCraig Jennings12 days1-1/+1
| | | | Add :solo: to the security-dashboard command task. It's buildable and locally verifiable against known system state with no upfront decision, so it meets the clarified solo bar.
* chore(todo): tag solo-able tasksCraig Jennings12 days1-6/+6
| | | | Tag six tasks :solo: (finishable end to end with no input, verifiable locally): the airplane-mode robustness follow-ups, the signal-cli and uv install additions, the Phase-2 VM verify, and the two automate-X scripts (usage tracking, dotfile validation). Kept :solo: off anything needing a design call, visual confirmation, laptop-only hardware, or sign-off.
* chore(todo): file three waybar feature tasksCraig Jennings12 days1-0/+55
| | | | File three [#B] waybar tasks: collapsible bar sides (an arrow click shrinks either side to a base set), an nmcli-backed network-manager dropdown with optional GPG-encrypted secrets, and a desktop-settings dropdown gathering the dim, brightness, touchpad, airplane, and idle toggles and sliders.
* chore(todo): scope wlogout square-button task to per-host, add a testCraig Jennings12 days1-2/+4
| | | | The wlogout buttons render square on ratio but rectangular on velox, so it's a resolution difference, not a flat bug. Note that, require a regression test so the square-cell fix holds across both hosts' resolutions, and drop :quick: since the cross-host test is more than a spare-moment change.
* chore(todo): re-grade open-source-release to B, sleep/suspend to CCraig Jennings12 days1-10/+12
| | | | Re-grade the open-source-release epic to [#B] and drop its stale 2026-05-21 schedule (the date had long passed, and an undated B is the honest state). Re-grade sleep/suspend to [#C]. Tag the mpd playlist-split task :quick:. Refresh the review dates on the oldest-unreviewed batch.
* chore(todo): close dotfiles-separation, file mesa/hyprland update guardCraig Jennings12 days1-22/+28
| | | | | | | | Mark the dotfiles-separation epic DONE. Phases 1-3.2 shipped and ratio's stale dotfiles symlinks are cleaned up. Promote its two open follow-ups (per-host override, Phase-2 VM verify) to standalone [#B] tasks. Close the claude-code-optional and input-validation items as shipped. Note that six open-source-release sub-tasks now target the dotfiles repo after Phase 3.2 moved that tree out. File a [#B] guard against a live mesa/hyprland/wayland-runtime -Syu crashing the compositor.
* chore(todo): file mpd playlist-directory reorg taskCraig Jennings2026-06-031-0/+5
|
* chore(todo): close Phase 3.2 dotfiles tasks, file ratio pull-downCraig Jennings2026-06-021-5/+15
|
* refactor: drop in-repo dotfiles/, move stow tooling to the dotfiles repoCraig Jennings2026-06-02847-837480/+78
| | | | | | | | 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 && 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.
* chore(todo): file dotfiles unit-test migration taskCraig Jennings2026-06-021-0/+5
|
* docs: note that Tailscale traffic traverses ufw on ratioCraig Jennings2026-05-311-0/+1
|
* chore(todo): fix markdown-bold line flagged as misplaced headingCraig Jennings2026-05-311-1/+1
|
* feat(firewall): open mosh UDP port range in ufw rulesCraig Jennings2026-05-311-0/+2
| | | | archsetup installs mosh, but the ufw rule list never opened its UDP range. A fresh install or rerun leaves incoming mosh blocked until the port is added by hand. I added 60000:61000/udp to the declarative rule loop so the firewall config reproduces a working mosh setup on rebuild.
* chore(todo): file local-llm and uv install tasks; process inboxCraig Jennings2026-05-295-0/+232
| | | | Filed two new [#B] parent tasks. The local offline LLM runtime task carries design-decision and implementation children for resolving the open design questions alongside implementation work. The uv install task matches the existing eask/signal-cli tooling-codification shape — load-bearing for other projects, manually installed today, codify so fresh installs pick it up. Four cross-project handoffs moved to outbox.
* chore(todo): close dim-inactive task and archive resolved workCraig Jennings2026-05-271-55/+43
| | | | I closed the Hyprland dim-inactive task. The config itself shipped in the dotfiles repo. The cleanup pass archived five resolved subtrees into Resolved and bumped the per-machine-override task to [#A].
* chore: file processed eask and signal-cli handoffs to outboxCraig Jennings2026-05-262-0/+85
|
* fix(archsetup): remove the cpupower setup, wrong for this hardwareCraig Jennings2026-05-262-15/+4
| | | | | | I added cpupower earlier this session, VM-verified it, then realized it's the wrong tool here. Both my machines run active-mode pstate drivers (the desktop on amd-pstate-epp, the laptop on intel_pstate), where the only governors are performance and powersave and the driver scales frequency itself via EPP. Both already sit on powersave, which is the recommended adaptive mode, not "slow." cpupower's governor-forcing only helps older acpi-cpufreq systems, which I don't run. Forcing performance would pin max clocks: worse battery on the laptop, pointless heat on the desktop. So I dropped the cpupower step rather than ship a backwards default. The cpufreq drivers self-manage with no help from us.
* chore(todo): log eask, signal-cli, and dim-inactive tasksCraig Jennings2026-05-261-0/+37
| | | | Three task additions from this session: provision Eask in archsetup (linear-emacs handoff), add signal-cli to the standard install (.emacs.d handoff), and investigate dimming inactive Hyprland windows.
* fix(archsetup): write the cpupower config instead of editing a missing fileCraig Jennings2026-05-261-6/+8
| | | | | | A VM test caught my cpupower step failing with sed exit 2: the cpupower package no longer ships /etc/default/cpupower, so there was nothing to edit. The step was non-fatal, so the install carried on, but the governor never got set. I now write the file fresh with printf, which creates it whether or not one exists. The governor stays performance for the reasons in the surrounding comment.
* fix(archsetup): stop yay hanging on its diff prompt during unattended installsCraig Jennings2026-05-261-1/+5
| | | | | | A VM test run hung for 80 minutes and timed out. yay was blocking on "Diffs to show?" for an AUR package whose build files already existed, waiting for input that never comes in a headless install. --noconfirm doesn't cover yay's diff and clean menus. I added --answerdiff None --answerclean None to the yay call in aur_install: show no diffs, don't clean, proceed. This is the right answer for an unattended run and matches the --noconfirm posture already in place. It likely explains the recurring 90-minute VM-test timeouts that read like slow AUR builds.
* chore(todo): close the moot eval task and the already-done rustup taskCraig Jennings2026-05-261-3/+6
| | | | Both were stale. The eval task pointed at a line-434 eval that no longer exists. The only eval left is in retry_install, and it's the deliberate one that captures the exit code directly, so there's nothing to replace. The rustup task was already implemented (rustup install plus rustup default stable in the languages section). It just predated that work.
* feat(archsetup): set a CPU governor with cpupowerCraig Jennings2026-05-261-0/+12
| | | | | | I added cpupower to the Power section: install it, set the governor in /etc/default/cpupower, and enable cpupower.service so the governor applies at boot. The governor is performance. It's the one value valid under every cpufreq driver. amd_pstate and intel_pstate in active mode accept only performance or powersave, while passive and acpi-cpufreq also allow schedutil and ondemand. Laptops want powersave, so that's a per-host override to layer on later. The enable is non-fatal, matching the rest of the Power section.
* feat(archsetup): make the claude-code install optionalCraig Jennings2026-05-262-4/+32
| | | | The claude-code step is a curl|sh from a third party, and not every user wants AI tooling. I put it behind INSTALL_CLAUDE_CODE (default yes, so current behavior is unchanged), with matching --claude-code / --no-claude-code flags. I wired it the same way as AUTOLOGIN and NO_GPU_DRIVERS: config mapping, a validate_config yes/no check, and a guard around the install block. I also documented the key in archsetup.conf.example.
* fix(archsetup): give git_install the same retry logic as pacman/aurCraig Jennings2026-05-261-9/+28
| | | | | | pacman_install and aur_install retry up to MAX_INSTALL_RETRIES. git_install only retried the clone once and never the build. I folded it into the same retry loop: it cleans the build dir between attempts and runs clone && make-install as one command list, so the captured exit code is the real failure rather than the if-statement's status (the trap retry_install documents). One behavior change: a build that fails every attempt now warns and continues instead of being fatal on the re-clone path. That matches how pacman and aur failures are handled, so one source build that won't compile no longer aborts the whole install. It surfaces in the error summary instead.
* docs: add per-host override spec and backlog tasksCraig Jennings2026-05-262-4/+260
| | | | | | I added a spec for a per-machine override mechanism (docs/PLAN-per-host-overrides.org). It proposes per-host stow tiers keyed on hostname, with the existing conf.d glob as the first tenant, so HiDPI scaling can differ between ratio and velox without per-app patches. It's gated on review. I also updated the task list: added a pocketbook development backlog and a waybar timer module task, fleshed out the per-host task with a spec link, and rewrote the stale velox "pocketbook not installed" review item as a dated entry now that nothing installs it.
* refactor: fold pocketbook in-tree and drop its install stepsCraig Jennings2026-05-2620-3/+1054
| | | | | | Pocketbook is nowhere near ready, so I pulled it back from publication: deleted the github mirror and the cjennings.net repo, removed the server mirror hook, and copied the package into pocketbook/ here until it's ready to spin back out. Dropped the steps that provisioned it on a fresh install: the gtk4-layer-shell dep and the pip install in archsetup, and the clone in post-install.sh. That clone pointed at the now-deleted github repo, so it would have failed a fresh run regardless. Re-wiring the install is tracked in the pocketbook backlog.
* chore: log dotfiles-separation progress and file processed handoffsCraig Jennings2026-05-235-0/+193
|
* fix(testing): expect ~/.dotfiles symlink target in dotfiles validationCraig Jennings2026-05-221-2/+4
|
* docs(claude): correct velox/ratio desktop env (both run Hyprland)Craig Jennings2026-05-221-2/+3
|
* docs(claude): document the external dotfiles repo and migrationCraig Jennings2026-05-221-3/+41
| | | | | | Phase 2 moved the dotfiles into their own repo at git.cjennings.net/dotfiles.git, so a fresh install clones DOTFILES_REPO to ~/.dotfiles and stows per DESKTOP_ENV. I documented that, the DOTFILES_REPO/BRANCH/DIR config keys, the DOTFILES= Makefile override, the post-install pull-and-restow flow, and the steps to migrate an existing machine off the in-repo dotfiles/. The migration note calls out quitting Hyprland first: unstowing while it runs makes it write a stub hyprland.conf into the gap, which blocks the restow. The in-repo dotfiles/ stays until ratio and velox migrate, then it gets removed.
* refactor(testing): clone the dotfiles repo into the VM testCraig Jennings2026-05-222-1/+32
| | | | The dotfiles live in a separate repo now, so the VM test clones that source, bundles it, and clones from the bundle into /tmp/dotfiles-test on the VM. archsetup's in-VM clone of DOTFILES_REPO then resolves against the local path with no network. DOTFILES_SOURCE overrides the source for testing a local checkout instead of the published repo. The cleanup trap tracks the host-side bundle and clone, so a mid-run abort leaves nothing behind.
* feat(archsetup): clone dotfiles repo and stow per DESKTOP_ENVCraig Jennings2026-05-222-33/+84
| | | | | | Dotfiles now live in their own repo (git.cjennings.net/dotfiles.git), so archsetup clones DOTFILES_REPO to the user's ~/.dotfiles and stows the right tree for the chosen DESKTOP_ENV: dwm and hyprland get common/ plus their own layer, none gets the standalone minimal/ tree. The clone runs as the target user, so the working tree is user-owned with no chown-after race. Add DOTFILES_REPO / DOTFILES_BRANCH / DOTFILES_DIR config keys with the same injection guard the other repo keys carry. If the clone doesn't produce a git checkout, error_fatal stops the install rather than silently skipping the restore step that reverts what stow --adopt pulled in. That restore now runs for every DESKTOP_ENV, including none — minimal/ ships the .bashrc/.bash_profile that collide with /etc/skel, so its --adopt needs the same cleanup.
* docs(plan): use SSH push URL and add claude.sh to minimal treeCraig Jennings2026-05-221-2/+6
|
* chore: tag sub-30-minute tasks with :quick:Craig Jennings2026-05-211-18/+18
| | | | I walked the open work and tagged 18 tasks finishable in 30 minutes or less — CSS spacing tweaks, single-file archsetup edits, gitignore-and-untrack cleanups, and config-flag gates. The tag filters the agenda down to quick wins.
* chore: cancel obsolete X11 VT-switch task, demote 6 undated A's to BCraig Jennings2026-05-211-9/+180
| | | | | | | | The priority scheme requires an [#A] to carry a date. Six were undated aspirational backlog with no active work — the CI/CD pipeline, recovery-script generation, the package-inventory trio (inventory system, monthly review, automated comparison), and security education — so I dropped them to [#B]. I cancelled "Prevent X termination and VT switching." Its whole approach is xorg.conf.d with DontVTSwitch and DontZap, dead now that these machines run pure Wayland with no XWayland. I also recorded today's review date on the open tasks I walked.
* feat(notify): add --silent flag, volume knob, and level sound filesCraig Jennings2026-05-2112-10/+271
| | | | | | | | 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.
* chore: log UI follow-up bugs and ignore dated secret backupsCraig Jennings2026-05-212-56/+61
| | | | I logged three follow-ups: uneven waybar indicator spacing, airplane-mode toggle hardening (a laptop guard and a brightness fallback), and rectangular wlogout exit-menu buttons. I also moved the finished touchpad and airplane-mode entries into the resolved section, and added a gitignore rule so dated .bak backups stay on disk but out of git.
* feat(hyprland): add airplane-mode waybar toggleCraig Jennings2026-05-217-0/+652
| | | | | | | | 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.
* feat(authinfo): add calendar feed URLs for calendar-syncCraig Jennings2026-05-211-0/+0
| | | | The .ics feed URLs are secret tokens, so I keep them in the encrypted store instead of a plaintext config. Emacs calendar-sync looks them up at sync time through auth-source on the calendar-google, calendar-proton, and calendar-deepsat hosts. They travel across machines now with the rest of authinfo.
* chore(btop): sync config to v1.4.7 defaultsCraig Jennings2026-05-201-2/+16
|
* feat(hyprland): rebind monitor to Super+R, touchpad toggle to Super+MCraig Jennings2026-05-201-3/+3
| | | | Super+M now toggles the touchpad (M for Mouse), and the monitor scratchpad moves to Super+R (R for Resources, since btop is a resource monitor). The touchpad toggle was on Super+F9, which is now free. Super+Shift+M still switches to the monocle layout.
* chore: document a priority scheme and close two tasks in todo.orgCraig Jennings2026-05-201-5/+70
| | | | | | I added an A/B/C/D priority scheme to the task list: what each level means, the assignment criteria, and the rule that an [#A] task needs a scheduled or deadline date so priorities stay grounded in time. I also closed two finished tasks: the rm -rf path guard (done, with a pointer to the safe_rm_rf helper and its tests) and the touchpad toggle indicator (spec, implementation, and deploy record).
* feat(hyprland): add touchpad state indicator to waybarCraig Jennings2026-05-207-0/+212
| | | | | | | | 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.
* fix(installer): guard constructed-path rm -rf deletesCraig Jennings2026-05-202-3/+229
| | | | | | | | Three rm -rf sites in archsetup delete paths built from variables: $state_dir for --fresh, and $source_dir/$prog_name for the git and AUR clone-retry cleanups. If a path variable were empty or malformed (preflight skipped, a degenerate git URL), the delete could expand to a top-level or otherwise unintended directory. I added a safe_rm_rf <path> <allowed_prefix> helper that refuses to run unless the target is absolute, free of '..', deeper than a bare top-level dir, strictly inside the allowed prefix, and a real directory rather than a symlink. On the happy path it delegates to rm -rf, so successful installs are unchanged. The helper is self-contained and defined before the top-level --fresh handler, which runs before the logging helpers exist. I covered the guard with unit tests under tests/safe-rm-rf/ that source the real function and exercise normal, boundary, and error cases against temp directories.
* chore: clean dead todo.org doc-links and file three docs to outboxCraig Jennings2026-05-204-6/+190
| | | | | | I removed three dead `file:` links in todo.org. They pointed at docs that were never written: testing-strategy.org, firmware-cleanup.org, and PLAN-browser-themes.org. Each task body already carries that content inline, so the links were dead weight. I also reworded the Testinfra task's lead-in that claimed the testing-strategy doc exists. I filed three resolved reference docs into assets/outbox/: the calendar-sync scrub note, the tmux copy-mode handoff, and the 2026-05-19 lint follow-up report.
* chore: log the calendar-secret scrub and queue URL rotationCraig Jennings2026-05-201-11/+21
| | | | Recorded the git-history scrub of the private calendar config and added a follow-up to rotate the three exposed feed URLs once I'm at ratio's GUI. Also closed the testing-docs and shellcheck tasks that shipped this round.