diff --git a/.pre-pull-backup/agent/managed-skills/command-center-dotfiles-import/SKILL.md b/.pre-pull-backup/agent/managed-skills/command-center-dotfiles-import/SKILL.md new file mode 100644 index 0000000..c7dd7f4 --- /dev/null +++ b/.pre-pull-backup/agent/managed-skills/command-center-dotfiles-import/SKILL.md @@ -0,0 +1,28 @@ +--- +name: command-center-dotfiles-import +description: Runbook for importing Dankware env-layer configs into the command-center repo and deploying them via stow on new fleet machines; decisions agreed with Frank 2026-09-09 (pre-execution — verify execution state before assuming done). +--- + +Design agreed with Frank for importing Dankware application/environment configs into the `~/.omp` command-center repo and deploying them on fresh machines. **Status: plan agreed, not yet executed** — check repo state (does `dotfiles/` or `scripts/deploy.sh` exist?) before re-deriving; if already implemented, this becomes the operating model, not a to-do. + +## Agreed decisions (each was an explicit user choice) +1. **Target**: unknown/TBD fresh machine → design stays host-agnostic; deploy derives overrides from `$(hostname)` at run time. Nothing hardcodes a target. +2. **Scope**: environment layer only — niri (+cfg includes), gtk-3.0/4.0 settings, ghostty, alacritty, shell rc files (`.zshrc`, `.bashrc`, `.profile`, `.p10k.zsh`), fish, systemd user units, autostart, dconf. App *data* (browser profiles, vaults, DBs) never imported. +3. **Layout**: stow-style package dirs `dotfiles//` inside the repo; repo clones to `~/.omp` on every host that runs the harness (full command-center clone, not env-layer only). +4. **Deploy mechanism**: symlink farm — `stow -t ~` from `~/.omp/dotfiles`; relative symlinks within `$HOME` work because repo root lives inside `$HOME`. +5. **Dogfood order**: convert Dankware itself (real dirs → symlinks via adopt) BEFORE any target import; iterate where the compositor reload is observable. +6. **Secrets policy**: never commit secret values. Split rc files into committed logic + untracked sourced-if-exists stub (`~/.config/environment.d/secrets.env` or `.zshrc.local`); real values provisioned out-of-band only on machines that need them. Pre-commit secret scanner stays as safety net, not gate of first resort. +7. **Divergence**: `zz-` override package stowed LAST with `--override`; only per-host diffs live there. (Stow descends into conflicting symlinked dirs — per-file overrides only work via this last-stowed `--override` pattern.) +8. **Deploy trigger**: explicit `scripts/deploy.sh` invocation, human- or agent-invoked. NO auto-deploy on pull — pull and deploy are separate decisions; `--check` = drift report mode. +9. **Ownership**: Frank is sole push authority; exactly one editing agent at a time → no multi-writer race machinery needed. Each host's agent edits only its own `zz-` package. +10. **Conflict policy**: pre-existing regular file that differs from repo truth → move to timestamped `.quarantine/` dir on the target (never `rm`, same convention as this repo's trash rule), symlink anyway, print every replacement in deploy output and `--check` report. Repo truth always wins; divergence recoverable from quarantine. +11. **First-clone auth**: human types credential once console-side (URL-with-token or prompt); the new machine's secrets exist only there afterward. + +## Implementation gotchas baked into the design +- `core.hooksPath` is a per-clone local setting — does NOT survive clone; bootstrap/deploy must set it on every fresh clone or the secret-gate pre-commit hook silently doesn't run there. +- dconf/gsettings are databases, not files: import as `dconf dump /` text into repo; deploy runs `dconf load` instead of symlinking. +- p10k installer and toolchain hooks append to rc files at install time — expect conflicts on `.zshrc`-class files at first adopt; quarantine-and-replace handles it, but diff live-vs-repo before adopting so pre-existing drift is seen, not silently adopted. +- Known secret at import time: `GITEA_TOKEN` export lived in `.zshrc` (line ~22) on Dankware — quarantine BEFORE importing rc files; consider token rotation at cutover since it had been exposed in plaintext rc + remote URL. + +## Deploy script spec agreed +`scripts/deploy.sh`: sets hooksPath → stows all base packages → stows `zz-$(hostname)` with `--override` → first run uses `--adopt` for pre-existing identical files → divergent files quarantined-and-reported; `--check` mode emits drift report (modified tracked files vs deployed symlinks) without mutating. diff --git a/.pre-pull-backup/agent/managed-skills/stash-supersession-audit-before-drop/SKILL.md b/.pre-pull-backup/agent/managed-skills/stash-supersession-audit-before-drop/SKILL.md new file mode 100644 index 0000000..aebd555 --- /dev/null +++ b/.pre-pull-backup/agent/managed-skills/stash-supersession-audit-before-drop/SKILL.md @@ -0,0 +1,33 @@ +--- +name: stash-supersession-audit-before-drop +description: "Before dropping a stale git stash, prove it's superseded by HEAD via per-file line-set diff of git show stash@{0}:file vs HEAD; archive as an annotated tag and drop only after auditing unique facts — zero-loss alternative to blind drop." +--- + +# Stash Supersession Audit Before Drop + +Use when a repo (especially a live-deployment checkout where the working tree IS the deployment, e.g. `~/.omp` command-center) has an old stash whose content may have been superseded by later commits, and dropping blindly risks losing unique facts. + +## Procedure + +1. **Inventory the stash** — see which files it touches: + ```bash + git stash show --stat stash@{0} + ``` +2. **Probe for unique content per file.** For each touched file, diff stash version against HEAD and count lines that exist only in the stash version: + ```bash + git show "stash@{0}:" > /tmp/stash_copy + # compare normalized line sets; report lines present in stash but absent from HEAD + ``` + A file with `unique-vs-HEAD = 0` is fully superseded — safe to drop for that file. +3. **Classify each unique-content hit**: + - *Stale fact* (superseded by a later refactor, e.g. old model/provider naming) → drop is correct. + - *Live durable fact* (e.g. an operational invariant never re-recorded) → extract it into the live memory/docs file or flag to the user before dropping. +4. **Archive before dropping** — zero-loss: tag the stash commit, then drop from the stash list: + ```bash + git tag archive/stash---wip "stash@{0}" + git stash drop "stash@{0}" + ``` + The tag pins the full stash object (including its index parent); recoverable later via `git show archive/stash-...` or `git checkout archive/stash-...^3 -- ` for the untracked-files third parent if present. + +## Why +Stashes are invisible in normal history and expire from reflogs (~90 days). A stash that *looks* superseded can still hold the only copy of a durable fact; tagging converts "drop" into a reversible archive with zero workflow cost. diff --git a/dotfiles/alacritty/.config/alacritty/alacritty.toml b/dotfiles/alacritty/.config/alacritty/alacritty.toml index c81c1b9..a0d84ec 100644 --- a/dotfiles/alacritty/.config/alacritty/alacritty.toml +++ b/dotfiles/alacritty/.config/alacritty/alacritty.toml @@ -1,4 +1,5 @@ [general] +import = ["~/.config/alacritty/themes/noctalia.toml"] working_directory = "None" live_config_reload = true diff --git a/dotfiles/ghostty/.config/ghostty/config.ghostty b/dotfiles/ghostty/.config/ghostty/config.ghostty index 4b10cb2..f5c5135 100644 --- a/dotfiles/ghostty/.config/ghostty/config.ghostty +++ b/dotfiles/ghostty/.config/ghostty/config.ghostty @@ -2,7 +2,7 @@ # Clean, simplified config for Terminess Nerd Font Mono with Catppuccin Mocha # ── Theme ────────────────────────────────────────────────────────────────────── -theme = "Retro Legends" +theme = noctalia # ── Font ─────────────────────────────────────────────────────────────────────── font-family = "Terminess Nerd Font Mono" diff --git a/dotfiles/gtk-3.0/.config/gtk-3.0/noctalia.css b/dotfiles/gtk-3.0/.config/gtk-3.0/noctalia.css index 0f7ed65..1c6606e 100644 --- a/dotfiles/gtk-3.0/.config/gtk-3.0/noctalia.css +++ b/dotfiles/gtk-3.0/.config/gtk-3.0/noctalia.css @@ -4,45 +4,49 @@ * stylelint-disable at-rule-no-unknown */ -@define-color accent_color #bfc2ff; -@define-color accent_bg_color #bfc2ff; -@define-color accent_fg_color #23276f; +@define-color accent_color #b267e4; +@define-color accent_bg_color #b267e4; +@define-color accent_fg_color #201825; -@define-color destructive_bg_color #ffb4ab; -@define-color destructive_fg_color #690005; +@define-color destructive_bg_color #fd4663; +@define-color destructive_fg_color #201825; -@define-color error_bg_color #ffb4ab; -@define-color error_fg_color #690005; +@define-color error_bg_color #fd4663; +@define-color error_fg_color #201825; -@define-color window_bg_color #131318; -@define-color window_fg_color #e4e1e8; +@define-color window_bg_color #220f2e; +@define-color window_fg_color #f2f2f3; -@define-color view_bg_color #131318; -@define-color view_fg_color #e4e1e8; +@define-color view_bg_color #220f2e; +@define-color view_fg_color #f2f2f3; -@define-color headerbar_bg_color #131318; -@define-color headerbar_fg_color #e4e1e8; +@define-color headerbar_bg_color #38194d; +@define-color headerbar_fg_color #f2f2f3; @define-color headerbar_backdrop_color @window_bg_color; -@define-color popover_bg_color #1f1f24; -@define-color popover_fg_color #e4e1e8; +@define-color popover_bg_color #38194d; +@define-color popover_fg_color #f2f2f3; -@define-color card_bg_color #1f1f24; -@define-color card_fg_color #e4e1e8; +@define-color card_bg_color #38194d; +@define-color card_fg_color #f2f2f3; -@define-color dialog_bg_color #131318; -@define-color dialog_fg_color #e4e1e8; +@define-color dialog_bg_color #220f2e; +@define-color dialog_fg_color #f2f2f3; -@define-color overview_bg_color #1f1f24; -@define-color overview_fg_color #e4e1e8; +@define-color overview_bg_color #38194d; +@define-color overview_fg_color #f2f2f3; -@define-color sidebar_bg_color #1f1f24; -@define-color sidebar_fg_color #e4e1e8; +@define-color sidebar_bg_color #38194d; +@define-color sidebar_fg_color #f2f2f3; @define-color sidebar_backdrop_color @window_bg_color; @define-color sidebar_border_color @window_bg_color; -@define-color secondary_sidebar_bg_color #131318; -@define-color secondary_sidebar_fg_color #e4e1e8; +@define-color secondary_sidebar_bg_color #220f2e; +@define-color secondary_sidebar_fg_color #f2f2f3; + +/* Focused selection states */ +@define-color theme_selected_bg_color @accent_bg_color; +@define-color theme_selected_fg_color @accent_fg_color; /* Backdrop/unfocused states */ @define-color theme_unfocused_fg_color @window_fg_color; diff --git a/dotfiles/gtk-4.0/.config/gtk-4.0/noctalia.css b/dotfiles/gtk-4.0/.config/gtk-4.0/noctalia.css index a4c88ab..97197f4 100644 --- a/dotfiles/gtk-4.0/.config/gtk-4.0/noctalia.css +++ b/dotfiles/gtk-4.0/.config/gtk-4.0/noctalia.css @@ -4,45 +4,49 @@ * stylelint-disable at-rule-no-unknown */ -@define-color accent_color #bfc2ff; -@define-color accent_bg_color #bfc2ff; -@define-color accent_fg_color #23276f; +@define-color accent_color #b267e4; +@define-color accent_bg_color #b267e4; +@define-color accent_fg_color #201825; -@define-color destructive_bg_color #ffb4ab; -@define-color destructive_fg_color #690005; +@define-color destructive_bg_color #fd4663; +@define-color destructive_fg_color #201825; -@define-color error_bg_color #ffb4ab; -@define-color error_fg_color #690005; +@define-color error_bg_color #fd4663; +@define-color error_fg_color #201825; -@define-color window_bg_color #131318; -@define-color window_fg_color #e4e1e8; +@define-color window_bg_color #220f2e; +@define-color window_fg_color #f2f2f3; -@define-color view_bg_color #131318; -@define-color view_fg_color #e4e1e8; +@define-color view_bg_color #220f2e; +@define-color view_fg_color #f2f2f3; -@define-color headerbar_bg_color #131318; -@define-color headerbar_fg_color #e4e1e8; +@define-color headerbar_bg_color #220f2e; +@define-color headerbar_fg_color #f2f2f3; @define-color headerbar_backdrop_color @window_bg_color; -@define-color popover_bg_color #1f1f24; -@define-color popover_fg_color #e4e1e8; +@define-color popover_bg_color #38194d; +@define-color popover_fg_color #f2f2f3; -@define-color card_bg_color #1f1f24; -@define-color card_fg_color #e4e1e8; +@define-color card_bg_color #38194d; +@define-color card_fg_color #f2f2f3; -@define-color dialog_bg_color #131318; -@define-color dialog_fg_color #e4e1e8; +@define-color dialog_bg_color #220f2e; +@define-color dialog_fg_color #f2f2f3; -@define-color overview_bg_color #1f1f24; -@define-color overview_fg_color #e4e1e8; +@define-color overview_bg_color #38194d; +@define-color overview_fg_color #f2f2f3; -@define-color sidebar_bg_color #1f1f24; -@define-color sidebar_fg_color #e4e1e8; +@define-color sidebar_bg_color #38194d; +@define-color sidebar_fg_color #f2f2f3; @define-color sidebar_backdrop_color @window_bg_color; @define-color sidebar_border_color @window_bg_color; -@define-color secondary_sidebar_bg_color #131318; -@define-color secondary_sidebar_fg_color #e4e1e8; +@define-color secondary_sidebar_bg_color #220f2e; +@define-color secondary_sidebar_fg_color #f2f2f3; + +/* Focused selection states */ +@define-color theme_selected_bg_color @accent_bg_color; +@define-color theme_selected_fg_color @accent_fg_color; /* Backdrop/unfocused states */ @define-color theme_unfocused_fg_color @window_fg_color; @@ -53,51 +57,51 @@ @define-color theme_unfocused_selected_fg_color @accent_fg_color; :root { - --accent-color: #bfc2ff; - --accent-bg-color: #bfc2ff; - --accent-fg-color: #23276f; + --accent-color: #b267e4; + --accent-bg-color: #b267e4; + --accent-fg-color: #201825; - --destructive-bg-color: #ffb4ab; - --destructive-fg-color: #690005; + --destructive-bg-color: #fd4663; + --destructive-fg-color: #201825; - --error-bg-color: #ffb4ab; - --error-fg-color: #690005; - --error-color: #ffb4ab; + --error-bg-color: #fd4663; + --error-fg-color: #201825; + --error-color: #fd4663; - --window-bg-color: #131318; - --window-fg-color: #e4e1e8; + --window-bg-color: #220f2e; + --window-fg-color: #f2f2f3; - --view-bg-color: #131318; - --view-fg-color: #e4e1e8; + --view-bg-color: #220f2e; + --view-fg-color: #f2f2f3; - --headerbar-bg-color: #131318; - --headerbar-fg-color: #e4e1e8; + --headerbar-bg-color: #220f2e; + --headerbar-fg-color: #f2f2f3; --headerbar-backdrop-color: @window_bg_color; - --popover-bg-color: #1f1f24; - --popover-fg-color: #e4e1e8; + --popover-bg-color: #38194d; + --popover-fg-color: #f2f2f3; - --card-bg-color: #1f1f24; - --card-fg-color: #e4e1e8; + --card-bg-color: #38194d; + --card-fg-color: #f2f2f3; - --dialog-bg-color: #131318; - --dialog-fg-color: #e4e1e8; + --dialog-bg-color: #220f2e; + --dialog-fg-color: #f2f2f3; - --overview-bg-color: #1f1f24; - --overview-fg-color: #e4e1e8; + --overview-bg-color: #38194d; + --overview-fg-color: #f2f2f3; - --sidebar-bg-color: #1f1f24; - --sidebar-fg-color: #e4e1e8; + --sidebar-bg-color: #38194d; + --sidebar-fg-color: #f2f2f3; --sidebar-backdrop-color: @window_bg_color; --sidebar-border-color: @window_bg_color; - --warning-bg-color: #6d2f65; - --warning-fg-color: #ffd7f3; - --warning-color: #fcadeb; + --warning-bg-color: #651a38; + --warning-fg-color: #f3d8e3; + --warning-color: #ce648e; - --success-color: #c3c4e7; - --success-bg-color: #434462; - --success-fg-color: #e0e0ff; + --success-color: #d65cce; + --success-bg-color: #6a1664; + --success-fg-color: #f3d8f1; --shade-color: rgba(0, 0, 0, 0.36); } diff --git a/dotfiles/niri/.config/niri/cfg/autostart.kdl b/dotfiles/niri/.config/niri/cfg/autostart.kdl index f6f0187..1fea9d7 100644 --- a/dotfiles/niri/.config/niri/cfg/autostart.kdl +++ b/dotfiles/niri/.config/niri/cfg/autostart.kdl @@ -1,4 +1,4 @@ // ────────────── Startup Applications ────────────── // https://github.com/YaLTeR/niri/wiki/Configuration:-Miscellaneous#spawn-sh-at-startup - spawn-sh-at-startup "qs -c noctalia-shell" + spawn-at-startup "noctalia" diff --git a/dotfiles/niri/.config/niri/cfg/keybinds.kdl b/dotfiles/niri/.config/niri/cfg/keybinds.kdl index 33e7b4d..6e7de24 100644 --- a/dotfiles/niri/.config/niri/cfg/keybinds.kdl +++ b/dotfiles/niri/.config/niri/cfg/keybinds.kdl @@ -10,27 +10,27 @@ binds { // ─── Applications ─── Mod+Return hotkey-overlay-title="Open Terminal: Ghostty" { spawn "ghostty"; } - Mod+CTRL+Return hotkey-overlay-title="Open App Launcher: noctalia launcher" { spawn-sh "qs -c noctalia-shell ipc call launcher toggle"; } + Mod+CTRL+Return hotkey-overlay-title="Open App Launcher: noctalia launcher" { spawn-sh "noctalia msg panel-toggle launcher"; } Mod+B hotkey-overlay-title="Open Browser: firefox" { spawn "firefox"; } - Mod+ALT+L hotkey-overlay-title="Lock Screen: noctalia lock" { spawn-sh "qs -c noctalia-shell ipc call lockScreen lock"; } - Mod+Shift+Q hotkey-overlay-title="Session Menu: noctalia sessionMenu" { spawn-sh "qs -c noctalia-shell ipc call sessionMenu toggle"; } + Mod+ALT+L hotkey-overlay-title="Lock Screen: noctalia lock" { spawn-sh "noctalia msg session lock"; } + Mod+Shift+Q hotkey-overlay-title="Session Menu: noctalia session" { spawn-sh "noctalia msg panel-toggle session"; } // Please choose your own file manager. Mod+E hotkey-overlay-title="File Manager: Nautilus" { spawn "nautilus"; } // ─── Media Controls ─── - XF86AudioRaiseVolume allow-when-locked=true { spawn-sh "qs -c noctalia-shell ipc call volume increase"; } - XF86AudioLowerVolume allow-when-locked=true { spawn-sh "qs -c noctalia-shell ipc call volume decrease"; } - XF86AudioMute allow-when-locked=true { spawn-sh "qs -c noctalia-shell ipc call volume muteOutput"; } - XF86AudioMicMute allow-when-locked=true { spawn-sh "qs -c noctalia-shell ipc call volume muteInput"; } - XF86AudioNext allow-when-locked=true { spawn-sh "qs -c noctalia-shell ipc call media next"; } - XF86AudioPrev allow-when-locked=true { spawn-sh "qs -c noctalia-shell ipc call media previous"; } - XF86AudioPlay allow-when-locked=true { spawn-sh "qs -c noctalia-shell ipc call media playPause"; } - XF86AudioPause allow-when-locked=true { spawn-sh "qs -c noctalia-shell ipc call media playPause"; } + XF86AudioRaiseVolume allow-when-locked=true { spawn-sh "noctalia msg volume-up"; } + XF86AudioLowerVolume allow-when-locked=true { spawn-sh "noctalia msg volume-down"; } + XF86AudioMute allow-when-locked=true { spawn-sh "noctalia msg volume-mute"; } + XF86AudioMicMute allow-when-locked=true { spawn-sh "noctalia msg mic-mute"; } + XF86AudioNext allow-when-locked=true { spawn-sh "noctalia msg media next"; } + XF86AudioPrev allow-when-locked=true { spawn-sh "noctalia msg media previous"; } + XF86AudioPlay allow-when-locked=true { spawn-sh "noctalia msg media playPause"; } + XF86AudioPause allow-when-locked=true { spawn-sh "noctalia msg media playPause"; } // ─── Brightness Controls ─── - XF86MonBrightnessUp allow-when-locked=true { spawn-sh "qs -c noctalia-shell ipc call brightness increase"; } - XF86MonBrightnessDown allow-when-locked=true { spawn-sh "qs -c noctalia-shell ipc call brightness decrease"; } + XF86MonBrightnessUp allow-when-locked=true { spawn-sh "noctalia msg brightness-up"; } + XF86MonBrightnessDown allow-when-locked=true { spawn-sh "noctalia msg brightness-down"; } // ─── Window Movement and Focus ─── Mod+Q { close-window; } diff --git a/dotfiles/niri/.config/niri/config.kdl b/dotfiles/niri/.config/niri/config.kdl index b8c53ca..f8e2cd8 100644 --- a/dotfiles/niri/.config/niri/config.kdl +++ b/dotfiles/niri/.config/niri/config.kdl @@ -6,3 +6,5 @@ include "./cfg/display.kdl" include "./cfg/layout.kdl" include "./cfg/rules.kdl" include "./cfg/misc.kdl" + +include "noctalia.kdl" diff --git a/dotfiles/systemd-user/.config/systemd/user/swayidle-lock.service b/dotfiles/systemd-user/.config/systemd/user/swayidle-lock.service index 6c40f1b..ef5f63d 100644 --- a/dotfiles/systemd-user/.config/systemd/user/swayidle-lock.service +++ b/dotfiles/systemd-user/.config/systemd/user/swayidle-lock.service @@ -4,13 +4,13 @@ Documentation=https://github.com/swaywm/swayidle After=graphical-session.target [Service] -# qs exists on dankware, bare noctalia CLI on blankpad; the fallback chain makes -# this one unit correct on both hosts. deploy.sh enables it only where the -# ExecStart binary resolves, so it stays inert until swayidle is installed. +# Locks via the noctalia v5 shell; `noctalia msg` resolves the running instance +# through the D-Bus session bus, so no WAYLAND_DISPLAY pinning is needed in unit context. +# deploy.sh enables it only where the ExecStart binary resolves, so it stays inert until swayidle is installed. ExecStart=/usr/bin/swayidle -w \ - timeout 300 'qs -c noctalia-shell ipc call lockScreen lock || noctalia msg session lock' \ - before-sleep 'qs -c noctalia-shell ipc call lockScreen lock || noctalia msg session lock' \ - after-resume 'qs -c noctalia-shell ipc call lockScreen lock || noctalia msg session lock' + timeout 300 '/usr/bin/noctalia msg session lock' \ + before-sleep '/usr/bin/noctalia msg session lock' \ + after-resume '/usr/bin/noctalia msg session lock' Restart=on-failure RestartSec=5s diff --git a/home/dank/.omp/dotfiles/niri/.config/niri/cfg/autostart.kdl b/home/dank/.omp/dotfiles/niri/.config/niri/cfg/autostart.kdl new file mode 100644 index 0000000..1fea9d7 --- /dev/null +++ b/home/dank/.omp/dotfiles/niri/.config/niri/cfg/autostart.kdl @@ -0,0 +1,4 @@ +// ────────────── Startup Applications ────────────── +// https://github.com/YaLTeR/niri/wiki/Configuration:-Miscellaneous#spawn-sh-at-startup + + spawn-at-startup "noctalia" diff --git a/home/dank/.omp/dotfiles/niri/.config/niri/cfg/keybinds.kdl b/home/dank/.omp/dotfiles/niri/.config/niri/cfg/keybinds.kdl new file mode 100644 index 0000000..6e7de24 --- /dev/null +++ b/home/dank/.omp/dotfiles/niri/.config/niri/cfg/keybinds.kdl @@ -0,0 +1,142 @@ +binds { + + // ────────────── Keybindings ────────────── + // https://github.com/YaLTeR/niri/wiki/Configuration:-Key-Bindings + + // ─── noctalia-shell keybinds ─── + // https://docs.noctalia.dev/getting-started/keybinds/ + + Mod+Shift+Escape { show-hotkey-overlay; } + + // ─── Applications ─── + Mod+Return hotkey-overlay-title="Open Terminal: Ghostty" { spawn "ghostty"; } + Mod+CTRL+Return hotkey-overlay-title="Open App Launcher: noctalia launcher" { spawn-sh "noctalia msg panel-toggle launcher"; } + Mod+B hotkey-overlay-title="Open Browser: firefox" { spawn "firefox"; } + Mod+ALT+L hotkey-overlay-title="Lock Screen: noctalia lock" { spawn-sh "noctalia msg session lock"; } + Mod+Shift+Q hotkey-overlay-title="Session Menu: noctalia session" { spawn-sh "noctalia msg panel-toggle session"; } + + // Please choose your own file manager. + Mod+E hotkey-overlay-title="File Manager: Nautilus" { spawn "nautilus"; } + + // ─── Media Controls ─── + XF86AudioRaiseVolume allow-when-locked=true { spawn-sh "noctalia msg volume-up"; } + XF86AudioLowerVolume allow-when-locked=true { spawn-sh "noctalia msg volume-down"; } + XF86AudioMute allow-when-locked=true { spawn-sh "noctalia msg volume-mute"; } + XF86AudioMicMute allow-when-locked=true { spawn-sh "noctalia msg mic-mute"; } + XF86AudioNext allow-when-locked=true { spawn-sh "noctalia msg media next"; } + XF86AudioPrev allow-when-locked=true { spawn-sh "noctalia msg media previous"; } + XF86AudioPlay allow-when-locked=true { spawn-sh "noctalia msg media playPause"; } + XF86AudioPause allow-when-locked=true { spawn-sh "noctalia msg media playPause"; } + + // ─── Brightness Controls ─── + XF86MonBrightnessUp allow-when-locked=true { spawn-sh "noctalia msg brightness-up"; } + XF86MonBrightnessDown allow-when-locked=true { spawn-sh "noctalia msg brightness-down"; } + + // ─── Window Movement and Focus ─── + Mod+Q { close-window; } + + Mod+Left { focus-column-left; } + Mod+H { focus-column-left; } + Mod+Right { focus-column-right; } + Mod+L { focus-column-right; } + Mod+Up { focus-window-up; } + Mod+K { focus-window-up; } + Mod+Down { focus-window-down; } + Mod+J { focus-window-down; } + + // Win+Ctrl consume/expel windows to/from columns + Mod+CTRL+Left { consume-or-expel-window-left; } + Mod+CTRL+H { consume-or-expel-window-left; } + Mod+CTRL+Right { consume-or-expel-window-right; } + Mod+CTRL+L { consume-or-expel-window-right; } + Mod+CTRL+UP { expel-window-from-column; } + Mod+CTRL+K { expel-window-from-column; } + Mod+CTRL+Down { expel-window-from-column; } + Mod+CTRL+J { expel-window-from-column; } + Mod+Home { focus-column-first; } + Mod+End { focus-column-last; } + Mod+CTRL+Home { move-column-to-first; } + Mod+CTRL+End { move-column-to-last; } + + Mod+Shift+Left { focus-monitor-left; } + Mod+Shift+Right { focus-monitor-right; } + Mod+Shift+UP { focus-monitor-up; } + Mod+Shift+Down { focus-monitor-down; } + + Mod+Shift+CTRL+Left { move-column-to-monitor-left; } + Mod+Shift+CTRL+Right { move-column-to-monitor-right; } + Mod+Shift+CTRL+UP { move-column-to-monitor-up; } + Mod+Shift+CTRL+Down { move-column-to-monitor-down; } + + // ─── Workspace Switching ─── + Mod+WheelScrollDown cooldown-ms=150 { focus-workspace-down; } + Mod+WheelScrollUp cooldown-ms=150 { focus-workspace-up; } + Mod+CTRL+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; } + Mod+CTRL+WheelScrollUp cooldown-ms=150 { move-column-to-workspace-up; } + + Mod+WheelScrollRight { focus-column-right; } + Mod+WheelScrollLeft { focus-column-left; } + Mod+CTRL+WheelScrollRight { move-column-right; } + Mod+CTRL+WheelScrollLeft { move-column-left; } + + Mod+Shift+WheelScrollDown { focus-column-right; } + Mod+Shift+WheelScrollUp { focus-column-left; } + Mod+CTRL+Shift+WheelScrollDown { move-column-right; } + Mod+CTRL+Shift+WheelScrollUp { move-column-left; } + + Mod+1 { focus-workspace 1; } + Mod+2 { focus-workspace 2; } + Mod+3 { focus-workspace 3; } + Mod+4 { focus-workspace 4; } + Mod+5 { focus-workspace 5; } + Mod+6 { focus-workspace 6; } + Mod+7 { focus-workspace 7; } + Mod+8 { focus-workspace 8; } + Mod+9 { focus-workspace 9; } + + Mod+CTRL+1 { move-column-to-workspace 1; } + Mod+CTRL+2 { move-column-to-workspace 2; } + Mod+CTRL+3 { move-column-to-workspace 3; } + Mod+CTRL+4 { move-column-to-workspace 4; } + Mod+CTRL+5 { move-column-to-workspace 5; } + Mod+CTRL+6 { move-column-to-workspace 6; } + Mod+CTRL+7 { move-column-to-workspace 7; } + Mod+CTRL+8 { move-column-to-workspace 8; } + Mod+CTRL+9 { move-column-to-workspace 9; } + + Mod+TAB { focus-workspace-previous; } + + // ─── Layout Controls ─── + Mod+CTRL+F { expand-column-to-available-width; } + Mod+C hotkey-overlay-title="Calculator" { spawn "gnome-calculator"; } + Mod+CTRL+C { center-visible-columns; } + Mod+Minus { set-column-width "-10%"; } + Mod+Equal { set-column-width "+10%"; } + Mod+Shift+Minus { set-window-height "-10%"; } + Mod+Shift+Equal { set-window-height "+10%"; } + + // ─── Split / Consume / Expel ─── + Mod+Shift+H { consume-or-expel-window-left; } + Mod+Shift+L { consume-or-expel-window-right; } + Mod+Shift+J { expel-window-from-column; } + + // ─── Modes ─── + Mod+T { toggle-window-floating; } + Mod+F { fullscreen-window; } + Mod+W { toggle-column-tabbed-display; } + + // ─── Screenshots ─── + CTRL+Shift+1 hotkey-overlay-title="Screenshot: flameshot full" { spawn-sh "flameshot full"; } + CTRL+Shift+2 hotkey-overlay-title="Screenshot: flameshot screen" { spawn-sh "flameshot screen"; } + CTRL+Shift+3 hotkey-overlay-title="Screenshot: flameshot region" { spawn-sh "flameshot gui"; } + + // ─── Emergency Escape Key ─── + // Use this when a fullscreen app blocks your keybinds. + // It disables any active keyboard shortcut inhibitor, restoring control. + Mod+ESCAPE allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; } + + // ─── Exit / Power ─── + CTRL+ALT+Delete { quit; } // Also quits Niri + Mod+Shift+P { power-off-monitors; } // Turn off screens (useful for OLED or privacy) + Mod+O repeat=false { toggle-overview; } +} diff --git a/home/dank/.omp/dotfiles/systemd-user/.config/systemd/user/swayidle-lock.service b/home/dank/.omp/dotfiles/systemd-user/.config/systemd/user/swayidle-lock.service new file mode 100644 index 0000000..ef5f63d --- /dev/null +++ b/home/dank/.omp/dotfiles/systemd-user/.config/systemd/user/swayidle-lock.service @@ -0,0 +1,18 @@ +[Unit] +Description=swayidle idle lock (locks via noctalia-shell IPC, suspends on lid) +Documentation=https://github.com/swaywm/swayidle +After=graphical-session.target + +[Service] +# Locks via the noctalia v5 shell; `noctalia msg` resolves the running instance +# through the D-Bus session bus, so no WAYLAND_DISPLAY pinning is needed in unit context. +# deploy.sh enables it only where the ExecStart binary resolves, so it stays inert until swayidle is installed. +ExecStart=/usr/bin/swayidle -w \ + timeout 300 '/usr/bin/noctalia msg session lock' \ + before-sleep '/usr/bin/noctalia msg session lock' \ + after-resume '/usr/bin/noctalia msg session lock' +Restart=on-failure +RestartSec=5s + +[Install] +WantedBy=default.target