summaryrefslogtreecommitdiffstatshomepage
Commit message (Collapse)AuthorAgeFilesLines
...
* fix(waybar): parse mako's plain-text list output directlysommerfeld2026-05-132-4/+13
| | | | | | --format is not supported by this mako version. Parse the native text output (Notification N: summary / App name: X) with awk for the picker and grep '^Notification ' for the counter.
* fix(waybar): use makoctl --format for text output, not JSON grepsommerfeld2026-05-132-10/+4
| | | | | | makoctl outputs plain text by default on this version. Use --format strings for both the history picker (%a/%s/%b) and the counter script (%i + wc), instead of trying to parse JSON that isn't there.
* fix(waybar): tolerant jq for mako history + bump max-history to 50sommerfeld2026-05-132-3/+7
| | | | | | | Previous jq path (.data[0][].summary.data) only works for one nesting shape of mako's history JSON. Recurse to find notification objects and unwrap dbus-typed {type,data} fields defensively. Also bump max-history from the default of 5 so more entries are retained.
* fix(sway): use read-only fuzzel history viewer for Super+Alt+nsommerfeld2026-05-133-2/+19
| | | | | | | makoctl menu only acts on currently-visible notifications, not history (mako has no API to re-invoke arbitrary history entries). Replace with a small script that pipes 'makoctl history' through jq and fuzzel, then copies the selected entry to the clipboard for reference.
* fix(sway): use -- separator so makoctl menu stops parsing sh flagssommerfeld2026-05-131-1/+1
|
* fix(sway): extract id from fuzzel line for makoctl menusommerfeld2026-05-131-1/+1
| | | | | | makoctl menu <cmd> expects the command to emit just the notification id, but fuzzel --dmenu echoes the full '<id> <summary>' line. Pipe through cut -d' ' -f1 so mako can act on the selection.
* feat(sway): keybinds to restore and browse mako notification historysommerfeld2026-05-132-0/+4
| | | | | - Super+Ctrl+n: makoctl restore (re-show the most recent dismissed) - Super+Alt+n: makoctl menu fuzzel --dmenu (pick any from history)
* style(waybar): move clock to the rightmost positionsommerfeld2026-05-131-1/+1
|
* style(waybar): label and color idle/privacy/notifications modulessommerfeld2026-05-133-5/+32
| | | | | | | | | The idle_inhibitor em-dash and bare mako '0' blended with the clock. - mako counter: prefix 'NTF', gray when empty, aqua for history, orange for pending. - idle_inhibitor: 'IDL'/'INH' with gray/yellow. - privacy: red (only visible when screensharing or mic-active). - Add padding rules so the new modules line up with the rest.
* fix(sway): wait for protonmail-bridge IMAP before launching thunderbirdsommerfeld2026-05-131-0/+11
| | | | | | | On cold boot Thunderbird would race protonmail-bridge and pop up a 'failed to login to 127.0.0.1' error. Poll 127.0.0.1:1143 (bridge's default IMAP port) for up to 15s before spawning TB. Gives up silently if the bridge doesn't come up.
* refactor(sway): manage waybar via systemd user servicesommerfeld2026-05-133-4/+18
| | | | | | | | Move waybar from sway's inline bar {} block to waybar.service pulled in by sway-session.target. Matches the pattern for mako, swayidle, poweralertd, display-watcher, cliphist. ExecReload sends SIGUSR2 so 'systemctl --user reload waybar' picks up config changes without a restart.
* fix(sway): rebind cliphist to $mod+p ($mod+v is splitv)sommerfeld2026-05-132-4/+4
| | | | | $mod+v is sway's default splitv; my cliphist bind was shadowing it and emitting a warning. Move clipboard history to $mod+p / $mod+Shift+p.
* chore(fmt): apply shfmt and prettier formattingsommerfeld2026-05-136-91/+91
| | | | | - shfmt -i 2 -ci -s on the four updated shell scripts (tabs → 2 spaces) - prettier --write on KEYBINDS.md and README.md
* feat(sway): bind brightness and ThinkPad XF86 multimedia keyssommerfeld2026-05-134-0/+37
| | | | | | | | | | | | | | Install brightnessctl and bind all seven ThinkPad multimedia keys: - XF86MonBrightnessUp/Down → brightnessctl ±5% - XF86AudioMicMute → pactl source mute - XF86Bluetooth → bt-toggle.sh (bluetoothctl + notify-send) - XF86ScreenSaver (Fn+F2) → same as $mod+Shift+s (pause + swaylock) - XF86Sleep → systemctl suspend - XF86WLAN / XF86RFKill → rfkill toggle Note: rfkill may need a passwordless doas rule (permit nopass :wheel cmd rfkill) or group membership to write /dev/rfkill without privileges; not wired speculatively.
* feat(wayland): install qt6ct for Qt6 themingsommerfeld2026-05-131-0/+1
| | | | | | zprofile already exports QT_QPA_PLATFORMTHEME=qt6ct, so installing the package is all that's needed for Qt6 apps to pick up the theme. Run qt6ct once to configure fonts/icons.
* feat(wayland): install xdg-desktop-portal-gtksommerfeld2026-05-131-0/+1
| | | | | | | Complements xdg-desktop-portal-wlr: wlr covers Screenshot/ScreenCast (Wayland-native), gtk covers FileChooser/Print/Settings/AppChooser. With both installed, portal auto-discovery picks the right backend per interface. No routing file needed unless conflicts show up.
* feat(sway): warp pointer to focused containersommerfeld2026-05-131-0/+1
| | | | | | Pairs with focus_follows_mouse to prevent stale-hover focus-steal after keyboard navigation: the cursor jumps into the new focus so subsequent small mouse movements don't bounce focus back to where it used to be.
* feat(sway): inhibit_idle on fullscreen windowssommerfeld2026-05-131-0/+1
| | | | | Any fullscreen window now pauses swayidle's timer. Covers mpv, video calls, fullscreen browser video, etc.
* feat(waybar): add mako notification counter modulesommerfeld2026-05-132-0/+39
| | | | | | New mako-status.sh emits JSON with pending / history counts. Click to dismiss latest, right-click to dismiss all, middle-click to restore the last dismissed notification.
* feat(waybar): add privacy module (mic/cam/screen indicator)sommerfeld2026-05-131-0/+11
| | | | | Shows icons while any app holds the microphone or a screen-share source via PipeWire. No new deps on a PipeWire system.
* feat(waybar): add idle_inhibitor modulesommerfeld2026-05-131-0/+10
| | | | | Click to toggle an inhibit lock that prevents swayidle from firing. Useful for long reads, video playback without fullscreen, etc.
* feat(sway): copy screenshots to clipboardsommerfeld2026-05-131-2/+2
| | | | | Pipe grim through tee so Print / Shift+Print save to disk AND copy the PNG to the Wayland clipboard via wl-copy.
* feat(wayland): add cliphist clipboard historysommerfeld2026-05-136-1/+36
| | | | | | Install cliphist and wire two user services (text + image watchers) into sway-session.target. Bind $mod+v to pick an entry via fuzzel and $mod+Shift+v to delete one.
* fix(sway): keep focus on current workspace when stashing tbsommerfeld2026-05-131-0/+4
|
* feat(sway): separate thunderbird autostart from super+t launch pathsommerfeld2026-05-132-2/+23
| | | | | | | | Splitting the for_window 'move to scratchpad' action into a dedicated autostart helper so that super+t launches TB tiled (not stashed) when TB isn't already running. Previously the for_window rule would stash every new main window, forcing the user to press super+t twice after killing TB manually.
* refactor(sway): stash thunderbird in scratchpad instead of hidden wssommerfeld2026-05-134-43/+23
| | | | | | | | | waybar's sway/workspaces has no ignore-list (that option is hyprland-only), so the _tb workspace always leaked into the bar and into super+tab cycling. Using sway's native scratchpad solves both: the __i3_scratch workspace is filtered automatically. We run 'floating disable' right after 'scratchpad show' so the window lands tiled on the current workspace, preserving the intended UX.
* feat(sway): skip _tb stash when cycling workspaces with super+tabsommerfeld2026-05-132-3/+21
|
* fix(sway): use get_workspaces for current ws in tb-togglesommerfeld2026-05-131-5/+3
| | | | | | get_tree's workspace nodes don't carry a .focused field (only con nodes do), so current_ws was empty and the script emitted a malformed swaymsg command. get_workspaces exposes .focused directly on each workspace.
* refactor(sway): make thunderbird toggle tile instead of floatsommerfeld2026-05-134-4/+41
| | | | | | | | | | | | | Scratchpad is inherently floating; the user wants the main TB window to tile normally when shown and disappear completely when hidden. Park the main window on a hidden workspace _tb via for_window, then toggle it with a small swaymsg+jq script that moves it between _tb and the currently focused workspace. Child windows (compose, viewer, calendar, prefs) are unaffected and tile wherever they spawn. - Autostart thunderbird so the window exists on login, parked on _tb. - Hide _tb from waybar's workspace list. - Update KEYBINDS.md.
* feat(thunderbird): top-post replies to match recipient expectationssommerfeld2026-05-131-0/+4
| | | | | | | Bottom-posting is arguably better but non-technical recipients find it disorienting. reply_on_top=1 puts the cursor above the quoted text; sig_bottom=false keeps the signature adjacent to the reply rather than below the quote.
* fix(sway): scope thunderbird scratchpad rule to the main windowsommerfeld2026-05-131-2/+2
| | | | | | | | | Matching only on app_id caused every TB window (compose, message viewer, calendar event, settings) to be parked in the scratchpad, leaving them hidden behind the main window. TB's main window title always ends in 'Mozilla Thunderbird'; child windows don't. Narrow both the for_window rule and the Super+t toggle with a title regex so only the main window is managed.
* fix(etc): restrict lsblk to the parent device onlysommerfeld2026-05-132-2/+2
| | | | | | | lsblk without -d lists the partition AND its children, so on a LUKS setup the second line (the mapper's UUID) was leaking into the rendered cmdline and deploy script. Add -d so only the partition's own UUID is emitted.
* 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.