Cleanup dotfiles: niri float rules, tmux agent status, noctalia, claude settings

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
bgrollemanandClaude Sonnet 5.5 committed 2026-10-10 11:10:33 +02:00
1 parent cb80e100f4
commit 227ea2371b
6 files changed
+130 -80

No files matched your search

+8
View File
@@ -1,5 +1,13 @@
# Changelog # Changelog
## 2026-10-10 (cleanup)
- Niri: floating windows open bottom-left by default; Picture-in-picture floats at a fixed offset.
- Noctalia v4 `settings.json`: move workspaces and system monitor to the right, add taskbar, enable idle.
- tmux: add per-window agent status indicator, 2s status refresh and a Prefix+Tab window switcher popup.
- Claude settings: pin model to sonnet, add herdr SessionStart hook, humanizer and ui-ux-pro-max plugins.
- CLAUDE.md: document claude/fish/kanshi linking, `workspaces.kdl` and the tmux helper script living outside the repo.
## 2026-10-10 ## 2026-10-10
- Fix niri login: Mod+T bind had three actions, niri rejected the config and fell back to defaults (no bar, no kanshi). - Fix niri login: Mod+T bind had three actions, niri rejected the config and fell back to defaults (no bar, no kanshi).
+6 -3
View File
@@ -8,7 +8,7 @@ Personal dotfiles for a Linux desktop, currently running **Niri** (Wayland compo
## Deployment ## Deployment
Configs are deployed by symlinking into `~/.config/` and `~/.profile`: Configs are deployed by symlinking into `~/.config/`, `~/.profile` and `~/.claude/settings.json` (fish is linked per file):
```bash ```bash
bash ~/.dotfiles/setup.sh bash ~/.dotfiles/setup.sh
@@ -35,13 +35,14 @@ This installs ansible if missing, then runs the playbook. Tasks are split by cat
- `display.kdl` — monitor layout and scaling - `display.kdl` — monitor layout and scaling
- `autostart.kdl` — apps launched on compositor start - `autostart.kdl` — apps launched on compositor start
- `rules.kdl` — window-specific rules - `rules.kdl` — window-specific rules
- `workspaces.kdl` — named workspaces
- `animation.kdl`, `misc.kdl` — tweaks - `animation.kdl`, `misc.kdl` — tweaks
Edit the relevant split file, not `config.kdl` itself. Edit the relevant split file, not `config.kdl` itself.
### Noctalia (desktop shell / bar) ### Noctalia (desktop shell / bar)
Runs **Noctalia v5** (`noctalia`, native). Config is `noctalia/config.toml` (TOML, hot-reloaded); validate with `noctalia config validate`. Runs **Noctalia v5** (`noctalia`, native). Config is `noctalia/config.toml` (TOML, hot-reloaded); validate with `noctalia config validate`.
`noctalia/settings.json` is the legacy v4 config. See `docs/noctalia-v5.md` for details and `CHANGELOG.md` for history. `noctalia/settings.json` is the legacy v4 config (kept for rollback, still tweaked occasionally). See `docs/noctalia-v5.md` for details and `CHANGELOG.md` for history.
### Neovim ### Neovim
Uses **LazyVIM** framework. Entry point is `nvim/init.lua` which bootstraps lazy.nvim via `nvim/lua/config/lazy.lua`. Uses **LazyVIM** framework. Entry point is `nvim/init.lua` which bootstraps lazy.nvim via `nvim/lua/config/lazy.lua`.
@@ -53,13 +54,15 @@ Uses **LazyVIM** framework. Entry point is `nvim/init.lua` which bootstraps lazy
LazyVIM handles most plugin management; only deviations from LazyVIM defaults need entries in `lua/plugins/`. LazyVIM handles most plugin management; only deviations from LazyVIM defaults need entries in `lua/plugins/`.
### tmux ### tmux
`tmux/tmux.conf` + catppuccin theme as a git submodule at `tmux/plugins/catppuccin/tmux`. After cloning, initialize the submodule: `tmux/tmux.conf` + catppuccin theme as a git submodule at `tmux/plugins/catppuccin/tmux`. The agent-status indicators call `~/.local/bin/tmux-window-agent-status`, which is **not** in this repo. After cloning, initialize the submodule:
```bash ```bash
git submodule update --init git submodule update --init
``` ```
### Shell / profile ### Shell / profile
`fish/` holds the fish config (`config.fish`, `conf.d/ssh-keychain.fish`); machine-specific vars go in untracked `~/.config/fish/local.fish`.
`profile` is symlinked to `~/.profile`. It sets up SSH keys via `keychain` and defines the `notes` alias (attaches/creates a tmux session with nvim opening `~/Notes/Personal`). `profile` is symlinked to `~/.profile`. It sets up SSH keys via `keychain` and defines the `notes` alias (attaches/creates a tmux session with nvim opening `~/Notes/Personal`).
`zoxide.bash` provides shell integration for zoxide (directory jumping) — sourced separately, not via `profile`. `zoxide.bash` provides shell integration for zoxide (directory jumping) — sourced separately, not via `profile`.
+42 -15
View File
@@ -2,17 +2,8 @@
"permissions": { "permissions": {
"defaultMode": "auto" "defaultMode": "auto"
}, },
"model": "sonnet",
"hooks": { "hooks": {
"Stop": [
{
"hooks": [
{
"type": "command",
"command": "notify-send 'Claude' 'Task complete' --icon=dialog-information 2>/dev/null || true"
}
]
}
],
"Notification": [ "Notification": [
{ {
"hooks": [ "hooks": [
@@ -22,6 +13,28 @@
} }
] ]
} }
],
"SessionStart": [
{
"matcher": "*",
"hooks": [
{
"type": "command",
"command": "bash '/home/bgrolleman/.claude/hooks/herdr-agent-state.sh' session",
"timeout": 10
}
]
}
],
"Stop": [
{
"hooks": [
{
"type": "command",
"command": "notify-send 'Claude' 'Task complete' --icon=dialog-information 2>/dev/null || true"
}
]
}
] ]
}, },
"statusLine": { "statusLine": {
@@ -30,20 +43,34 @@
}, },
"enabledPlugins": { "enabledPlugins": {
"frontend-design@claude-plugins-official": true, "frontend-design@claude-plugins-official": true,
"humanizer@humanizer": true,
"lua-lsp@claude-plugins-official": true, "lua-lsp@claude-plugins-official": true,
"ponytail@ponytail": true "ponytail@ponytail": true,
"ui-ux-pro-max@ui-ux-pro-max-skill": true
}, },
"extraKnownMarketplaces": { "extraKnownMarketplaces": {
"caveman": {
"source": {
"source": "github",
"repo": "juliusbrussee/caveman"
}
},
"humanizer": {
"source": {
"source": "github",
"repo": "blader/humanizer"
}
},
"ponytail": { "ponytail": {
"source": { "source": {
"source": "github", "source": "github",
"repo": "DietrichGebert/ponytail" "repo": "DietrichGebert/ponytail"
} }
}, },
"caveman": { "ui-ux-pro-max-skill": {
"source": { "source": {
"source": "github", "source": "github",
"repo": "juliusbrussee/caveman" "repo": "nextlevelbuilder/ui-ux-pro-max-skill"
} }
} }
}, },
@@ -59,10 +86,10 @@
"voiceEnabled": true, "voiceEnabled": true,
"mcpServers": { "mcpServers": {
"comfyui-image-gen": { "comfyui-image-gen": {
"command": "/home/bgrolleman/Project/ComfyUI/.venv/bin/python",
"args": [ "args": [
"/home/bgrolleman/Project/ComfyUI/mcp_server.py" "/home/bgrolleman/Project/ComfyUI/mcp_server.py"
] ],
"command": "/home/bgrolleman/Project/ComfyUI/.venv/bin/python"
} }
} }
} }
+7
View File
@@ -1,6 +1,7 @@
window-rule { window-rule {
geometry-corner-radius 5 // Set every window radius to 20 geometry-corner-radius 5 // Set every window radius to 20
clip-to-geometry true clip-to-geometry true
default-floating-position x=10 y=10 relative-to="bottom-left"
} }
// if you use steam you will probably like these // if you use steam you will probably like these
@@ -16,6 +17,12 @@
open-focused false open-focused false
} }
window-rule {
match title="^Picture-in-picture$"
open-floating true
default-floating-position x=50 y=50 relative-to="bottom-left"
}
layer-rule { layer-rule {
match namespace="^noctalia-wallpaper*" match namespace="^noctalia-wallpaper*"
place-within-backdrop true place-within-backdrop true
+55 -53
View File
@@ -87,6 +87,22 @@
"id": "Clock", "id": "Clock",
"tooltipFormat": "HH:mm ddd, MMM dd", "tooltipFormat": "HH:mm ddd, MMM dd",
"useCustomFont": false "useCustomFont": false
},
{
"compactMode": false,
"hideMode": "hidden",
"hideWhenIdle": true,
"id": "MediaMini",
"maxWidth": 500,
"panelShowAlbumArt": true,
"scrollingMode": "hover",
"showAlbumArt": true,
"showArtistFirst": true,
"showProgressRing": true,
"showVisualizer": false,
"textColor": "none",
"useFixedWidth": false,
"visualizerType": "linear"
} }
], ],
"left": [ "left": [
@@ -100,6 +116,42 @@
"id": "Launcher", "id": "Launcher",
"useDistroLogo": false "useDistroLogo": false
}, },
{
"colorizeIcons": false,
"hideMode": "hidden",
"iconScale": 0.8,
"id": "Taskbar",
"maxTaskbarWidth": 40,
"onlyActiveWorkspaces": true,
"onlySameOutput": true,
"showPinnedApps": false,
"showTitle": true,
"smartWidth": true,
"titleWidth": 120
}
],
"right": [
{
"characterCount": 2,
"colorizeIcons": false,
"emptyColor": "secondary",
"enableScrollWheel": true,
"focusedColor": "primary",
"followFocusedScreen": false,
"fontWeight": "bold",
"groupedBorderOpacity": 1,
"hideUnoccupied": true,
"iconScale": 0.8,
"id": "Workspace",
"labelMode": "name",
"occupiedColor": "secondary",
"pillSize": 0.6,
"showApplications": true,
"showApplicationsHover": false,
"showBadge": true,
"showLabelsOnlyWhenOccupied": true,
"unfocusedIconsOpacity": 1
},
{ {
"compactMode": true, "compactMode": true,
"diskPath": "/", "diskPath": "/",
@@ -122,56 +174,6 @@
"useMonospaceFont": true, "useMonospaceFont": true,
"usePadding": false "usePadding": false
}, },
{
"compactMode": false,
"hideMode": "hidden",
"hideWhenIdle": false,
"id": "MediaMini",
"maxWidth": 145,
"panelShowAlbumArt": true,
"scrollingMode": "hover",
"showAlbumArt": true,
"showArtistFirst": true,
"showProgressRing": true,
"showVisualizer": false,
"textColor": "none",
"useFixedWidth": false,
"visualizerType": "linear"
},
{
"characterCount": 2,
"colorizeIcons": false,
"emptyColor": "secondary",
"enableScrollWheel": true,
"focusedColor": "primary",
"followFocusedScreen": false,
"fontWeight": "bold",
"groupedBorderOpacity": 1,
"hideUnoccupied": false,
"iconScale": 0.8,
"id": "Workspace",
"labelMode": "name",
"occupiedColor": "secondary",
"pillSize": 0.6,
"showApplications": false,
"showApplicationsHover": false,
"showBadge": true,
"showLabelsOnlyWhenOccupied": true,
"unfocusedIconsOpacity": 1
},
{
"colorizeIcons": false,
"hideMode": "visible",
"id": "ActiveWindow",
"maxWidth": 350,
"scrollingMode": "hover",
"showIcon": true,
"showText": true,
"textColor": "none",
"useFixedWidth": true
}
],
"right": [
{ {
"blacklist": [ "blacklist": [
], ],
@@ -453,7 +455,7 @@
}, },
"idle": { "idle": {
"customCommands": "[]", "customCommands": "[]",
"enabled": false, "enabled": true,
"fadeDuration": 5, "fadeDuration": 5,
"lockCommand": "", "lockCommand": "",
"lockTimeout": 660, "lockTimeout": 660,
@@ -463,7 +465,7 @@
"screenOffCommand": "", "screenOffCommand": "",
"screenOffTimeout": 600, "screenOffTimeout": 600,
"suspendCommand": "", "suspendCommand": "",
"suspendTimeout": 1800 "suspendTimeout": 0
}, },
"location": { "location": {
"analogClockInCalendar": false, "analogClockInCalendar": false,
@@ -488,7 +490,7 @@
"bluetoothRssiPollIntervalMs": 60000, "bluetoothRssiPollIntervalMs": 60000,
"bluetoothRssiPollingEnabled": false, "bluetoothRssiPollingEnabled": false,
"disableDiscoverability": false, "disableDiscoverability": false,
"networkPanelView": "ethernet", "networkPanelView": "wifi",
"wifiDetailsViewMode": "list" "wifiDetailsViewMode": "list"
}, },
"nightLight": { "nightLight": {
+12 -9
View File
@@ -14,19 +14,22 @@ set -g @catppuccin_window_status_style "slanted"
# Load catppuccin # Load catppuccin
run ~/.config/tmux/plugins/catppuccin/tmux/catppuccin.tmux run ~/.config/tmux/plugins/catppuccin/tmux/catppuccin.tmux
# Make the status line pretty and add some modules # Status line on top (tmux only supports top/bottom, no vertical sidebar)
set-option -g status-position top set-option -g status-position top
set -g status-right-length 100 set -g status-right-length 100
set -g status-left-length 100 set -g status-left-length 100
set -g status-left "#[fg=#{@thm_teal},bg=#{@thm_crust}]#[fg=#{@thm_crust},bg=#{@thm_teal}] #(hostname -s) " set -g status-left "#[fg=#{@thm_teal},bg=#{@thm_crust}]#[fg=#{@thm_crust},bg=#{@thm_teal}] #(hostname -s) "
#set -g status-left "#[fg=$thm_green,bg=$thm_bg,nobold,nounderscore,noitalics]#[fg=$thm_bg,bg=$thm_green,nobold,nounderscore,noitalics] #[fg=$thm_fg,bg=$thm_bg]#(hostname -s) "
set -g status-right "#{E:@catppuccin_status_application}" set -g status-right "#{E:@catppuccin_status_application}"
#set -agF status-right "#{E:@catppuccin_status_cpu}"
set -ag status-right "#{E:@catppuccin_status_session}" set -ag status-right "#{E:@catppuccin_status_session}"
#set -ag status-right "#{E:@catppuccin_status_uptime}"
#set -agF status-right "#{E:@catppuccin_status_battery}"
#run ~/.config/tmux/plugins/tmux-plugins/tmux-cpu/cpu.tmux # Per-window agent indicator: 🤖 = busy, ⏸ = waiting for input
#run ~/.config/tmux/plugins/tmux-plugins/tmux-battery/battery.tmux set -g @catppuccin_window_text " #W#(~/.local/bin/tmux-window-agent-status '#{session_name}' '#I')"
set -g @catppuccin_window_current_text " #W#(~/.local/bin/tmux-window-agent-status '#{session_name}' '#I')"
# Refresh status regularly so agent indicators stay current
set -g status-interval 2
# Vertical window switcher ("sidebar"): prefix+Tab opens a popup listing all
# windows top-to-bottom with agent status; Enter jumps to the selected window
bind-key Tab choose-tree -Zw -F "#{?window_format,#W#(~/.local/bin/tmux-window-agent-status '#{session_name}' '#{window_index}'),}"