Personal macOS development environment managed with chezmoi.
- Quick Start
- What's Included
- Core Tools
- Documentation
- Key Features
- Common Tasks
- Manual Dependencies
- Chezmoi Quick Reference
- Secrets and Encryption
- GitHub Actions
- Neovim Configuration
- Support
- License
- Acknowledgments
New to these dotfiles? Start here:
- Installation Guide - Complete setup instructions for fresh macOS installation (~60 minutes)
- Chezmoi Workflow - How to make configuration changes safely
- Keymaps Reference - Find any keyboard shortcut across all tools
- Troubleshooting - Common issues and solutions
This repository contains configurations for a complete macOS development environment with:
- Shell: Fish with Starship prompt and 77+ custom functions
- Editor: Neovim with LSP, plugins, and extensive customization
- Window Management: Yabai + skhd + Karabiner for tiling and keyboard-driven workflow
- Terminal: Ghostty, Tmux, Zellij for multiplexing
- Git: Custom aliases, Delta diff viewer, lazygit TUI
- File Management: Yazi TUI file manager with custom keybindings
- Development Tools: Language servers, formatters, linters, and build tools
- Security: Pre-commit hooks with gitleaks, GPG encryption, secrets management
| Tool | Purpose | Config Location |
|---|---|---|
| Fish Shell | Primary shell with 77+ custom functions | dot_config/fish/ |
| Neovim | Primary text editor with LSP and plugins | dot_config/exact_nvim/ |
| Yabai | Tiling window manager | dot_config/exact_yabai/ |
| Skhd | Hotkey daemon for window management | dot_config/exact_skhd/ |
| Karabiner | Hardware keyboard remapping | dot_config/karabiner/ |
| Git | Version control with Delta diff viewer | dot_gitconfig, dot_config/git/ |
| Starship | Shell prompt | dot_config/starship.toml |
| Chezmoi | Dotfiles management | .chezmoi.toml.tmpl, .chezmoiscripts/ |
| Tool | Purpose | Config Location |
|---|---|---|
| Ghostty | Terminal emulator | dot_config/ghostty/ |
| Tmux | Terminal multiplexer | dot_config/tmux/ |
| Zellij | Modern terminal workspace | dot_config/zellij/ |
| Yazi | TUI file manager | dot_config/yazi/ |
| Lazygit | TUI git client | dot_config/lazygit/ |
| Lazydocker | TUI docker client | dot_config/lazydocker/ |
| Atuin | Shell history with sync | dot_config/atuin/ |
| Bat | Enhanced cat with syntax highlighting |
dot_config/bat/ |
| Bottom/Btop | System monitoring | dot_config/bottom/, dot_config/btop/ |
| Ripgrep | Fast text search | dot_config/ripgrep/ |
Additional configured tools: AiChat, Delta, Eza, Fish plugins (Fisher), FZF, Television, and more. See Brewfile for the complete list of 100+ installed packages.
- INSTALL.md - Step-by-step installation guide
- CHEZMOI.md - Chezmoi workflow for configuration changes
- docs/KEYMAPS.md - Unified keyboard shortcuts reference
- docs/ARCHITECTURE.md - System architecture and tool interactions
- docs/DESIGN.md - Design philosophy and rationale
- docs/workflows/new-machine-setup.md - Setting up additional machines
- docs/workflows/configuration-changes.md - Making safe modifications
- docs/workflows/multi-machine-sync.md - Keeping machines in sync
- docs/workflows/secrets-management.md - Managing secrets and encryption
Each major tool has its own README with configuration details and customization guides:
- Fish Shell - Shell configuration and custom functions
- Neovim - Editor plugins and LSP setup
- Yabai - Window management rules
- Skhd - Hotkey configuration
- Karabiner - Hardware key remapping
- Chezmoi Scripts - Automation scripts and execution order
This repository uses a multi-layered approach to secrets:
- Git submodule (
secrets/) for sensitive configuration files - GPG encryption for individual encrypted files (using
encrypted_*prefix) - 1Password integration for programmatic secret access
- Pre-commit scanning with gitleaks to prevent accidental secret commits
See docs/workflows/secrets-management.md for detailed workflows.
The configuration automatically detects SSH vs local machines and adjusts:
- Local machines: Full GUI applications (Hammerspoon, Cursor, Ghostty, etc.)
- Remote SSH machines: Minimal CLI-only setup via
Brewfile_ssh - Machine-specific configs: Use
.chezmoidata/for machine-specific settings
Six chezmoi scripts handle setup automatically:
- Secrets submodule initialization - Sets up private secrets repository
- Homebrew installation - Installs Homebrew and runs
brew bundle - Additional tools - Installs tools not in Homebrew
- Python tools via uv - Manages Python development tools
- macOS settings - Configures system preferences
- Fish setup - Links Fisher plugin files
See .chezmoiscripts/README.md for execution order and details.
- Pre-commit hooks: Gitleaks scans for secrets before every commit
- Code formatters: Stylua, fish_indent, shfmt, prettierd, yapf
- Linters: Configured for Python, JavaScript/TypeScript, and shell scripts
# Edit a configuration file
chezmoi edit ~/.config/fish/config.fish
# Preview changes before applying
chezmoi diff
# Apply changes to your system
chezmoi apply
# Commit changes to repository
cd ~/.local/share/chezmoi
git add .
git commit -m "Update fish config"
git pushSee CHEZMOI.md for the complete workflow .
# Pull latest changes from repository
chezmoi update
# Push local changes to repository
cd ~/.local/share/chezmoi
git pushSee docs/KEYMAPS.md for searchable keymap reference across all layers .
See TROUBLESHOOTING.md for solutions to common problems .
These tools are not installed automatically and require manual installation:
- Docker Desktop: Download from docker.com
- YabaiIndicator: Menu bar status for yabai - GitHub
- Firefox Extensions (if using Firefox):
Tools for Vim-like navigation system-wide:
- Homerow - Vimium-like labeled-link navigation (highly recommended)
- kindaVim - Vim motions for text editing
- ti-vim - Alternative Vim motion implementation
- Wooshy - Mouse-free interaction
- Scrolla - Scrolling enhancements
# Edit files in chezmoi source state
chezmoi edit <file>
# Show differences between source and destination
chezmoi diff
# Apply changes from source to destination
chezmoi apply
# Pull latest changes and apply
chezmoi update
# Change to chezmoi source directory
chezmoi cd- Source state: Files in
~/.local/share/chezmoi/(the chezmoi directory) - Destination state: Current files in your home directory
- Target state: Desired state that chezmoi will apply
dot_*→.(dotfiles)exact_*→ Directory managed exactly (removes untracked files)private_*→ File with restricted permissions (0600)executable_*→ File with execute permissionssymlink_*→ Symbolic linkencrypted_*→ GPG-encrypted file*.tmpl→ Template file (processed with Go templates)
See CHEZMOI.md for detailed explanations .
Files with encrypted_ prefix are automatically encrypted/decrypted by chezmoi:
# Add an encrypted file
chezmoi add --encrypt ~/.config/tool/secret-config.conf
# Edit encrypted files
chezmoi edit ~/.config/tool/encrypted_secret-config.confConfiguration uses 1Password service accounts:
- Set
OP_SERVICE_ACCOUNT_TOKENenvironment variable - Configured for
onepassword.mode="service"in.chezmoi.toml - Access secrets in templates:
{{ (onepassword "item-name").password }}
Gitleaks automatically scans every commit for potential secrets:
# Manually scan repository
cd ~/.local/share/chezmoi
pre-commit run --all-files
# Scan including git history
gitleaks detect --report-path gitleaks-report.jsonSee .gitleaksignore to suppress false positives.
This repository syncs between private and public versions:
- Private repository: Contains all configurations including secrets
- Public repository: Sanitized version excluding secrets and encrypted files
- Workflows:
daily_sync_main.yamlanddaily_sync_dev.yamlautomate synchronization
Files excluded from public sync are defined in .chezmoiignore.
The Neovim configuration is managed with chezmoi.nvim:
# Edit Neovim config
vc # Fish function alias for editing vim config
# Manual editing
chezmoi edit ~/.config/nvim/lua/config/keymaps.luaNote: Changes made in ~/.local/share/chezmoi are automatically applied to the target state when using chezmoi.nvim, so you don't need to run chezmoi apply manually.
- Check TROUBLESHOOTING.md for comprehensive troubleshooting coverage:
- macOS accessibility and Input Monitoring permissions
- Pre-commit hooks and gitleaks errors
- Neovim LSP issues and Mason setup
- Chezmoi apply conflicts and template errors
- GitHub Actions sync failures
- Shell, terminal, and tool-specific issues
- Review tool-specific READMEs in
~/.config/<tool>/README.md - Consult official tool documentation (linked in each README)
- Search GitHub issues in this repository
To improve this configuration:
- Use the chezmoi workflow:
chezmoi edit <file> - Test changes locally before committing
- Follow existing patterns and conventions
- Update relevant documentation
- Run pre-commit hooks:
pre-commit run --all-files - Submit changes via pull request
Personal dotfiles configuration. Feel free to use as reference or fork for your own use.
Built on the shoulders of:
- chezmoi - Dotfiles management
- Fish shell - Friendly interactive shell
- Neovim - Hyperextensible Vim-based text editor
- Yabai - Tiling window manager
- Starship - Cross-shell prompt
And the countless open-source projects that make this development environment possible.