Personal dotfiles repository using GNU Stow
  • Lua 46.1%
  • Tree-sitter Query 33.1%
  • Shell 18.3%
  • Python 1.3%
  • CSS 1.2%
Find a file
2026-06-13 20:29:03 -05:00
.claude add lite and task 2026-05-14 10:09:41 -05:00
.config add odin support 2026-06-13 20:29:03 -05:00
.local/bin improve fish loading 2026-01-31 08:15:41 -06:00
.sidecar remove local config 2026-02-14 20:55:11 -06:00
.ssh correct go reading golintci file 2026-04-14 15:52:58 -05:00
codex-skills/.codex/skills/model-orchestrated-coding allow for skills 2026-05-06 18:51:54 -05:00
docs setup to use enviroments for the monitors config 2026-05-30 11:19:18 -05:00
review setup to use enviroments for the monitors config 2026-05-30 11:19:18 -05:00
scripts add td session 2026-06-03 20:22:27 -05:00
.bashrc Merge branch 'main' of https://github.com/Bparsons0904/dotfiles 2025-07-31 09:33:07 -05:00
.gitignore setup to use enviroments for the monitors config 2026-05-30 11:19:18 -05:00
.stow-ignore allow for skills 2026-05-06 18:51:54 -05:00
.stow-local-ignore allow for skills 2026-05-06 18:51:54 -05:00
.zshrc clean up fish and zsh configs 2026-02-14 23:57:42 -06:00
CLAUDE.md config xps17 2026-05-30 13:30:23 -05:00
cspell.json machine specific ghostty 2026-02-02 07:07:14 -06:00
README.md config xps17 2026-05-30 13:30:23 -05:00
treesitter-fix.md another treesitter fix 2026-03-18 07:16:38 -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
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

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