dotfiles
Provides expert guidance for managing dotfiles using GNU Stow, enhancing shell and editor configurations for developers.
Install this skill
Security score
The dotfiles skill was audited on Apr 14, 2026 and we found 35 security issues across 3 threat categories, including 2 critical. Review the findings below before installing.
Categories Tested
Security Issues
Access to SSH directory
| 211 | These should NEVER be in the repository: |
| 212 | - Passwords and API keys |
| 213 | - SSH keys (~/.ssh/) |
| 214 | - GPG keys (~/.gnupg/) |
| 215 | - Session tokens |
Access to SSH directory
| 244 | Sensitive files should have restricted permissions: |
| 245 | ```bash |
| 246 | chmod 400 ~/.ssh/id_* |
| 247 | chmod 600 ~/.env |
| 248 | ``` |
Access to GPG keys directory
| 212 | - Passwords and API keys |
| 213 | - SSH keys (~/.ssh/) |
| 214 | - GPG keys (~/.gnupg/) |
| 215 | - Session tokens |
| 216 |
Access to home directory dotfiles
| 1 | --- |
| 2 | name: dotfiles |
| 3 | description: Expert in managing dotfiles using GNU Stow. Use when working with stow (symlinks, conflicts, .stow-local-ignore, .stowrc, restow), shell configs (zsh, oh-my-zsh, bash, .zshrc, aliases, plugins), editors (neovim, nvim, vscode), terminal tools (tmux, ghostty), prompts (starship), CLI replacements (eza, bat, fzf, zoxide, lazygit, atuin, direnv, television, glow), keyboard (karabiner), secrets (bitwarden-cli), nushell integration, XDG Base Directory compliance, Catppuccin theming, or any configuration in ~/.config. Also covers setup scripts (setup.sh, setup_archlinux.sh, Brewfile), lazy loading patterns, and this specific dotfiles repository structure. |
| 4 | user-invocable: true |
| 5 | argument-hint: [self-update] |
Access to home directory dotfiles
| 34 | - `--dotfiles` - `dot-` prefix converts to `.` |
| 35 | |
| 36 | Example: `dot-zshrc` becomes `~/.zshrc` |
| 37 | </critical> |
| 38 |
Access to home directory dotfiles
| 51 | │ └── Brewfile # Package manifest |
| 52 | ├── dotfiles/ # Stow source directory |
| 53 | │ ├── dot-zshrc # -> ~/.zshrc |
| 54 | │ ├── dot-zprofile # -> ~/.zprofile |
| 55 | │ ├── dot-config/ # -> ~/.config/ |
Access to home directory dotfiles
| 52 | ├── dotfiles/ # Stow source directory |
| 53 | │ ├── dot-zshrc # -> ~/.zshrc |
| 54 | │ ├── dot-zprofile # -> ~/.zprofile |
| 55 | │ ├── dot-config/ # -> ~/.config/ |
| 56 | │ │ ├── nvim/ # Neovim (lazy.nvim) |
Access to home directory dotfiles
| 53 | │ ├── dot-zshrc # -> ~/.zshrc |
| 54 | │ ├── dot-zprofile # -> ~/.zprofile |
| 55 | │ ├── dot-config/ # -> ~/.config/ |
| 56 | │ │ ├── nvim/ # Neovim (lazy.nvim) |
| 57 | │ │ ├── tmux/ # Tmux + TPM |
Access to home directory dotfiles
| 67 | │ │ ├── karabiner/ # Keyboard mods |
| 68 | │ │ └── nushell/ # Nushell config |
| 69 | │ ├── dot-claude/ # -> ~/.claude/ |
| 70 | │ │ ├── settings.json # Claude Code settings |
| 71 | │ │ ├── statusline.sh # Token usage tracker |
Access to home directory dotfiles
| 87 | |
| 88 | # Reload configurations |
| 89 | source ~/.zshrc # Shell changes |
| 90 | tmux source-file ~/.config/tmux/tmux.conf # Tmux changes |
| 91 |
Access to home directory dotfiles
| 88 | # Reload configurations |
| 89 | source ~/.zshrc # Shell changes |
| 90 | tmux source-file ~/.config/tmux/tmux.conf # Tmux changes |
| 91 | |
| 92 | # Neovim |
Access to home directory dotfiles
| 192 | | Tool | Old Path | New Path | |
| 193 | |------|----------|----------| |
| 194 | | zsh history | `~/.zsh_history` | `$XDG_STATE_HOME/zsh/history` | |
| 195 | | Oh-My-Zsh | `~/.oh-my-zsh` | `$XDG_DATA_HOME/oh-my-zsh` | |
| 196 | | NVM | `~/.nvm` | `$XDG_DATA_HOME/nvm` | |
Access to home directory dotfiles
| 193 | |------|----------|----------| |
| 194 | | zsh history | `~/.zsh_history` | `$XDG_STATE_HOME/zsh/history` | |
| 195 | | Oh-My-Zsh | `~/.oh-my-zsh` | `$XDG_DATA_HOME/oh-my-zsh` | |
| 196 | | NVM | `~/.nvm` | `$XDG_DATA_HOME/nvm` | |
| 197 | | zsh-evalcache | `~/.zsh-evalcache` | `$XDG_CACHE_HOME/zsh-evalcache` | |
Access to home directory dotfiles
| 194 | | zsh history | `~/.zsh_history` | `$XDG_STATE_HOME/zsh/history` | |
| 195 | | Oh-My-Zsh | `~/.oh-my-zsh` | `$XDG_DATA_HOME/oh-my-zsh` | |
| 196 | | NVM | `~/.nvm` | `$XDG_DATA_HOME/nvm` | |
| 197 | | zsh-evalcache | `~/.zsh-evalcache` | `$XDG_CACHE_HOME/zsh-evalcache` | |
| 198 |
Access to home directory dotfiles
| 195 | | Oh-My-Zsh | `~/.oh-my-zsh` | `$XDG_DATA_HOME/oh-my-zsh` | |
| 196 | | NVM | `~/.nvm` | `$XDG_DATA_HOME/nvm` | |
| 197 | | zsh-evalcache | `~/.zsh-evalcache` | `$XDG_CACHE_HOME/zsh-evalcache` | |
| 198 | |
| 199 | ### Verification |
Access to home directory dotfiles
| 211 | These should NEVER be in the repository: |
| 212 | - Passwords and API keys |
| 213 | - SSH keys (~/.ssh/) |
| 214 | - GPG keys (~/.gnupg/) |
| 215 | - Session tokens |
Access to home directory dotfiles
| 212 | - Passwords and API keys |
| 213 | - SSH keys (~/.ssh/) |
| 214 | - GPG keys (~/.gnupg/) |
| 215 | - Session tokens |
| 216 |
Access to home directory dotfiles
| 219 | Load secrets from secure sources: |
| 220 | ```zsh |
| 221 | # In dot-zshrc - loads ~/.env if it exists |
| 222 | if [[ -f ~/.env ]]; then |
| 223 | while IFS= read -r line || [[ -n "$line" ]]; do |
Access to home directory dotfiles
| 220 | ```zsh |
| 221 | # In dot-zshrc - loads ~/.env if it exists |
| 222 | if [[ -f ~/.env ]]; then |
| 223 | while IFS= read -r line || [[ -n "$line" ]]; do |
| 224 | if [[ -n "$line" && ! "$line" =~ ^[[:space:]]*# ]]; then |
Access to home directory dotfiles
| 225 | export "$line" |
| 226 | fi |
| 227 | done < ~/.env |
| 228 | fi |
| 229 | ``` |
Access to home directory dotfiles
| 244 | Sensitive files should have restricted permissions: |
| 245 | ```bash |
| 246 | chmod 400 ~/.ssh/id_* |
| 247 | chmod 600 ~/.env |
| 248 | ``` |
Access to home directory dotfiles
| 245 | ```bash |
| 246 | chmod 400 ~/.ssh/id_* |
| 247 | chmod 600 ~/.env |
| 248 | ``` |
| 249 | </security> |
Access to home directory dotfiles
| 264 | 3. **Reload the relevant configuration** |
| 265 | ```bash |
| 266 | source ~/.zshrc # For shell changes |
| 267 | tmux source ~/.config/tmux/tmux.conf # For tmux |
| 268 | # Neovim auto-reloads on file save |
Access to home directory dotfiles
| 265 | ```bash |
| 266 | source ~/.zshrc # For shell changes |
| 267 | tmux source ~/.config/tmux/tmux.conf # For tmux |
| 268 | # Neovim auto-reloads on file save |
| 269 | ``` |
Access to home directory dotfiles
| 283 | 1. Create the file with `dot-` prefix: |
| 284 | ```bash |
| 285 | # For ~/.newconfig |
| 286 | touch dotfiles/dot-newconfig |
| 287 |
Access to home directory dotfiles
| 286 | touch dotfiles/dot-newconfig |
| 287 | |
| 288 | # For ~/.config/app/config |
| 289 | mkdir -p dotfiles/dot-config/app |
| 290 | touch dotfiles/dot-config/app/config |
Access to home directory dotfiles
| 327 | |------|-------|-------| |
| 328 | | Homebrew | `/opt/homebrew/` | `/home/linuxbrew/` | |
| 329 | | VSCode settings | `~/Library/Application Support/Code/` | `~/.config/Code/` | |
| 330 | | Ghostty config | Both use `~/.config/ghostty/` | Same | |
| 331 | </platform> |
Access to home directory dotfiles
| 328 | | Homebrew | `/opt/homebrew/` | `/home/linuxbrew/` | |
| 329 | | VSCode settings | `~/Library/Application Support/Code/` | `~/.config/Code/` | |
| 330 | | Ghostty config | Both use `~/.config/ghostty/` | Same | |
| 331 | </platform> |
| 332 |
Instruction to extract credentials
| 234 | ```bash |
| 235 | bw-unlock # Unlock vault, export BW_SESSION |
| 236 | bwp "GitHub Token" # Get password by name |
| 237 | bwc "API Key" # Copy to clipboard |
| 238 | ``` |
Shell profile modification
| 1 | --- |
| 2 | name: dotfiles |
| 3 | description: Expert in managing dotfiles using GNU Stow. Use when working with stow (symlinks, conflicts, .stow-local-ignore, .stowrc, restow), shell configs (zsh, oh-my-zsh, bash, .zshrc, aliases, plugins), editors (neovim, nvim, vscode), terminal tools (tmux, ghostty), prompts (starship), CLI replacements (eza, bat, fzf, zoxide, lazygit, atuin, direnv, television, glow), keyboard (karabiner), secrets (bitwarden-cli), nushell integration, XDG Base Directory compliance, Catppuccin theming, or any configuration in ~/.config. Also covers setup scripts (setup.sh, setup_archlinux.sh, Brewfile), lazy loading patterns, and this specific dotfiles repository structure. |
| 4 | user-invocable: true |
| 5 | argument-hint: [self-update] |
Shell profile modification
| 14 | | Topic | File | Use When | |
| 15 | |-------|------|----------| |
| 16 | | Zsh/Shell | [ZSH.md](ZSH.md) | Editing .zshrc, aliases, plugins, Oh-My-Zsh | |
| 17 | | Neovim | [NEOVIM.md](NEOVIM.md) | Editing nvim config, adding plugins, LSP | |
| 18 | | Starship | [STARSHIP.md](STARSHIP.md) | Customizing prompt, modules, palettes | |
Shell profile modification
| 34 | - `--dotfiles` - `dot-` prefix converts to `.` |
| 35 | |
| 36 | Example: `dot-zshrc` becomes `~/.zshrc` |
| 37 | </critical> |
| 38 |
Shell profile modification
| 51 | │ └── Brewfile # Package manifest |
| 52 | ├── dotfiles/ # Stow source directory |
| 53 | │ ├── dot-zshrc # -> ~/.zshrc |
| 54 | │ ├── dot-zprofile # -> ~/.zprofile |
| 55 | │ ├── dot-config/ # -> ~/.config/ |
Shell profile modification
| 87 | |
| 88 | # Reload configurations |
| 89 | source ~/.zshrc # Shell changes |
| 90 | tmux source-file ~/.config/tmux/tmux.conf # Tmux changes |
| 91 |
Shell profile modification
| 264 | 3. **Reload the relevant configuration** |
| 265 | ```bash |
| 266 | source ~/.zshrc # For shell changes |
| 267 | tmux source ~/.config/tmux/tmux.conf # For tmux |
| 268 | # Neovim auto-reloads on file save |