summaryrefslogtreecommitdiffstatshomepage
Commit message (Collapse)AuthorAgeFilesLines
...
* feat(etc): template kernel cmdline, derive LUKS UUID from partition namesommerfeld2026-05-135-8/+48
| | | | | | | | | | | | | | | | | Prompt once at 'chezmoi init' time for the LUKS root partition (e.g. nvme0n1p2) and store it under [data].luksRootPartition in the per-machine chezmoi config. etc/kernel/cmdline.tmpl resolves the UUID at apply time via lsblk, so reinstalls only require re-entering the partition name. The etc deploy script now renders *.tmpl sources through 'chezmoi execute-template' and installs them without the suffix. The resolved UUID is folded into the onchange hash so the script re-runs when the UUID changes even if etc/ content is unchanged. just etc-status/diff transparently handle .tmpl sources (strip suffix for the live-path mapping, render before diffing). etc-re-add skips .tmpl files since template sources can't be reverse-rendered from the live file.
* feat(chezmoi): persist sourceDir so bare chezmoi commands worksommerfeld2026-05-131-0/+2
| | | | | | Adds sourceDir = .chezmoi.sourceDir to the tracked config template. After 'just init' (or 'chezmoi init --force -S .') regenerates the per-machine config, 'chezmoi apply' etc. no longer need '-S .'.
* revert(sway): drop thunderbird autostartsommerfeld2026-05-131-1/+0
|
* feat(sway): size thunderbird scratchpad to fill workspacesommerfeld2026-05-131-1/+1
|
* fix(sway): use correct thunderbird app_id (org.mozilla.Thunderbird)sommerfeld2026-05-131-2/+2
|
* feat(sway): park thunderbird in scratchpad, toggle with Super+tsommerfeld2026-05-133-1/+17
| | | | | | | | Autostart thunderbird on sway launch; window rule parks it in the scratchpad immediately so it runs in the background firing mako notifications. Super+t toggles the window visible/hidden without quitting the app — works around the long-standing lack of native Linux tray support in Thunderbird.
* fix(thunderbird): disable start.thunderbird.net start pagesommerfeld2026-05-131-0/+3
|
* refactor(thunderbird): trim user.js to curated high-signal prefssommerfeld2026-05-131-65/+40
| | | | | | | | | | | | | Drop the hand-rolled kitchen-sink config in favour of a smaller set inspired by HorlogeSkynet/thunderbird-user.js. Removes prefs that were either restating Mozilla/Arch defaults (telemetry, app.update), Firefox-only (extensions.screenshots), or guessed/stale (mail.folder_widget.view_flags). Keeps: remote-image block, no read receipts, plain-text compose with format=flowed, no UA header leak, no Referer/prefetch, safe-browsing off, DNT on, system gpg-agent for OpenPGP, vertical pane, Monday calendar start.
* feat(thunderbird): track non-private config in dotfilessommerfeld2026-05-135-0/+108
| | | | | | | | | | | | | | | Mirror the firefox/ pattern for Thunderbird: - thunderbird/user.js: telemetry off, safe-browsing off, remote images blocked, read receipts disabled, plain-text compose with flowed wrap at 72, vertical pane, calendar on Monday start - run_onchange_after_deploy-thunderbird.sh.tmpl: detects default profile and copies tracked files in on any change - meta/mail.txt: add thunderbird package (official repo) - .chezmoiignore: exclude thunderbird/ from $HOME deployment - README: mention Thunderbird + Bridge + Radicale stack Accounts/credentials/mailbox data stay local per profile.
* refactor(mail): use packaged protonmail-bridge.service, drop-in for passsommerfeld2026-05-132-14/+2
| | | | | | Arch's protonmail-bridge-core ships /usr/lib/systemd/user/protonmail-bridge.service with proper hardening. Replace custom unit with a minimal drop-in to inject PASSWORD_STORE_DIR for the pass keychain backend.
* fix(mail): switch to extra/protonmail-bridge-core (paid account)sommerfeld2026-05-131-1/+1
|
* fix(mail): rename protonmail-bridge-nogui to protonmail-bridge-free-coresommerfeld2026-05-131-1/+1
| | | | | | The nogui variant was deleted from the AUR; the maintained headless package is now protonmail-bridge-free-core (same /usr/bin/protonmail-bridge binary, just no Qt GUI components).
* chore(systemd): drop stale bridge.service.d overridesommerfeld2026-05-131-2/+0
|
* refactor(mail): drop TUI stack, add headless proton-bridgesommerfeld2026-05-138-224/+16
| | | | | | | | | Remove aerc, khal, khard, vdirsyncer from meta/mail.txt and delete their configs (aerc/, vdirsyncer systemd override, aerc .desktop handler). Point linkhandler mailto at xdg-open until a GUI client is set up. Add systemd user unit for protonmail-bridge --noninteractive, tied to graphical-session.target so it starts with the sway session.
* feat(sway): add Super+z QR mode (w=write, r=read)sommerfeld2026-05-132-0/+11
|
* fix(ghostty): restore default jump_to_prompt bindssommerfeld2026-05-132-8/+0
| | | | | | | Ctrl+Shift+PageUp/Down are ghostty's default jump_to_prompt binds on Linux, not tab/split binds — they were mislabeled and unbound by mistake. Restoring the defaults also reverts the Ctrl+Alt+Up/Down attempt that never reached ghostty (swallowed before the terminal).
* feat(ghostty): bind Ctrl-Alt-Up/Down to jump_to_promptsommerfeld2026-05-132-0/+5
| | | | | | | Requires OSC 133 markers from ghostty's zsh shell integration. Ctrl+Alt+arrow avoids conflicts with letter chords in zsh/nvim and the already-used Ctrl+Shift+Up/Down scroll binds. Only works outside zellij since zellij consumes the PTY and never forwards OSC 133.
* fix(zsh): preserve newlines in copy-last-outputsommerfeld2026-05-131-1/+1
| | | | | Double-quoting a zsh array slice joins elements with spaces; use the (F) parameter expansion flag to join with newlines instead.
* feat(zsh): add Alt-Shift-Y widget to copy last command outputsommerfeld2026-05-132-0/+40
| | | | | | | | | | | | Zellij has no native "copy last command output" feature, and ghostty's jump_to_prompt (Ctrl+Shift+J/K, via OSC 133) can't work inside zellij because zellij sits between the shell and the terminal emulator. Build it ourselves: a zle widget runs 'zellij action dump-screen --full', finds the last two lines matching the prompt prefix (user@host:), and pipes everything between them to wl-copy. Bound to Alt+Shift+Y. Requires running inside zellij and at least two prompts in the scrollback.
* feat(zsh): add wlc — tee-like wrapper around wl-copysommerfeld2026-05-131-0/+4
| | | | | wlc pipes stdin to stdout (visible) AND to wl-copy (clipboard). Usage: `somecmd | wlc`
* fix(nvim): drop overseer task-bundle integration from auto-sessionsommerfeld2026-05-131-29/+3
| | | | | | | | | | | overseer.nvim removed save/load_task_bundle in the "task bundles get the axe" refactor, which caused auto-session to error on every session restore: /lua/plugins/session.lua:27: attempt to call field 'load_task_bundle' (a nil value) Remove the pre_save/pre_restore/post_restore hooks that called the removed API. DAP breakpoint save/restore via save_extra_data is preserved.
* style(zellij): hide tips line by sizing status-bar pane to 1sommerfeld2026-05-131-1/+1
|
* style(zellij): status-bar at top, tab-bar at bottomsommerfeld2026-05-131-4/+4
|
* style(zellij): move tab-bar and status-bar to the topsommerfeld2026-05-131-4/+4
|
* feat(zellij): relocate mode-entry keys to Alt+Shift+* to stop shadowing ↵sommerfeld2026-05-132-0/+23
| | | | | | | | | | | | | | | | | | | | | | | | shell/nvim Zellij's default Ctrl+* mode-entry keys (Ctrl+p/t/r/s/o/g/b/q) were intercepted before reaching the inner shell/editor, shadowing zsh fzf bindings (Ctrl+t), history navigation (Ctrl+p/n), nvim jumps (Ctrl+o), save (Ctrl+s), etc. Unbind all conflicting Ctrl+* entries and relocate mode-entry to Alt+Shift+<first-letter-of-mode>: Alt+Shift+P Pane Alt+Shift+T Tab Alt+Shift+R Resize Alt+Shift+S Scroll Alt+Shift+O Session Alt+Shift+Z Locked (Z avoids Treewalker Alt+Shift+h/j/k/l swap) Alt+Shift+Q Quit TMUX-compat mode dropped. Only Ctrl+h/j/k/l remain bound in zellij (for vim-zellij-navigator); every other Ctrl+* now passes through. Requires fresh zellij session (kill-all-sessions -y) to take effect.
* feat(zellij): move tab-bar to bottom via custom default layoutsommerfeld2026-05-131-0/+13
|
* feat(zellij): restore full status bar, bind Alt+\ to cycle swap layoutssommerfeld2026-05-132-2/+6
|
* feat(xdg): disable xdg-user-dirs-update overwritessommerfeld2026-05-131-0/+1
| | | | | | xdg-user-dirs-update runs on login and rewrites user-dirs.dirs with localized defaults, clobbering the custom short paths. enabled=False in user-dirs.conf is the official opt-out.
* feat(getty): blank VT and powerdown monitor on idlesommerfeld2026-05-131-0/+2
| | | | | setterm only affects the Linux console (TERM=linux); sway's KMS/DRM session is unaffected. Wakes on any keypress.
* feat(zsh): add reload-env for stale zellij panessommerfeld2026-05-131-0/+22
| | | | | | | Re-exports WAYLAND_DISPLAY, SWAYSOCK, DBUS, SSH_AUTH_SOCK etc. from the currently running sway process, so a zellij pane whose server was started in a different session (SSH-attached, logout/login, etc.) regains working GUI/clipboard/systemctl --user.
* feat(sway): cursor theme + GTK4 dark mode via gsettingssommerfeld2026-05-131-0/+4
| | | | | | | | | | | - seat * xcursor_theme Adwaita 24: announces the cursor via cursor-shape-v1 for Wayland clients and exports XCURSOR_THEME/SIZE to Xwayland, so Xwayland GTK apps no longer fall back to the bitmap X cursor. - exec gsettings color-scheme prefer-dark: GTK4 ignores the settings.ini gtk-application-prefer-dark-theme key (GTK3 only); it reads the gnome color-scheme gsetting. This fixes light-mode GTK4 apps (gnome calculator, nautilus, modern GNOME apps).
* feat(wayland): tune Qt/SDL/Electron backendssommerfeld2026-05-133-1/+14
| | | | | | | | | | | - zprofile: set QT_QPA_PLATFORM="wayland;xcb" (xcb fallback for bundled Qt), SDL_VIDEODRIVER="wayland,x11" (SDL2 defaults to X11). Drop MOZ_ENABLE_WAYLAND (Firefox 121+ default). - meta/wayland: add qt5-wayland and qt6-wayland so QT_QPA_PLATFORM=wayland actually resolves. - electron-flags.conf: global --ozone-platform=wayland, Wayland window decorations, GTK4. Applies to all apps using the Arch electron wrapper. Bundled-electron apps (slack-desktop, etc.) unaffected.
* refactor(sway): manage swayidle as a user unit; drop logind overridesommerfeld2026-05-134-65/+20
| | | | | | | | | | | | | - New dot_config/systemd/user/swayidle.service, pulled in by sway-session.target alongside mako/display-watcher/poweralertd. Same lifetime as the rest of the session: starts after graphical-session, restarts on failure, stops on logout. - Drop the swayidle exec from sway config (was unmanaged background process with no restart, no logging hookup). - Revert etc/systemd/logind.conf overrides: swayidle handles idle-lock directly via Wayland ext-idle-notifier, so the logind IdleAction belt-and-suspenders is redundant. Run just etc-reset /etc/systemd/logind.conf on the host to restore pristine.
* fix(sway): swaylock -e (ignore-empty), not -i (which is --image)sommerfeld2026-05-131-3/+3
|
* feat(sway): auto-lock on idle and before suspendsommerfeld2026-05-133-1/+66
| | | | | | | | | | | - logind: IdleAction=lock, IdleActionSec=5min. systemd emits a lock signal at 5min idle (session becomes locked from logind PoV; swayidle listens and invokes swaylock). - swayidle: lock at 5min, blank display at 6min, lock before sleep. Closes the gap where lid-close or manual suspend would wake to an unlocked session. - swaylock: add -i (--ignore-empty-password) to ignore accidental Enter. - meta/wayland: add swayidle.
* refactor(etc): keep mkinitcpio.conf closer to Arch pristinesommerfeld2026-05-131-1/+1
| | | | | | Arch already ships systemd-based HOOKS as default; only add sd-encrypt. keymap is redundant with sd-vconsole but harmless, and keeping it minimizes diff from upstream (one word changed).
* feat(boot): switch to systemd initramfs + rd.luks.name cmdlinesommerfeld2026-05-132-2/+2
| | | | | | | | | Prerequisite for TPM2 LUKS unlock. systemd-cryptenroll stores TPM hints in LUKS2 token metadata, so no cmdline options are needed beyond rd.luks.name (sd-encrypt auto-discovers enrolled tokens). After chezmoi apply: sudo mkinitcpio -P && sudo sbctl verify, then reboot. Passphrase still works; TPM enrollment is a separate step.
* refactor(etc): drop marginal UPower percentage overridessommerfeld2026-05-131-3/+3
| | | | | | Only CriticalPowerAction=PowerOff is a behaviorally meaningful change vs pristine. Percentage tweaks (15/7/3 vs 20/5/2) are not worth the drift.
* refactor(etc): re-sync reflector.conf against pristine; VPN-aware countriessommerfeld2026-05-131-3/+26
| | | | | | | - Drop ES/PT from country list (always-on VPN exits in Zurich; Iberian mirrors are slow through that path). - Replace --latest 5 + --sort age with --age 12 + --fastest 10 + --threads 5 (real throughput benchmark over 5 parallel probes).
* refactor(etc): re-sync UPower.conf against pristinesommerfeld2026-05-131-4/+107
| | | | | No behavior change; only the four overrides (PercentageLow/Critical/ Action, CriticalPowerAction=PowerOff) differ from upstream defaults.
* feat(etc): relax faillock (deny=50, unlock_time=30)sommerfeld2026-05-131-0/+64
| | | | | | Single-user laptop behind FDE with key-only SSH means local brute force is not a realistic threat. Tight defaults (3 attempts, 10min lock) mainly punish typos.
* feat(etc): cap user systemd stop timeout at 10ssommerfeld2026-05-131-0/+3
| | | | | | User scopes (e.g. ghostty surface containing zellij) inherit timeouts from the user manager, not /etc/systemd/system.conf.d. Without this, zellij sessions stall reboot for 90s before SIGKILL.
* fix(just): unit-status handles template instances and static unitssommerfeld2026-05-133-2/+12
| | | | | | | | - use systemctl is-enabled per curated unit (list-unit-files does not show instantiated template units like btrfs-scrub@-.timer) - accept static/indirect/generated/alias states in addition to enabled - drop pkgstats.timer from curated (no [Install] section) - ignore systemd-oomd.socket (distro default)
* chore(meta): add fwupd, smartmontools; enable oomd, smartd, btrfs-scrub, ↵sommerfeld2026-05-132-1/+6
| | | | fwupd-refresh; drop fstrim.timer
* fix(nvim): use print() in update.lua to satisfy selenesommerfeld2026-05-131-8/+3
| | | | | selene's neovim stdlib doesn't expose io.stdout:write/:flush. print() goes to the same place in headless mode and is already allowed.
* feat(just): add 'update' recipe — system + nvim plugins + masonsommerfeld2026-05-132-0/+62
| | | | | | | | | | | | | | | New recipes (new 'Updates' section after 'Day-to-day'): - update: pkg-update nvim-update - pkg-update: paru -Syu - nvim-update: nvim --headless +'lua require("config.update").run()' New dot_config/nvim/lua/config/update.lua drives the headless session: clean orphan plugins, vim.pack.update with force=true (skips the confirm buffer since this is unattended; changes still go to nvim-pack.log), then :MasonToolsUpdateSync — the blocking variant intended for headless Interactive :PackSync stays unchanged (confirm buffer remains visible for reviewed updates).
* refactor(nvim): keep PackUpdate confirm buffer visiblesommerfeld2026-05-131-11/+4
| | | | | | Auto-writing it defeated the purpose — no feedback on what changed. Now :PackUpdate and :PackSync show the confirm buffer; user reviews and :w to apply or :q to cancel. Matches vim.pack's intended UX.
* refactor(nvim): drop refactoring.nvimsommerfeld2026-05-133-36/+0
| | | | | | | | | Upstream broke itself today by adding require('async') without shipping lua/async.lua. I never use these mappings anyway. Removed the plugin spec, setup call, <leader>r* keymaps, and the which-key group entry. plenary.nvim stays — neogit still depends on it. Run :PackClean afterwards to prune the on-disk plugin.
* chore(nvim): stop tracking pack lockfilesommerfeld2026-05-132-222/+1
| | | | | | | | The seeded lockfile offered little value for a single-user setup: fresh bootstraps will resolve version specs at install time, and any meaningful pinning is already expressed in init.lua's vim.pack.add() specs. Added an explicit .chezmoiignore entry so the runtime file doesn't show up as drift.
* chore(nvim): seed pack lockfile with create_ prefixsommerfeld2026-05-131-0/+0
| | | | | | | The file is owned by vim.pack at runtime — tracking it causes constant chezmoi drift on every plugin update. The create_ prefix writes it once on fresh machines and leaves it alone after. Manually chezmoi re-add when you want to snapshot a known-good revision set.