mirror of
https://github.com/bgrolleman/dotfiles.git
synced 2026-11-08 15:50:29 +01:00
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:
1 parent
cb80e100f4
commit
227ea2371b
6 files changed
+130
-80
No files matched your search
@@ -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).
|
||||||
|
|||||||
@@ -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
@@ -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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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
@@ -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
@@ -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}'),}"
|
||||||
Reference in new issue
Block a user