Personal dotfiles repository using GNU Stow
  • Lua 47%
  • Tree-sitter Query 28.2%
  • Shell 22.7%
  • Python 1.1%
  • CSS 1%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-10-06 15:52:32 -05:00
.cargo add cargo target-dir config, rust build/zram/bluetooth docs 2026-09-27 08:14:40 -05:00
.config remove noctalia 2026-10-06 15:52:32 -05:00
.local/bin Infisical: one-time per-machine machine-identity setup 2026-09-29 20:25:15 -05:00
.sidecar remove local config 2026-02-14 20:55:11 -06:00
.ssh add aerospace 2026-09-14 08:38:22 -05:00
docs docs: point the MCP server list at the Grafana setup script 2026-09-29 20:25:22 -05:00
review docs(cachyos): record the bobpparsons -> bobparsons user rename 2026-09-21 18:44:43 -05:00
scripts Infisical: one-time per-machine machine-identity setup 2026-09-29 20:25:15 -05:00
themes/cosmic feat(cosmic): add Eldritch Royal Purple color scheme 2026-09-19 17:18:10 -05:00
.aerospace.toml add aerospace 2026-09-14 08:38:22 -05:00
.bashrc fix(bash): point PATH at the current nvim tarball directory 2026-09-19 17:18:10 -05:00
.gitignore feat(input): disable built-in keyboard while Sonsei BT keyboard is connected 2026-09-19 17:17:55 -05:00
.stow-ignore allow for skills 2026-05-06 18:51:54 -05:00
.stow-local-ignore rename to using home 2026-09-19 23:14:06 -05:00
.zshrc rename to using home 2026-09-19 23:14:06 -05:00
cspell.json machine specific ghostty 2026-02-02 07:07:14 -06:00
README.md Infisical: one-time per-machine machine-identity setup 2026-09-29 20:25:15 -05:00

dotfiles

Personal cross-platform dotfiles for Linux (CachyOS/Arch) and macOS, managed with GNU Stow. One repo, symlinked into $HOME, shared across a desktop and laptops.

Quick Start

git clone ssh://git@git.bobparsons.dev:2222/deadstyle/dotfiles.git ~/dotfiles
cd ~/dotfiles
stow .

Stow symlinks everything (except the ignore list in .stow-local-ignore) into your home directory. Re-run stow . after pulling changes; restart your terminal/session to pick them up.

Prerequisites

  • stow — symlink management
  • fish — primary shell, plus fisher for plugins
  • Tool-specific binaries are loaded conditionally, so missing tools degrade gracefully rather than erroring.

Repository Layout

Path What
.config/fish/ Primary shell — modular fish config (env → OS → aliases → tools)
.config/zsh/ Alternative shell — modular zsh config
.bashrc Minimal bash for scripts/compatibility
.config/nvim/ Primary Neovim setup (custom, modular)
.config/nvim-lite/ Lightweight Neovim for quick edits (NVIM_APPNAME=nvim-lite)
.config/hypr/ Hyprland window manager (see keybindings)
.config/niri/ Niri scrollable-tiling WM (alternative to Hyprland)
.config/waybar/ Status bar
.config/mako/ Notification daemon
.config/ghostty/ · .config/kitty/ Terminal emulators
.config/zellij/ Terminal multiplexer
.config/oh-my-posh/ Prompt themes
.config/lazygit/ · .config/k9s/ Git TUI / Kubernetes TUI
.config/kanata/ Keyboard remapping
.config/refind/ · .config/limine/ Bootloader configs
.claude/ Claude Code config — statusline, agents, skills (not stowed, symlinked manually)
scripts/ System setup & maintenance scripts (not stowed)
docs/ Documentation (not stowed)

Shells

Fish (primary)

Loads in order:

  1. ~/.config/fish/env.fish — environment variables
  2. OS-specific: ~/.config/fish/os/{darwin,linux}.fish
  3. ~/.config/fish/aliases.fish
  4. ~/.config/fish/tools/*.fish — per-tool config (fzf, zoxide, go, rust, fnm, …)

Set as default shell:

which fish && grep -q fish /etc/shells && chsh -s "$(which fish)"
fisher install jorgebucaran/fisher edc/bass

Zsh (alternative)

Mirrors the fish structure under .config/zsh/ (env.zsh, os/{darwin,linux}.zsh, tools/*.zsh, aliases.zsh, functions.zsh). Entry point: .zshrc.

Desktop (Linux)

  • Window managers: Hyprland (primary) and Niri (alternative)
  • Bar / notifications: Waybar + Mako
  • Launcher / clipboard: cosmic-launcher, cliphist + wofi
  • Idle / lock: hypridle + hyprlock
  • See docs/keybindings.md for the full Hyprland keymap.

Editors

  • nvim — primary custom configuration, modular plugin architecture
  • nvim-lite — minimal config for quick editing

Bootstrap Neovim dependencies:

./scripts/nvim-setup.zsh

Cross-Platform Rules

Stow deploys every file to every machine — there is no OS-conditional deployment. So OS- or machine-specific values must never live in a shared, version- controlled config that both systems load.

Three ways to handle machine-specific settings:

Approach When Example
Gitignored *.local files Different values per machine (paths, hardware, GPU) hypr/config/monitors/local.conf, hypr/config/env.local.conf, ghostty/config.local
Runtime OS detection Shell configs that branch at runtime switch (uname) in fish, [[ "$OSTYPE" == darwin* ]] in zsh
OS-specific directories Modules the shell sources conditionally .config/zsh/os/darwin.zsh

Rule of thumb: before committing a config value, ask "if this file existed on my other machine, would it break anything?" If yes, it belongs in a *.local file.

Per-machine setup

# Hyprland monitors (gitignored)
cp ~/.config/hypr/config/monitors/cachyos-xps17.conf ~/.config/hypr/config/monitors/local.conf
# or, on the XPS 15:
# cp ~/.config/hypr/config/monitors/cachyos-xps15.conf ~/.config/hypr/config/monitors/local.conf

# Hyprland GPU env (gitignored)
cp ~/.config/hypr/config/env.local.example.conf ~/.config/hypr/config/env.local.conf
# edit for NVIDIA / Intel / AMD, or leave empty

hyprctl reload

Claude Code

.claude/ is excluded from .stow-local-ignore (Claude Code manages other files there, like credentials, that must never be stowed), so its dotfiles-tracked pieces are symlinked by hand instead of via stow .:

ln -s ~/dotfiles/.claude/CLAUDE.md ~/.claude/CLAUDE.md
ln -s ~/dotfiles/.claude/statusline-command.sh ~/.claude/statusline-command.sh

Then point statusLine in ~/.claude/settings.json (not tracked — machine-specific) at it:

"statusLine": {
  "type": "command",
  "command": "bash $HOME/.claude/statusline-command.sh"
}

Infisical

Every machine reads secrets as the shared machine identity through infisical-machine, never through a per-machine infisical login. One-time per-machine setup, after stow .:

~/dotfiles/scripts/infisical-machine-setup.sh

It asks for the client secret (from the password manager), stores it in ~/.config/infisical/machine-identity.env (mode 600, never committed), checks it works, and registers the Claude Code MCP servers that need secrets (Grafana). Kirria's dev .env refresh picks it up automatically.

Full guide — how it works, wiring a new service, troubleshooting: docs/infisical-machine-identity.md.

Scripts

System setup and maintenance live in scripts/ (run directly, not stowed):

Script Purpose
cachyos-base-install.sh · arch-dev-setup.sh Bootstrap a fresh install
nvim-setup.zsh · nvim-treesitter-parsers.zsh Neovim dependencies & parsers
linux-system-limits.sh Raise system limits for development (needs sudo)
linux-performance-profile.sh Performance tuning
hypr-monitor-setup.sh · cosmic-monitor-setup.sh Display configuration helpers
system-cleanup.sh Housekeeping
infisical-machine-setup.sh Store the Infisical machine identity and register secret-backed MCP servers (once per machine)
builtin-kbd-toggle/install.sh Inhibit the laptop keyboard while the external keyboard is connected (needs sudo)

Documentation