My personal dotfiles for a consistent development environment across machines.
# Clone the repository
git clone git@github.com:gsantovena/dotfiles.git ~/.dotfiles
cd ~/.dotfiles
# Run quality checks
make check
# Install dotfiles
make install- Shell Configuration: Zsh with zinit-managed plugins, Oh My Posh prompt, custom aliases, and functions
- Editor Setup: Neovim-only configuration with lazy.nvim plugin management
- Terminal Multiplexer: Tmux configuration with TPM plugin management
- Git Configuration: Custom aliases and templates for efficient workflows
- Package Management: Comprehensive Brewfile for development tools
- Security: Proper secrets management and validation
- Testing: Automated installation validation and security checks
make install-dry # Preview symlink and backup changes
make install # Full installation with backup and validation
make quick-install # Run checks, then install
make install-no-backup # Install only if no existing targets need backup# Dry run to see what will be changed
./scripts/install-enhanced.sh --dry-run
# Install with backup and validation
./scripts/install-enhanced.sh --backup --verbose
# Force installation (skip validation)
./scripts/install-enhanced.sh --forcedotfiles/
βββ .github/workflows/ # CI/CD automation
βββ scripts/ # Installation, test, and validation scripts
βββ tests/ # Automated tests
βββ home/ # Files symlinked into ~/.* plus shell support
β βββ aliases # Shell aliases
β βββ bash_profile # Bash configuration
β βββ exports # Environment variables
β βββ functions # Shell functions
β βββ git/ # Git templates and hooks
β βββ gitconfig # Git configuration
β βββ screenrc # GNU Screen configuration
β βββ zsh/ # Modular Zsh configuration
β βββ zshrc # Zsh module loader
βββ config/ # Directories symlinked into ~/.config/*
β βββ ghostty/ # Ghostty terminal configuration
β βββ nvim/ # Neovim configuration
β βββ ohmyposh/ # Oh My Posh prompt themes
β βββ tmux/ # Tmux configuration
βββ docs/ # Extended project documentation
βββ Brewfile # Package management
βββ Makefile # Build automation
- Environment variables for sensitive data
- Encrypted storage support (GPG/age)
- Pre-commit secret detection
- Comprehensive .gitignore patterns
make security # Run security validation
./scripts/security-check.sh- No hardcoded credentials in version control
- Proper file permissions validation
- Email address externalization
- Secure backup procedures
make test # Run installation tests
make lint # Shell script linting
make check # Complete quality validation# Test installation in safe environment
./scripts/test-install.sh
# Validate configurations
git config --file home/gitconfig --list
zsh -n home/zshrc
zsh -n home/zsh/*.zsh- Git: Version control
- Zsh: Modern shell
- zinit: Zsh plugin manager (bootstrapped automatically by
home/zsh/00-zinit.zsh) - Oh My Posh: Prompt engine using configs from
config/ohmyposh/ - Homebrew: Package management (macOS)
- Neovim: Modern text editor
- shellcheck: Script linting
- bats: Testing framework
# macOS
brew install git zsh neovim shellcheck oh-my-posh
# Ubuntu/Debian
sudo apt-get update
sudo apt-get install git zsh neovim shellcheck
# Install Oh My Posh with your platform package manager or from https://ohmyposh.dev
# Install all Homebrew-managed tools on macOS
brew bundle --file=BrewfileThis repository now uses Neovim as the only tracked editor configuration.
The active runtime lives under config/nvim/, with:
config/nvim/init.vimas the thin entrypointconfig/nvim/lua/config/*for general editor behaviorconfig/nvim/lua/plugins/*for grouped lazy.nvim plugin specsconfig/nvim/coc-settings.jsonfor CoC settings
Supporting Neovim docs:
docs/nvim/README.mdβ structure and ownershipdocs/nvim/PLUGIN_AUDIT.mdβ current plugin inventorydocs/nvim/PLUGIN_REEVALUATION.mdβ keep/remove/replace decisions
# Plugins are managed by lazy.nvim and install automatically
# Open Neovim to trigger plugin installation
nvim
# Or manually trigger lazy.nvim
nvim -c "Lazy install" -c "qa"The installer bootstraps TPM into
~/.config/tmux/plugins/tpm. Other tmux plugins are declared in config/tmux/tmux.conf
and installed by TPM.
# After installation, reload tmux config
tmux source-file ~/.config/tmux/tmux.conf
# Then press prefix + I inside tmux to install declared plugins- Better plugin support and performance
- Asynchronous processing
- Modern architecture
- Lua configuration support
- No split ownership between
config/nvim/and legacy Vim files
- Automated testing on multiple OS platforms
- Shell script linting with shellcheck
- Security scanning and validation
- Configuration syntax checking
- Installation validation
- Security compliance
- Cross-platform compatibility
- Performance checks
# Set environment-specific variables
export WORK_ENVIRONMENT="true" # in secrets file
# Use in configurations
if [[ "$WORK_ENVIRONMENT" == "true" ]]; then
# Work-specific settings
fi- Add home-level dotfiles under
home/, or XDG config directories underconfig/ - Update
HOME_FILESorCONFIG_FILESinscripts/install-enhanced.sh - Test with
make test - Document any dependencies
# Update packages
brew bundle --file=Brewfile
# Update plugins
nvim -c "Lazy update" -c "qa"
# Update tmux plugins
# Press prefix + U inside tmux
# Run health checks
make check# Create backup before changes
./scripts/install-enhanced.sh --backup
# Restore from backup
cp -r ~/.dotfiles-backup-YYYYMMDD_HHMMSS/.* ~/Installation fails with permission errors
# Fix ownership
sudo chown -R $USER:$USER ~/.dotfiles
# Check permissions
./scripts/security-check.shSymlinks not working
# Verify installation
./scripts/test-install.sh
# Manual verification
ls -la ~/.zshrc ~/.gitconfig ~/.config/nvim ~/.config/ohmyposhNeovim statusline icons look wrong
# Install a Nerd Font if needed
brew install --cask font-hack-nerd-fontThen select Hack Nerd Font in your terminal profile. In iTerm2: Settings β Profiles β Text β Font.
Zsh prompt or plugins not loading
# Ensure Oh My Posh is installed and the prompt config is linked
brew install oh-my-posh
ls -la ~/.config/ohmyposh/zen.toml
# Re-run the installer if the symlink is missing
make install
# Restart shell
exec zshThe zinit bootstrap in home/zsh/00-zinit.zsh installs zinit into
${XDG_DATA_HOME:-$HOME/.local/share}/zinit/zinit.git on first shell startup.
- Check GitHub Issues for known problems
- Run
make checkfor comprehensive validation - Review logs in
~/.logs/directory
- Fork the repository
- Create a feature branch
- Make your changes
- Run quality checks:
make check - Submit a pull request
# Set up development environment
git clone your-fork
cd dotfiles
# Make changes
nvim some-config-file
# Test changes
make test
# Run security checks
make security
# Commit and push
git add .
git commit -m "feat: add new configuration"
git push origin feature-branchMIT License - see LICENSE file for details.
- zinit, Oh My Posh, and Oh My Zsh snippet/plugin communities for shell enhancements
- Vim/Neovim community for editor excellence
- Homebrew maintainers for package management
- Open source contributors who make development better
For the current improvement backlog, see docs/DEVOPS_RECOMMENDATIONS.md.