Skip to content

Latest commit

 

History

History
274 lines (215 loc) · 15.5 KB

File metadata and controls

274 lines (215 loc) · 15.5 KB

Collie's Dotfiles

CI macOS Arch Ubuntu Debian Mint Windows

Personal dotfiles managed with chezmoi. One repo, several machines.

Install

chezmoi init --apply collieiscute -v

Supported platforms

OS Package manager Status
macOS Homebrew daily-driven
Arch pacman + paru daily-driven
Ubuntu / Debian / Linux Mint apt CI-tested only
Windows Scoop CI-tested only

Custom touches worth knowing

Theme

  • Linux uses Noctalia's wallpaper-derived light palette; macOS and Windows use Matugen with the same per-app theme paths.
  • Generated app themes stay outside chezmoi. .chezmoiexternal.toml only pins the Matugen template inputs.
  • Fish inherits the terminal ANSI palette; cursor themes stay independent.
  • Font: JetBrainsMono Nerd Font across every terminal / bar / lock screen.

chezmoi quirks I keep tripping over (that this repo handles)

  • run_onchange_* scripts only re-run when their rendered content changes. Manifest files (fish_plugins, Brewfile) that aren't templated into the script bodies don't trigger reruns. Both are pinned via embedded sha256 hash comments — see run_onchange_after_1-setup-fish-and-its-plugins.sh.tmpl and install-packages_darwin.tmpl.
  • All apt-based distros share .packages.ubuntu.apt and the lazygit-from-GitHub fallback (lazygit isn't in Ubuntu apt).
  • Fonts use the Nerd Font patched family (JetBrainsMono Nerd Font), not the un-patched JetBrains Mono — drop that distinction and bar icons disappear.

Dropbox

  • Hyprland starts dropbox-cli headlessly when the command is installed (currently via AUR on Arch); other Linux hosts skip it. On a new machine, run env -u DISPLAY -u WAYLAND_DISPLAY dropbox-cli start in a terminal and open the printed URL.
  • Keep dropbox.service and dropbox@USER.service disabled; Hyprland is the only startup path.

Tmux

  • Prefix is C-z (so C-b stays free for vim).
  • Splits: prefix | (horizontal), prefix - (vertical), inheriting the current pane's path.
  • set-clipboard on + allow-passthrough → OSC 52 yank works over SSH without X11 forwarding.
  • Sessions auto-restore via tmux-resurrect + tmux-continuum on tmux start.

Kitty

  • Used on macOS specifically because AeroSpace tiles each Ghostty native tab as a separate window — Kitty's custom tab bar appears as a single AXWindow.
  • cmd+option/Alt key bindings deliberately avoided (macOS 26 Tahoe intercepts them).
  • Kitty, Alacritty, and Ghostty point at the fixed noctalia theme path; Noctalia or Matugen owns the generated colors.

Hyprland

  • Desc-keyed Lua hl.monitor(...) overrides plus a fallback that selects the highest resolution and refresh rate available at that resolution.
  • Cursor: Catppuccin Mocha Teal (Hyprcursor) with Catppuccin Mocha Green as XCursor fallback.
  • Electron / fcitx5 / Qt integration env vars set centrally. Noctalia applies GTK light mode and generated GTK/Qt colors through its built-in templates.
  • Noctalia v5 owns the desktop shell layer (bar, launcher, notifications, wallpaper, lock screen, idle, screenshots, clipboard).
  • Noctalia Shell is installed on Arch and Ubuntu. Noctalia Greeter stays Arch-only; Ubuntu keeps SDDM.
  • Wallpapers are deployed by chezmoi to ~/.config/wallpapers; Noctalia reads that path directly.
  • Noctalia is the Linux wallpaper/theme owner for apps with built-in adapters. App integrations write generated theme files and reload apps; chezmoi keeps their main configs pre-aligned so post-hooks do not cause drift.
  • Noctalia desktop/lockscreen widget placement is generated from monitor roles and ratios in 20-widgets.generated.toml.tmpl; run chezmoi apply after changing the monitor layout.
  • If widgets are edited in Noctalia's GUI, remove [desktop_widgets] and [lockscreen_widgets] from ~/.local/state/noctalia/settings.toml or fold the new ratios back into the template; state overrides win over declarative config.
  • Wallpaper Engine is opt-in through Noctalia's W Engine bar widget; palettes sync through Noctalia and Steam Workshop selections stay machine-local.

Keymappings

$SUPER = Windows / Cmd key. $ALT = Option / Meta. $CTRL = Control.

Hyprland (Wayland)

Bind Action
SUPER+T open Kitty
SUPER+E open Nautilus
SUPER+C close window
SUPER+M exit Hyprland
SUPER+V toggle floating
hold SHIFT+F13 OpenWhispr push-to-talk dictation
SUPER+F13 OpenWhispr local voice agent
SUPER+P pseudotile
SUPER+RETURN true fullscreen
SUPER+N toggle Noctalia notifications
SUPER+S toggle scratchpad workspace
SUPER+SHIFT+S move window to scratchpad
SUPER+SPACE Noctalia launcher
ALT+L Noctalia lock screen
ALT+J toggle split
ALT+P Noctalia region screenshot → clipboard
CTRL+RETURN maximize
SUPER+H/J/K/L focus left/down/up/right
SUPER+1..9,0 switch workspace 1..10
SUPER+SHIFT+1..9,0 move window to workspace
SUPER+SHIFT+H/L move window to prev/next monitor
SUPER+ALT+H/J/K/L swap workspace contents left/down/up/right, keeping workspace numbers fixed
SUPER+scroll cycle workspaces
SUPER+LMB/RMB drag move/resize floating window
XF86Audio* volume / mute / mic mute
XF86MonBrightness* screen brightness

Voice dictation uses OpenWhispr on Arch Linux x86_64 and macOS. Select asr-mode sensevoice for the CPU-only SenseVoice model or asr-mode qwen-1.7b for the GPU-backed Qwen3-ASR model; missing models download only when selected. Models use ${XDG_CACHE_HOME:-$HOME/.cache}/crispasr on Linux and ${XDG_CACHE_HOME:-$HOME/Library/Caches}/crispasr on macOS. Run asr-mode off before gaming to stop CrispASR, close port 8080, and release its GPU memory. OpenWhispr remains in the tray; quit it separately when its UI and shortcut are not needed.

For first-time OpenWhispr setup, run asr-mode qwen-1.7b, then set Self-Hosted to http://127.0.0.1:8080/v1 and paste the printed OpenWhispr Model ID. Each successful model switch prints its current absolute path for later connection tests. Chezmoi keeps OpenWhispr in push mode with SHIFT+F13 for dictation and Meta+F13 for the local voice agent. Linux uses its native Hyprland binding and wtype; macOS requires Microphone and Accessibility access. OpenWhispr loads these shortcuts at startup, so restart it after chezmoi apply. Version 1.9.2 may still show a ydotool setup warning on Linux; wtype is already preferred, so do not add the input group or daemon just to dismiss it.

AeroSpace (macOS)

Bind Action
hold Shift+F13 OpenWhispr push-to-talk dictation
Cmd+F13 OpenWhispr local voice agent
Cmd+Option+H/J/K/L swap workspace windows left/down/up/right, keeping workspace numbers fixed
Cmd+Option+S toggle the dedicated magic workspace
Cmd+Option+Shift+S move window to the magic workspace

AeroSpace restores the swapped root layouts and window states where possible; its CLI cannot reconstruct nested container geometry.

Tmux (prefix = C-z)

Bind Action
prefix | split horizontal (keep cwd)
prefix - split vertical (keep cwd)
prefix v (copy mode) begin selection
prefix C-v (copy mode) rectangle toggle
prefix y (copy mode) copy + cancel
C-←/↓/↑/→ resize pane (smart-splits)
prefix I install plugins (TPM)
prefix U update plugins (TPM)

Kitty (macOS)

Bind Action
Cmd+T new tab
Cmd+W close tab
Cmd+Shift+]/[ next / previous tab
Cmd+Shift+→/← move tab forward / backward
Cmd+D new window (split)
Cmd+Shift+D close window
Ctrl+Shift+]/[ next / previous window
Cmd+Shift+J/K scroll line down / up
Cmd+Shift+N/U scroll page down / up
Cmd+Shift+Home/End scroll to top / bottom
Cmd+C / Cmd+V copy / paste
Cmd+Shift+F5 reload config
Cmd+Shift+F6 debug config
Ctrl+± / Ctrl+0 font size + / − / reset

Fish aliases

Alias Expands to
vi nvim (when nvim is installed)
buu brew update && brew upgrade -y && fisher update (macOS only)

Tools

Shell / multiplexer

  • fish — primary shell.
  • tmux — primary multiplexer.
  • zellij — secondary multiplexer using the generated Noctalia-compatible theme.

Editor

  • neovim — LazyVim distro on top.

Terminals

  • kitty — macOS daily driver (AeroSpace-friendly tabs).
  • wezterm — cross-platform fallback.
  • ghostty — newer GPU terminal using the generated Noctalia-compatible theme.
  • alacritty — minimal GPU terminal.

Wayland stack (Hyprland)

  • hyprland — Wayland compositor.
  • noctalia — desktop shell: bar, launcher, notifications, wallpaper, lock screen, idle behavior, screenshots, clipboard, and control center.
  • linux-wallpaperengine — opt-in live wallpapers from Steam Wallpaper Engine assets on Hyprland.
  • sddm — bootstrap and fallback display manager for fresh Arch installs.
  • greetd + Noctalia Greeter — final Wayland login greeter after AUR packages are installed.
  • fcitx5 + McBopomofo + chewing — Chinese input with Hsu keyboard support.

Display manager bootstrap and recovery

  • Fresh Arch installs should use SDDM from archinstall first; chezmoi switches to greetd only after noctalia-greeter-session is installed and setup succeeds.
  • SDDM stays installed as the fallback display manager.
  • The switch script only enables/disables services; it does not stop/start the current graphical session.
  • If Noctalia Greeter shows a black screen, switch to a TTY with Ctrl+Alt+F2 and run sudo systemctl disable --now greetd.service && sudo systemctl enable --now sddm.service.
  • If TTY switching does not work, boot with systemd.unit=multi-user.target from GRUB, then run the same service switch.

macOS extras

  • aerospace — tiling WM.
  • karabiner-elements — keyboard remapper.
  • Desktop wallpaper is deployed by chezmoi to ~/.config/wallpapers; run_onchange_after_6-apply-theme.sh.tmpl applies the initial wallpaper and Matugen palette, and chezmoi theme [IMAGE] changes both later.

CLI tooling

AI extensions

  • home/.chezmoidata/ai.yaml is the single inventory for plugins and marketplaces; add entries there without editing templates.
  • Claude Code and Codex update configured marketplace plugins with their native startup updaters.
  • OpenCode installs configured npm plugins when its generated cache is missing; remove that cache before startup to fetch newer versions.
  • Shared user skills live in ~/.agents/skills, which Codex and OpenCode discover natively.
  • run_after_5-sync-ai-extensions.sh.tmpl bootstraps missing Codex plugins.
  • Review and trust new Codex hooks manually with /hooks.

Fish plugins (managed by fisher)

  • edc/bass — run bash scripts in fish.
  • jorgebucaran/nvm.fish — Node version manager.
  • patrickf1/fzf.fish — fzf integrations.
  • pure-fish/pure — minimal prompt.

Tmux plugins (managed by TPM)

  • mrjones2014/smart-splits.nvimCtrl+Arrow resize, plays nice with neovim.
  • tmux-plugins/tmux-sensible — sensible defaults.
  • tmux-plugins/tmux-continuum — auto-save/restore on start.
  • tmux-plugins/tmux-resurrect — manual save/restore + nvim session capture.

Neovim — LazyVim core extras

  • zbirenbaum/copilot.lua — Copilot.
  • giuxtaposition/blink-cmp-copilot — Copilot source for blink.cmp.
  • neovim/nvim-lspconfig + p00f/clangd_extensions.nvim — LSP, with extra clangd polish.
  • nvim-treesitter/nvim-treesitter — syntax.
  • ibhagwan/fzf-lua — fuzzy finder.
  • sphamba/smear-cursor.nvim — animated cursor.
  • folke/snacks.nvim — utility collection.

Layout

home/                            # chezmoi source root (.chezmoiroot=home)
├── .chezmoidata/packages.yaml   # canonical package list (paru + apt)
├── .chezmoiexternal.toml        # pinned external template inputs
├── .chezmoiscripts/             # run_once / run_onchange bootstrap
├── .chezmoitemplates/           # macOS install template (Brewfile pass-thru)
└── dot_config/                  # → ~/.config/...