feat(dotfiles): import env layer as stow-style packages with deploy.sh

Import Dankware's environment layer into the repo as home-relative package
trees (niri, gtk-3/4, ghostty, alacritty, fish, zsh, bash, profile,
systemd-user, dconf). scripts/deploy.sh implements stow-equivalent semantics
(check|adopt|sync modes): identical files adopt to symlinks, new files link,
divergent files quarantine-and-replace under .quarantine/<host>/<ts>/ (gitignored).
zz-<hostname> override packages deploy last with override semantics.

Secrets never enter git: GITEA_TOKEN moved from .zshrc into untracked
~/.config/environment.d/secrets.env (0600); tracked .zshrc sources it
guarded. core.hooksPath armed by deploy.sh so the pre-commit secret gate is
live on every machine that deploys.
This commit is contained in:
Frank
2026-09-09 18:09:38 -07:00
parent dfb3a8f69a
commit a9127a08e9
28 changed files with 2917 additions and 0 deletions
+3
View File
@@ -53,3 +53,6 @@ puppeteer/
.AGENTTRASH/
*.save
*.bak-*
# deploy quarantine — never tracked
.quarantine/
+2
View File
@@ -23,6 +23,8 @@ Dankware is the primary host — this repository lives at `~/.omp/` and drives t
│ ├── managed-skills/ # Managed skills (SKILL.md bundles)
│ ├── models.db # Model cache
│ └── sessions/ # Persistent session state
├── dotfiles/ # stow-style env-layer packages (home-relative trees)
│ └── deploy via scripts/deploy.sh (check|adopt|sync; quarantine-and-replace)
├── omp-docs/ # Knowledge base (source of truth)
│ ├── index.md # KB index — start here
│ ├── system/ # Fleet hardware, OS, network
@@ -0,0 +1,87 @@
[general]
working_directory = "None"
live_config_reload = true
[env]
TERM = "xterm-256color"
WINIT_X11_SCALE_FACTOR = "1.0"
[window]
dimensions = { columns = 100, lines = 30 }
dynamic_padding = true
decorations = "Full"
opacity = 0.8
title = "Alacritty@CachyOS"
class = { instance = "Alacritty", general = "Alacritty" }
decorations_theme_variant = "Dark"
[scrolling]
history = 10000
multiplier = 3
[font]
normal = { family = "monospace", style = "Regular" }
bold = { family = "monospace", style = "Bold" }
italic = { family = "monospace", style = "Italic" }
bold_italic = { family = "monospace", style = "Bold Italic" }
size = 12.0
[colors]
draw_bold_text_with_bright_colors = true
[colors.primary]
background = "0x2E3440"
foreground = "0xD8DEE9"
[colors.normal]
black = "0x3B4252"
red = "0xBF616A"
green = "0xA3BE8C"
yellow = "0xEBCB8B"
blue = "0x81A1C1"
magenta = "0xB48EAD"
cyan = "0x88C0D0"
white = "0xE5E9F0"
[colors.bright]
black = "0x4C566A"
red = "0xBF616A"
green = "0xA3BE8C"
yellow = "0xEBCB8B"
blue = "0x81A1C1"
magenta = "0xB48EAD"
cyan = "0x8FBCBB"
white = "0xECEFF4"
[selection]
semantic_escape_chars = ",│`|:\"' ()[]{}<>\t"
save_to_clipboard = true
[cursor]
style = { shape = "Underline", blinking = "Off" }
unfocused_hollow = true
thickness = 0.15
[mouse]
hide_when_typing = true
bindings = [
{ mouse = "Middle", mods = "None", action = "PasteSelection" },
]
[keyboard]
bindings = [
{ key = "Paste", mods = "None", action = "Paste" },
{ key = "Copy", mods = "None", action = "Copy" },
{ key = "L", mods = "Control", action = "ClearLogNotice" },
{ key = "L", mods = "Control", mode = "~Vi", chars = "\f" },
{ key = "PageUp", mods = "Shift", mode = "~Alt", action = "ScrollPageUp" },
{ key = "PageDown", mods = "Shift", mode = "~Alt", action = "ScrollPageDown" },
{ key = "Home", mods = "Shift", mode = "~Alt", action = "ScrollToTop" },
{ key = "End", mods = "Shift", mode = "~Alt", action = "ScrollToBottom" },
{ key = "V", mods = "Control|Shift", action = "Paste" },
{ key = "C", mods = "Control|Shift", action = "Copy" },
{ key = "F", mods = "Control|Shift", action = "SearchForward" },
{ key = "B", mods = "Control|Shift", action = "SearchBackward" },
{ key = "C", mods = "Control|Shift", mode = "Vi", action = "ClearSelection" },
{ key = "Key0", mods = "Control", action = "ResetFontSize" },
]
+14
View File
@@ -0,0 +1,14 @@
#
# ~/.bashrc
#
# If not running interactively, don't do anything
[[ $- != *i* ]] && return
alias ls='ls --color=auto'
alias grep='grep --color=auto'
PS1='[\u@\h \W]\$ '
# peon-ping quick controls
alias peon="bash /home/dank/.claude/hooks/peon-ping/peon.sh"
[ -f /home/dank/.claude/hooks/peon-ping/completions.bash ] && source /home/dank/.claude/hooks/peon-ping/completions.bash
+39
View File
@@ -0,0 +1,39 @@
[org/gnome/calculator]
base=10
button-mode='basic'
source-units=['degree']
target-units=['radian']
unit-category='angle'
window-maximized=false
window-size=(360, -1)
[org/gnome/desktop/background]
picture-options='zoom'
picture-uri='file:///home/dank/.config/background'
picture-uri-dark='file:///home/dank/.config/background'
[org/gnome/desktop/interface]
color-scheme='prefer-dark'
cursor-size=36
cursor-theme='capitaine-cursors'
gtk-theme='adw-gtk3-dark'
[org/gnome/nautilus/list-view]
default-column-order=['name', 'size', 'type', 'owner', 'group', 'permissions', 'date_modified', 'date_accessed', 'date_created', 'recency', 'detailed_type']
default-visible-columns=['name', 'size', 'type', 'date_modified']
[org/gnome/nautilus/preferences]
default-folder-viewer='list-view'
migrated-gtk-settings=true
[org/gnome/nautilus/window-state]
initial-size=(890, 550)
initial-size-file-chooser=(890, 550)
maximized=false
[org/gnome/portal/filechooser/firefox]
last-folder-path='/home/dank/Downloads'
[org/gtk/gtk4/settings/file-chooser]
show-hidden=false
sort-directories-first=false
@@ -0,0 +1,216 @@
# peon-ping tab completion for fish shell
# Helper: true when no subcommand has been given yet
function __peon_no_subcommand
set -l cmd (commandline -opc)
test (count $cmd) -eq 1
end
# Helper: true when the given subcommand is active
function __peon_using_subcommand
set -l cmd (commandline -opc)
test (count $cmd) -ge 2; and test $cmd[2] = $argv[1]
end
# Helper: true when packs subcommand is active and second arg matches
function __peon_packs_subcommand
set -l cmd (commandline -opc)
test (count $cmd) -ge 3; and test $cmd[2] = packs; and test $cmd[3] = $argv[1]
end
# Disable file completions
complete -c peon -f
# Top-level commands (only when no subcommand given)
complete -c peon -n __peon_no_subcommand -a pause -d "Mute sounds"
complete -c peon -n __peon_no_subcommand -a resume -d "Unmute sounds"
complete -c peon -n __peon_no_subcommand -a mute -d "Alias for 'pause' — mute sounds"
complete -c peon -n __peon_no_subcommand -a unmute -d "Alias for 'resume' — unmute sounds"
complete -c peon -n __peon_no_subcommand -a toggle -d "Toggle mute on/off"
complete -c peon -n __peon_no_subcommand -a status -d "Show current status"
complete -c peon -n "__peon_using_subcommand status" -l verbose -d "Show full details"
complete -c peon -n __peon_no_subcommand -a volume -d "Get or set volume level"
complete -c peon -n __peon_no_subcommand -a rotation -d "Get or set pack rotation mode"
complete -c peon -n __peon_no_subcommand -a packs -d "Manage sound packs"
complete -c peon -n __peon_no_subcommand -a sounds -d "Enable/disable individual sounds in a pack"
complete -c peon -n __peon_no_subcommand -a notifications -d "Control desktop notifications"
complete -c peon -n __peon_no_subcommand -a mobile -d "Configure mobile push notifications"
complete -c peon -n __peon_no_subcommand -a debug -d "Toggle debug logging"
complete -c peon -n __peon_no_subcommand -a logs -d "View or manage log files"
complete -c peon -n __peon_no_subcommand -a relay -d "Start audio relay for devcontainers"
complete -c peon -n __peon_no_subcommand -a trainer -d "Exercise trainer mode"
complete -c peon -n __peon_no_subcommand -a update -d "Update peon-ping and refresh sound packs"
complete -c peon -n __peon_no_subcommand -a help -d "Show help message"
# packs subcommands
complete -c peon -n "__peon_using_subcommand packs" -a list -d "List installed sound packs"
complete -c peon -n "__peon_using_subcommand packs" -a use -d "Switch to a specific pack"
complete -c peon -n "__peon_using_subcommand packs" -a next -d "Cycle to the next pack"
complete -c peon -n "__peon_using_subcommand packs" -a install -d "Download and install new packs"
complete -c peon -n "__peon_using_subcommand packs" -a install-local -d "Install a pack from a local directory" -F
complete -c peon -n "__peon_using_subcommand packs" -a remove -d "Remove specific packs"
complete -c peon -n "__peon_using_subcommand packs" -a rotation -d "Manage pack rotation list"
complete -c peon -n "__peon_using_subcommand packs" -a bind -d "Bind a pack to the current directory"
complete -c peon -n "__peon_using_subcommand packs" -a unbind -d "Remove pack binding for current directory"
complete -c peon -n "__peon_using_subcommand packs" -a bindings -d "List all directory-to-pack bindings"
complete -c peon -n "__peon_using_subcommand packs" -a ide-bind -d "Bind a pack to an IDE id"
complete -c peon -n "__peon_using_subcommand packs" -a ide-unbind -d "Remove an IDE binding"
complete -c peon -n "__peon_using_subcommand packs" -a ide-bindings -d "List all IDE-to-pack bindings"
complete -c peon -n "__peon_using_subcommand packs" -a exclude -d "Manage path exclusions for path_rules"
complete -c peon -n "__peon_using_subcommand packs" -a community -d "List all packs from registry"
complete -c peon -n "__peon_using_subcommand packs" -a search -d "Search registry packs by name"
# packs rotation subcommands
complete -c peon -n "__peon_packs_subcommand rotation" -a list -d "Show current rotation list and mode"
complete -c peon -n "__peon_packs_subcommand rotation" -a add -d "Add pack(s) to rotation"
complete -c peon -n "__peon_packs_subcommand rotation" -a remove -d "Remove pack(s) from rotation"
complete -c peon -n "__peon_packs_subcommand rotation" -a clear -d "Clear all packs from rotation"
# packs rotation add --install flag
function __peon_rotation_add
set -l cmd (commandline -opc)
test (count $cmd) -ge 4; and test $cmd[2] = packs; and test $cmd[3] = rotation; and test $cmd[4] = add
end
complete -c peon -n __peon_rotation_add -a "--install" -d "Install from registry if needed"
# packs install options
complete -c peon -n "__peon_packs_subcommand install" -a "--all" -d "Install all packs from registry"
complete -c peon -n "__peon_packs_subcommand install" -a "--lang" -d "Filter packs by language (e.g. --lang=en,fr)"
# packs list options
complete -c peon -n "__peon_packs_subcommand list" -a "--registry" -d "List all available packs from registry"
complete -c peon -n "__peon_packs_subcommand list" -a "--lang" -d "Filter by language (e.g. --lang=en)"
# Pack name completions for 'packs use' and 'packs remove'
complete -c peon -n "__peon_packs_subcommand use" -a "(
set -l packs_dir (set -q CLAUDE_PEON_DIR; and echo \$CLAUDE_PEON_DIR; or echo \$HOME/.claude/hooks/peon-ping)/packs
if not test -d \$packs_dir; and test -d \$HOME/.openpeon/packs
set packs_dir \$HOME/.openpeon/packs
end
if test -d \$packs_dir
for manifest in \$packs_dir/*/manifest.json \$packs_dir/*/openpeon.json
basename (dirname \$manifest)
end
end
)"
complete -c peon -n "__peon_packs_subcommand bind" -a "(
set -l packs_dir (set -q CLAUDE_PEON_DIR; and echo \$CLAUDE_PEON_DIR; or echo \$HOME/.claude/hooks/peon-ping)/packs
if not test -d \$packs_dir; and test -d \$HOME/.openpeon/packs
set packs_dir \$HOME/.openpeon/packs
end
if test -d \$packs_dir
for manifest in \$packs_dir/*/manifest.json \$packs_dir/*/openpeon.json
basename (dirname \$manifest)
end
end
)"
complete -c peon -n "__peon_packs_subcommand ide-bind" -a "claude codex cursor opencode kilo kiro gemini copilot windsurf kimi antigravity amp deepagents openclaw rovodev"
complete -c peon -n "__peon_packs_subcommand ide-unbind" -a "claude codex cursor opencode kilo kiro gemini copilot windsurf kimi antigravity amp deepagents openclaw rovodev"
complete -c peon -n "__peon_packs_subcommand ide-bind; and test (count (commandline -opc)) -eq 4" -a "(
set -l packs_dir (set -q CLAUDE_PEON_DIR; and echo \$CLAUDE_PEON_DIR; or echo \$HOME/.claude/hooks/peon-ping)/packs
if not test -d \$packs_dir; and test -d \$HOME/.openpeon/packs
set packs_dir \$HOME/.openpeon/packs
end
if test -d \$packs_dir
for manifest in \$packs_dir/*/manifest.json \$packs_dir/*/openpeon.json
basename (dirname \$manifest)
end
end
)"
complete -c peon -n "__peon_packs_subcommand ide-bind; and test (count (commandline -opc)) -eq 5" -a "--install" -d "Install from registry if needed"
complete -c peon -n "__peon_packs_subcommand exclude" -a "add remove list"
complete -c peon -n "__peon_packs_subcommand remove" -a "(
set -l packs_dir (set -q CLAUDE_PEON_DIR; and echo \$CLAUDE_PEON_DIR; or echo \$HOME/.claude/hooks/peon-ping)/packs
if not test -d \$packs_dir; and test -d \$HOME/.openpeon/packs
set packs_dir \$HOME/.openpeon/packs
end
if test -d \$packs_dir
for manifest in \$packs_dir/*/manifest.json \$packs_dir/*/openpeon.json
basename (dirname \$manifest)
end
end
)"
# debug subcommands
complete -c peon -n "__peon_using_subcommand debug" -a on -d "Enable debug logging"
complete -c peon -n "__peon_using_subcommand debug" -a off -d "Disable debug logging"
complete -c peon -n "__peon_using_subcommand debug" -a status -d "Show debug logging status"
# logs subcommands
complete -c peon -n "__peon_using_subcommand logs" -a "--last" -d "Show last N lines from latest log"
complete -c peon -n "__peon_using_subcommand logs" -a "--session" -d "Show entries for a session"
complete -c peon -n "__peon_using_subcommand logs" -a "--prune" -d "Delete old log files"
complete -c peon -n "__peon_using_subcommand logs" -a "--clear" -d "Delete all log files"
# mobile subcommands
complete -c peon -n "__peon_using_subcommand mobile" -a ntfy -d "Set up ntfy.sh notifications"
complete -c peon -n "__peon_using_subcommand mobile" -a pushover -d "Set up Pushover notifications"
complete -c peon -n "__peon_using_subcommand mobile" -a telegram -d "Set up Telegram notifications"
complete -c peon -n "__peon_using_subcommand mobile" -a on -d "Enable mobile notifications"
complete -c peon -n "__peon_using_subcommand mobile" -a off -d "Disable mobile notifications"
complete -c peon -n "__peon_using_subcommand mobile" -a status -d "Show mobile config"
complete -c peon -n "__peon_using_subcommand mobile" -a test -d "Send test notification"
# rotation subcommands
complete -c peon -n "__peon_using_subcommand rotation" -a random -d "Pick a random pack each session (default)"
complete -c peon -n "__peon_using_subcommand rotation" -a round-robin -d "Cycle through packs in order"
complete -c peon -n "__peon_using_subcommand rotation" -a shuffle -d "Pick a random pack for every sound event"
complete -c peon -n "__peon_using_subcommand rotation" -a session_override -d "Assign pack per session via /peon-ping-use"
# Helper: true when notifications subcommand is active and second arg matches
function __peon_notif_subcommand
set -l cmd (commandline -opc)
test (count $cmd) -ge 3; and test $cmd[2] = notifications; and test $cmd[3] = $argv[1]
end
# notifications subcommands
complete -c peon -n "__peon_using_subcommand notifications" -a on -d "Enable desktop notifications"
complete -c peon -n "__peon_using_subcommand notifications" -a off -d "Disable desktop notifications"
complete -c peon -n "__peon_using_subcommand notifications" -a overlay -d "Use large overlay banners"
complete -c peon -n "__peon_using_subcommand notifications" -a standard -d "Use standard system notifications"
complete -c peon -n "__peon_using_subcommand notifications" -a position -d "Get or set overlay position"
complete -c peon -n "__peon_using_subcommand notifications" -a dismiss -d "Get or set auto-dismiss time"
complete -c peon -n "__peon_using_subcommand notifications" -a label -d "Get, set, or reset notification label"
complete -c peon -n "__peon_using_subcommand notifications" -a test -d "Send test notification"
# notifications position values
complete -c peon -n "__peon_notif_subcommand position" -a "top-center" -d "Top center (default)"
complete -c peon -n "__peon_notif_subcommand position" -a "top-right" -d "Top right corner"
complete -c peon -n "__peon_notif_subcommand position" -a "top-left" -d "Top left corner"
complete -c peon -n "__peon_notif_subcommand position" -a "bottom-right" -d "Bottom right corner"
complete -c peon -n "__peon_notif_subcommand position" -a "bottom-left" -d "Bottom left corner"
complete -c peon -n "__peon_notif_subcommand position" -a "bottom-center" -d "Bottom center"
# notifications label values
complete -c peon -n "__peon_notif_subcommand label" -a reset -d "Clear label override"
# logs --session --all (conditional: only after --session)
complete -c peon -n "__peon_using_subcommand logs; and __fish_seen_argument -l session" -a "--all" -d "Search across all log files"
# trainer subcommands
complete -c peon -n "__peon_using_subcommand trainer" -a on -d "Enable trainer mode"
complete -c peon -n "__peon_using_subcommand trainer" -a off -d "Disable trainer mode"
complete -c peon -n "__peon_using_subcommand trainer" -a status -d "Show today's progress"
complete -c peon -n "__peon_using_subcommand trainer" -a log -d "Log completed reps"
complete -c peon -n "__peon_using_subcommand trainer" -a goal -d "Set exercise goals"
complete -c peon -n "__peon_using_subcommand trainer" -a help -d "Show trainer help"
# Helper: true when trainer goal subcommand is active
function __peon_trainer_goal
set -l cmd (commandline -opc)
test (count $cmd) -ge 3; and test $cmd[2] = trainer; and test $cmd[3] = goal
end
# sounds subcommands
complete -c peon -n "__peon_using_subcommand sounds" -a list -d "List sounds in a pack"
complete -c peon -n "__peon_using_subcommand sounds" -a disable -d "Disable an individual sound"
complete -c peon -n "__peon_using_subcommand sounds" -a enable -d "Re-enable an individual sound"
# trainer goal weekday completions (short names)
complete -c peon -n __peon_trainer_goal -a mon -d "Monday"
complete -c peon -n __peon_trainer_goal -a tue -d "Tuesday"
complete -c peon -n __peon_trainer_goal -a wed -d "Wednesday"
complete -c peon -n __peon_trainer_goal -a thu -d "Thursday"
complete -c peon -n __peon_trainer_goal -a fri -d "Friday"
complete -c peon -n __peon_trainer_goal -a sat -d "Saturday"
complete -c peon -n __peon_trainer_goal -a sun -d "Sunday"
+10
View File
@@ -0,0 +1,10 @@
source /usr/share/cachyos-fish-config/cachyos-config.fish
# overwrite greeting
# potentially disabling fastfetch
#function fish_greeting
# # smth smth
#end
# peon-ping quick controls
function peon; bash /home/dank/.claude/hooks/peon-ping/peon.sh $argv; end
@@ -0,0 +1 @@
theme = Retro Legends
@@ -0,0 +1,75 @@
# Ghostty Configuration
# Clean, simplified config for Terminess Nerd Font Mono with Catppuccin Mocha
# ── Theme ──────────────────────────────────────────────────────────────────────
theme = "Retro Legends"
# ── Font ───────────────────────────────────────────────────────────────────────
font-family = "Terminess Nerd Font Mono"
font-size = 14
font-feature = "calt=1"
font-feature = "ss01=1"
font-feature = "ss02=1"
font-feature = "ss03=1"
font-feature = "ss04=1"
font-feature = "ss05=1"
font-feature = "ss06=1"
font-feature = "ss07=1"
font-feature = "ss08=1"
font-feature = "ss09=1"
font-feature = "ss10=1"
font-feature = "zero=1"
font-feature = "onum=1"
font-feature = "liga=1"
# ── Appearance ─────────────────────────────────────────────────────────────────
window-padding-x = 12
window-padding-y = 12
window-padding-balance = true
window-padding-color = extend
background-opacity = 0.92
background-blur = 25
unfocused-split-opacity = 0.7
window-theme = ghostty
window-titlebar-background = "#181825"
window-titlebar-foreground = "#cdd6f4"
# ── Scrollback & Scrolling ─────────────────────────────────────────────────────
scrollback-limit = 50000000
scroll-to-bottom = keystroke,no-output
mouse-scroll-multiplier = precision:2,discrete:6
# ── Selection & Mouse ──────────────────────────────────────────────────────────
mouse-hide-while-typing = true
# ── Bell ───────────────────────────────────────────────────────────────────────
bell-features = attention,title
# ── Palette ────────────────────────────────────────────────────────────────────
palette-generate = true
# ── Icon Adjustment ────────────────────────────────────────────────────────────
adjust-icon-height = -3
# ── Shell Integration ──────────────────────────────────────────────────────────
shell-integration = detect
shell-integration-features = cursor,sudo,title,ssh-env,ssh-terminfo,path
# ── Link Previews ──────────────────────────────────────────────────────────────
link-url = true
link-previews = osc8
# ── Notifications ──────────────────────────────────────────────────────────────
notify-on-command-finish = unfocused
notify-on-command-finish-action = bell,notify
notify-on-command-finish-after = 3s
# ── Resize Overlay ─────────────────────────────────────────────────────────────
resize-overlay = after-first
resize-overlay-position = center
resize-overlay-duration = 500ms
# ── Keybinds ───────────────────────────────────────────────────────────────────
# Quick terminal toggle — uses the quick-terminal action
# Note: quick-terminal action toggles the quick terminal popup
# keybind = super+grave=quick-terminal
+1
View File
@@ -0,0 +1 @@
@import url("noctalia.css");
@@ -0,0 +1,53 @@
/*
* GTK Colors (GTK3)
* Generated by Noctalia's Template Processor
* 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 destructive_bg_color #ffb4ab;
@define-color destructive_fg_color #690005;
@define-color error_bg_color #ffb4ab;
@define-color error_fg_color #690005;
@define-color window_bg_color #131318;
@define-color window_fg_color #e4e1e8;
@define-color view_bg_color #131318;
@define-color view_fg_color #e4e1e8;
@define-color headerbar_bg_color #131318;
@define-color headerbar_fg_color #e4e1e8;
@define-color headerbar_backdrop_color @window_bg_color;
@define-color popover_bg_color #1f1f24;
@define-color popover_fg_color #e4e1e8;
@define-color card_bg_color #1f1f24;
@define-color card_fg_color #e4e1e8;
@define-color dialog_bg_color #131318;
@define-color dialog_fg_color #e4e1e8;
@define-color overview_bg_color #1f1f24;
@define-color overview_fg_color #e4e1e8;
@define-color sidebar_bg_color #1f1f24;
@define-color sidebar_fg_color #e4e1e8;
@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;
/* Backdrop/unfocused states */
@define-color theme_unfocused_fg_color @window_fg_color;
@define-color theme_unfocused_text_color @view_fg_color;
@define-color theme_unfocused_bg_color @window_bg_color;
@define-color theme_unfocused_base_color @window_bg_color;
@define-color theme_unfocused_selected_bg_color @accent_bg_color;
@define-color theme_unfocused_selected_fg_color @accent_fg_color;
@@ -0,0 +1,6 @@
[Settings]
gtk-application-prefer-dark-theme=true
gtk-cursor-theme-name=capitaine-cursors
gtk-font-name=Noto Sans 10
gtk-theme-name=adw-gtk3
gtk-cursor-theme-size=36
+1
View File
@@ -0,0 +1 @@
@import url("noctalia.css");
@@ -0,0 +1,103 @@
/*
* GTK Colors (GTK4)
* Generated by Noctalia's Template Processor
* 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 destructive_bg_color #ffb4ab;
@define-color destructive_fg_color #690005;
@define-color error_bg_color #ffb4ab;
@define-color error_fg_color #690005;
@define-color window_bg_color #131318;
@define-color window_fg_color #e4e1e8;
@define-color view_bg_color #131318;
@define-color view_fg_color #e4e1e8;
@define-color headerbar_bg_color #131318;
@define-color headerbar_fg_color #e4e1e8;
@define-color headerbar_backdrop_color @window_bg_color;
@define-color popover_bg_color #1f1f24;
@define-color popover_fg_color #e4e1e8;
@define-color card_bg_color #1f1f24;
@define-color card_fg_color #e4e1e8;
@define-color dialog_bg_color #131318;
@define-color dialog_fg_color #e4e1e8;
@define-color overview_bg_color #1f1f24;
@define-color overview_fg_color #e4e1e8;
@define-color sidebar_bg_color #1f1f24;
@define-color sidebar_fg_color #e4e1e8;
@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;
/* Backdrop/unfocused states */
@define-color theme_unfocused_fg_color @window_fg_color;
@define-color theme_unfocused_text_color @view_fg_color;
@define-color theme_unfocused_bg_color @window_bg_color;
@define-color theme_unfocused_base_color @window_bg_color;
@define-color theme_unfocused_selected_bg_color @accent_bg_color;
@define-color theme_unfocused_selected_fg_color @accent_fg_color;
:root {
--accent-color: #bfc2ff;
--accent-bg-color: #bfc2ff;
--accent-fg-color: #23276f;
--destructive-bg-color: #ffb4ab;
--destructive-fg-color: #690005;
--error-bg-color: #ffb4ab;
--error-fg-color: #690005;
--error-color: #ffb4ab;
--window-bg-color: #131318;
--window-fg-color: #e4e1e8;
--view-bg-color: #131318;
--view-fg-color: #e4e1e8;
--headerbar-bg-color: #131318;
--headerbar-fg-color: #e4e1e8;
--headerbar-backdrop-color: @window_bg_color;
--popover-bg-color: #1f1f24;
--popover-fg-color: #e4e1e8;
--card-bg-color: #1f1f24;
--card-fg-color: #e4e1e8;
--dialog-bg-color: #131318;
--dialog-fg-color: #e4e1e8;
--overview-bg-color: #1f1f24;
--overview-fg-color: #e4e1e8;
--sidebar-bg-color: #1f1f24;
--sidebar-fg-color: #e4e1e8;
--sidebar-backdrop-color: @window_bg_color;
--sidebar-border-color: @window_bg_color;
--warning-bg-color: #6d2f65;
--warning-fg-color: #ffd7f3;
--warning-color: #fcadeb;
--success-color: #c3c4e7;
--success-bg-color: #434462;
--success-fg-color: #e0e0ff;
--shade-color: rgba(0, 0, 0, 0.36);
}
@@ -0,0 +1,32 @@
animations {
workspace-switch {
spring damping-ratio=1.0 stiffness=1000 epsilon=0.0001
}
window-open {
duration-ms 200
curve "ease-out-quad"
}
window-close {
duration-ms 200
curve "ease-out-cubic"
}
horizontal-view-movement {
spring damping-ratio=1.0 stiffness=900 epsilon=0.0001
}
window-movement {
spring damping-ratio=1.0 stiffness=800 epsilon=0.0001
}
window-resize {
spring damping-ratio=1.0 stiffness=1000 epsilon=0.0001
}
config-notification-open-close {
spring damping-ratio=0.6 stiffness=1200 epsilon=0.001
}
screenshot-ui-open {
duration-ms 300
curve "ease-out-quad"
}
overview-open-close {
spring damping-ratio=1.0 stiffness=900 epsilon=0.0001
}
}
@@ -0,0 +1,4 @@
// ────────────── Startup Applications ──────────────
// https://github.com/YaLTeR/niri/wiki/Configuration:-Miscellaneous#spawn-sh-at-startup
spawn-sh-at-startup "qs -c noctalia-shell"
@@ -0,0 +1,21 @@
// ────────────── Output Configuration ──────────────
output "Samsung Electric Company Odyssey G75F HNTY601056" {
mode "3840x2160@60"
scale 1
transform "normal"
position x=0 y=0
}
output "DP-1" {
transform "90"
position x=0 y=0
}
output "DP-3" {
transform "270"
position x=1200 y=0
}
output "eDP-1" {
// no position — auto-placed to the right of DP-* outputs
}
+28
View File
@@ -0,0 +1,28 @@
// ────────────── Input Configuration ──────────────
// https://github.com/YaLTeR/niri/wiki/Configuration:-Input
input {
keyboard {
xkb {
//If you want to overwrite your keyboard layout,
// uncomment the line below and change the layout accordingly.
//layout "us" // Use the American keyboard layout
}
numlock // Enable numlock on startup
}
touchpad {
tap // Enable tap-to-click
natural-scroll // Enable natural (macOS-style) scrolling
}
mouse {
// If you want to disable Mouse Acceleration,
// uncomment the lines below.
//accel-profile "flat"
//accel-speed 0.0
}
focus-follows-mouse // Automatically focus windows under the mouse pointer
workspace-auto-back-and-forth // Enable workspace back & forth switching
}
+142
View File
@@ -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 "qs -c noctalia-shell ipc call launcher toggle"; }
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"; }
// 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"; }
// ─── 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"; }
// ─── 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 { screenshot; }
CTRL+Shift+2 { screenshot-screen; }
CTRL+Shift+3 { screenshot-window; }
// ─── 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; }
}
+14
View File
@@ -0,0 +1,14 @@
layout {
gaps 16 // Gap between windows
center-focused-column "never" // Don’t auto-center focused column
background-color "transparent" // <- needed for noctalia-shell to set wallpaper
preset-column-widths {
proportion 0.33333
proportion 0.5
proportion 0.66667
}
struts {}
}
+26
View File
@@ -0,0 +1,26 @@
prefer-no-csd
screenshot-path null
environment {
ELECTRON_OZONE_PLATFORM_HINT "auto"
QT_QPA_PLATFORM "wayland"
QT_QPA_PLATFORMTHEME "gtk3"
QT_WAYLAND_DISABLE_WINDOWDECORATION "1"
XDG_CURRENT_DESKTOP "niri"
XDG_SESSION_TYPE "wayland"
render-node "/dev/dri/renderD129" // Intel Arc iGPU
}
cursor {
xcursor-theme "capitaine-cursors"
xcursor-size 48
}
debug {
// Allows notification actions and window activation from Noctalia.
honor-xdg-activation-with-invalid-serial
}
hotkey-overlay {
skip-at-startup
}
+22
View File
@@ -0,0 +1,22 @@
window-rule {
geometry-corner-radius 20 // Set every window radius to 20
clip-to-geometry true
}
// if you use steam you will probably like these
window-rule {
match app-id="steam"
exclude title=r#"^[Ss]team$"#
open-floating true
}
window-rule {
match app-id="steam" title=r#"^notificationtoasts_\d+_desktop$"#
default-floating-position x=10 y=10 relative-to="bottom-right"
open-focused false
}
layer-rule {
match namespace="^noctalia-wallpaper*"
place-within-backdrop true
}
+8
View File
@@ -0,0 +1,8 @@
include "./cfg/animation.kdl"
include "./cfg/autostart.kdl"
include "./cfg/keybinds.kdl"
include "./cfg/input.kdl"
include "./cfg/display.kdl"
include "./cfg/layout.kdl"
include "./cfg/rules.kdl"
include "./cfg/misc.kdl"
+1
View File
@@ -0,0 +1 @@
export XCURSOR_SIZE=36
@@ -0,0 +1,12 @@
[Unit]
Description=Shelly Notifications tray service
After=graphical-session.target
[Service]
Type=simple
ExecStart=/usr/bin/shelly-notifications
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=graphical-session.target
File diff suppressed because it is too large Load Diff
+31
View File
@@ -0,0 +1,31 @@
source /usr/share/cachyos-zsh-config/cachyos-config.zsh
# To customize prompt, run `p10k configure` or edit ~/.p10k.zsh.
[[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh
if [ -n "${GHOSTTY_RESOURCES_DIR}" ]; then
builtin source "${GHOSTTY_RESOURCES_DIR}/shell-integration/zsh/ghostty-integration"
fi
# Bun
export PATH="/home/dank/.bun/bin:$PATH"
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
# CUDA toolkit + llama.cpp
export PATH="/opt/cuda/bin:/home/dank/GitPackages/llama.cpp/build/bin:$PATH"
export LD_LIBRARY_PATH="/opt/cuda/lib64:/home/dank/GitPackages/llama.cpp/build:$LD_LIBRARY_PATH"
# GiTea
# Terminal Aliases
alias systemprompt="nvim ~/.pi/agent/SYSTEM.md"
# peon-ping quick controls
alias peon="bash /home/dank/.claude/hooks/peon-ping/peon.sh"
[ -f /home/dank/.claude/hooks/peon-ping/completions.bash ] && source /home/dank/.claude/hooks/peon-ping/completions.bash
# machine-local secrets, never tracked
[ -f "$HOME/.config/environment.d/secrets.env" ] && source "$HOME/.config/environment.d/secrets.env"
+122
View File
@@ -0,0 +1,122 @@
#!/usr/bin/env bash
# deploy.sh — stow-equivalent deployment of the dotfiles/ packages in this repo.
#
# Model: the repo checkout IS the deployment. Packages are home-relative trees
# under dotfiles/<pkg>/; deploying replaces live files with symlinks into the
# repo so `git pull` + `deploy.sh` is the whole propagation story.
#
# Modes:
# deploy.sh sync (default): adopt identicals, link new, quarantine-and-replace divergents
# deploy.sh --check dry-run report only; writes nothing
# deploy.sh --adopt like sync but divergents are reported and SKIPPED, not quarantined
#
# Host divergence: a package named zz-$(hostname) is stowed LAST with override
# semantics (its files replace symlinks from base packages).
#
# Special cases:
# - dconf package: dump.txt is loaded via `dconf load /` instead of symlinked.
# - systemd-user: after linking, daemon-reload + enable --now units whose
# ExecStart binary resolves on THIS machine (silent no-op elsewhere).
set -euo pipefail
REPO="$(git -C "$(dirname "$(realpath "$0")")" rev-parse --show-toplevel 2>/dev/null || true)"
REPO="${DEPLOY_REPO:-$REPO}"
PKGS_DIR="$REPO/dotfiles"
HOST="${DEPLOY_HOST:-$(hostname)}"
QUAR="$REPO/.quarantine"
MODE="sync"
case "${1:-}" in
--check) MODE="check" ;;
--adopt) MODE="adopt" ;;
""|sync) MODE="sync" ;;
*) echo "usage: deploy.sh [--check|--adopt|sync]" >&2; exit 2 ;;
esac
[ -d "$PKGS_DIR" ] || { echo "deploy.sh: no dotfiles/ under $REPO" >&2; exit 1; }
# packages = all dirs in dotfiles/, override package last
mapfile -t PKGS < <(find "$PKGS_DIR" -maxdepth 1 -mindepth 1 -type d ! -name "zz-*" | sort)
OVR="$PKGS_DIR/zz-$HOST"
[ -d "$OVR" ] && PKGS+=("$OVR")
actions=0; quarantined=0; skipped=0
deploy_file() { # $1 = repo file path, $2 = home-relative target path
local src="$1" tgt="$HOME/$2"
if [ -L "$tgt" ]; then
if [ "$(realpath "$tgt")" = "$(realpath "$src")" ]; then return 0; fi # already deployed
case "$MODE" in
check) echo "DRIFT $2 (symlink points elsewhere: $(realpath "$tgt"))" ;;
adopt) echo "SKIP $2 (foreign symlink, --adopt does not overwrite)" ; skipped=$((skipped+1)) ;;
sync)
ts="$(date +%Y%m%d-%H%M%S)-$$"
dest="$QUAR/$HOST/$ts/$2"
mkdir -p "$(dirname "$dest")"
mv -- "$tgt" "$dest"
ln -sfn "$(realpath "$src")" "$tgt"
actions=$((actions+1)); quarantined=$((quarantined+1))
echo "QUAR $2 -> .quarantine/$HOST/$ts/$2"
;;
esac
return 0
fi
if [ -e "$tgt" ]; then
if cmp -s "$src" "$tgt"; then
if [ "$MODE" = "check" ]; then echo "ADOPT $2 (identical, will symlink)"; return 0; fi
ln -sfn "$(realpath "$src")" "$tgt"; actions=$((actions+1)); return 0
fi
case "$MODE" in
check) echo "DRIFT $2 (differs from repo; sync would quarantine)" ;;
adopt) echo "SKIP $2 (divergent, --adopt does not overwrite)" ; skipped=$((skipped+1)) ;;
sync)
ts="$(date +%Y%m%d-%H%M%S)-$$"
dest="$QUAR/$HOST/$ts/$2"
mkdir -p "$(dirname "$dest")"
mv -- "$tgt" "$dest"
ln -sfn "$(realpath "$src")" "$tgt"
actions=$((actions+1)); quarantined=$((quarantined+1))
echo "QUAR $2 -> .quarantine/$HOST/$ts/$2"
;;
esac
return 0
fi
if [ "$MODE" = "check" ]; then echo "LINK $2 (missing, will symlink)"; return 0; fi
mkdir -p "$(dirname "$tgt")"
ln -sfn "$(realpath "$src")" "$tgt"; actions=$((actions+1))
}
for pkg in "${PKGS[@]}"; do
pkgname="$(basename "$pkg")"
# dconf package: load dump instead of symlinking
if [ "$pkgname" = "dconf" ] && [ -f "$pkg/dump.txt" ]; then
if [ "$MODE" != "check" ]; then
if command -v dconf >/dev/null; then dconf load / < "$pkg/dump.txt" && echo "LOAD $pkgname/dump.txt -> dconf"; fi
else
echo "LOAD $pkgname/dump.txt (dconf load / would run on sync)"
fi
continue
fi
while IFS= read -r -d '' f; do
deploy_file "$f" "${f#"$pkg"/}"
done < <(find "$pkg" -type f ! -name 'dump.txt' -print0)
done
if [ "$MODE" != "check" ] && [ -d "$PKGS_DIR/systemd-user/.config/systemd/user" ]; then
systemctl --user daemon-reload || true
for unit in "$PKGS_DIR"/systemd-user/.config/systemd/user/*.service; do
[ -e "$unit" ] || continue
bin="$(sed -n 's/^ExecStart=\([^ ]*\).*/\1/p' "$unit" | head -1)"
if [ -n "$bin" ] && command -v "$bin" >/dev/null 2>&1; then
systemctl --user enable --now "$(basename "$unit")" || true
echo "ENABLE $(basename "$unit") (ExecStart resolves here)"
else
echo "SKIP $(basename "$unit") (ExecStart '$bin' absent on this host)"
fi
done
fi
# keep the secret gate armed on every machine that deploys
git -C "$REPO" config core.hooksPath .githooks
echo "deploy.sh [$MODE] host=$HOST repo=$REPO — actions=$actions quarantined=$quarantined skipped=$skipped"