- Lua 46.1%
- Tree-sitter Query 33.1%
- Shell 18.3%
- Python 1.3%
- CSS 1.2%
| .claude | ||
| .config | ||
| .local/bin | ||
| .sidecar | ||
| .ssh | ||
| codex-skills/.codex/skills/model-orchestrated-coding | ||
| docs | ||
| review | ||
| scripts | ||
| .bashrc | ||
| .gitignore | ||
| .stow-ignore | ||
| .stow-local-ignore | ||
| .zshrc | ||
| CLAUDE.md | ||
| cspell.json | ||
| README.md | ||
| treesitter-fix.md | ||
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 managementfish— 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 |
scripts/ |
System setup & maintenance scripts (not stowed) |
docs/ |
Documentation (not stowed) |
Shells
Fish (primary)
Loads in order:
~/.config/fish/env.fish— environment variables- OS-specific:
~/.config/fish/os/{darwin,linux}.fish ~/.config/fish/aliases.fish~/.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 architecturenvim-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
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 |
Documentation
- Keybindings — Hyprland keybinds, gestures, and media keys