Personal dotfiles configuration with support for Bash and Zsh on macOS and Linux.
Automate your development environment setup with a single command.
Clone the repository and run the setup:
git clone <repository-url> dotfiles
cd dotfiles
./dotfiles applyThat's it! This will:
- ✅ Configure your operating system (macOS or Linux)
- ✅ Install all packages and applications
- ✅ Copy and configure all dotfiles
Available commands:
./dotfiles apply- Run everything (recommended for first-time setup)./dotfiles apply:config- Configure OS settings only./dotfiles apply:install- Install packages only./dotfiles apply:files- Copy dotfiles only
For development tasks (linting, testing, debugging), install mise:
# Install mise
# macOS: brew install mise
# Linux: curl https://mise.run | sh
# Development commands
mise run lint # Lint and syntax-check scripts
mise run test # Run tests on Linux
mise run debug:linux:gui # Debug environment with GUI (VNC)
mise run debug:linux:nogui # Debug environment without GUI- macOS: 10.15 (Catalina) or later
- Linux: Ubuntu 20.04+ or Debian 10+
- Internet connection for package installation
- Administrator/sudo access for package installation
- Git - Should be pre-installed on most systems
- curl - Usually pre-installed, required for downloads
- bash - Version 4.1+ recommended (installed automatically on macOS via Homebrew)
- mise (optional) - Required only for development tasks (
lint,test,debug)- Installation: mise.jdx.dev/getting-started.html
- 1Password account - Required for SSH/GPG key management
- Google account - Optional, for Gemini CLI (AI-powered commit messages)
All installation commands use the ./dotfiles script directly (no mise required):
| Command | Description |
|---|---|
./dotfiles apply |
Complete setup: config + install + files |
./dotfiles apply:config |
Configure OS settings (macOS/Linux) |
./dotfiles apply:install |
Install packages and applications |
./dotfiles apply:files |
Copy dotfiles to home directory |
These commands require mise to be installed:
| Command | Description |
|---|---|
mise run lint |
Lint and syntax-check all bash scripts |
mise run test |
Run all tests (executes test:linux) |
mise run test:linux |
Test scripts on Linux (Docker) |
mise run debug:linux:gui |
Interactive debug: Ubuntu with GUI (VNC) |
mise run debug:linux:nogui |
Interactive debug: Debian slim without GUI |
- Bash and Zsh with shared configurations
- OS-specific configurations (
-macosand-linuxvariants) - Private configuration files support
- macOS - Full support with Homebrew integration
- Linux - Ubuntu and Debian support
- Automatic OS detection and configuration
- Git - Configured with SSH, GPG signing, and delta pager
- 1Password - Integrated SSH agent and GPG key management
- Editors - Sublime Text (GUI) or Neovim (CLI), auto-detected
- AI Commit Messages - Gemini AI-powered commit message generation
- Rust utilities: dust, procs, bottom, ouch, tealdeer, hyperfine, gitui, atuin, navi
- Text processing: bat, ripgrep, fzf, delta, sd
- System tools: zoxide, exa, fd, tree, htop
- bash (updated via Homebrew on macOS)
- bash-completion - Programmable completion
- neovim - Hyperextensible Vim-based editor
- tmux - Terminal multiplexer
- git + hub - Version control with GitHub integration
- gpg + openssl - Encryption and signing
- bat - Modern
catwith syntax highlighting - ripgrep (rg) - Fast text search
- fzf - Fuzzy finder
- delta - Beautiful
git diffviewer - sd - Modern
sedreplacement
- dust - Intuitive disk usage analyzer
- procs - Modern process viewer
- bottom (btm) - System monitor
- ouch - Universal archive extractor
- tealdeer (tldr) - Simplified man pages
- hyperfine - Command benchmarking
- gitui - Terminal UI for Git
- atuin - Enhanced shell history
- navi - Interactive cheatsheets
- htop (Linux) - Interactive process viewer
- tree - Directory tree viewer
- zoxide - Smart directory jumper
- exa - Modern
lsreplacement - fd - Fast
findalternative
- docker / Docker CE - Container platform
- docker-compose - Multi-container orchestration
- awscli - AWS command-line interface
- rustup - Rust toolchain
- node - Node.js runtime
- OpenJDK - Java Development Kit
- Android SDK - Android development tools
- gemini - Google Gemini CLI
- 1Password + CLI - Password manager
- Antigravity - Google AI-powered IDE
- Cursor - AI-powered code editor
- Docker Desktop - Container platform
- Droplr - File sharing and screenshots
- Firefox - Web browser
- Google Chrome - Web browser
- Google Drive - Cloud storage
- Hammerspoon - Automation tool
- IconJar - Icon management
- IntelliJ IDEA - Java IDE
- iTerm2 - Terminal emulator
- Sublime Text + Sublime Merge - Editor and Git client
- TablePlus - Database management
- The Unarchiver - Archive extractor
- Transmit - FTP/SFTP client
- Visual Studio Code - Code editor
- VLC - Media player
- Amphetamine - Keep Mac awake
- Audio Lock - Audio device management
- Brother P Touch Editor - Label printer software
- Capto - Screen recording
- DaisyDisk - Disk space analyzer
- Dato - Menu bar calendar
- HTTPBot - HTTP client and API testing
- KeepSolid VPN - VPN client
- Microsoft Remote Desktop - Remote desktop client
- Monodraw - ASCII art editor
- Pastel - Color picker
- Pixelmator Pro - Image editor
- Slack - Team communication
- Spark Mail - Email client
- TextSniper OCR - OCR tool
- Typeface 3 - Font manager
- WhatsApp Desktop - WhatsApp client
- Xcode - Apple development IDE
- xScope 4 - Design and development tools
- Yubico Authenticator - Two-factor authentication
- 1Password (GUI) - Password manager
- Antigravity - Google AI-powered IDE
- Caffeine Indicator - Keep system awake
- Chrome (Google Chrome) - Web browser
- Insomnia - API client and testing
- IntelliJ IDEA Ultimate - Java IDE
- Slack (via Flatpak) - Team communication
- Sublime Text + Sublime Merge - Editor and Git client
- Visual Studio Code - Code editor
- VLC - Media player
- PlatformIO - Embedded development
- QEMU/KVM - Virtualization with GUI tools (virt-manager, virt-viewer)
- GNOME Extensions (Ubuntu/GNOME only) - Shell extensions
- GNOME Tweaks (Ubuntu/GNOME only) - GNOME customization tool
- Shared:
home/.shared_shell_config(loaded by both shells) - Bash:
home/.bash_profile,home/.bash_functions - Zsh:
home/.zshrc,home/.zsh_functions - OS-specific: Automatically selected based on OS (
-macosor-linux)
The .gitconfig is automatically assembled based on your environment:
- Base: Common settings (SSH, GPG signing, aliases)
- GUI mode (macOS or Linux with GUI):
- Sublime Merge for merge conflicts
- Sublime Text as editor
- Delta pager for diffs
- CLI mode (Linux without GUI):
- Neovim as editor
- Delta pager for diffs
Automatic commit message generation using Google Gemini AI:
Features:
- Hybrid Generation: Combines your intent (via interactive input) with AI technical analysis for semantic commit messages.
- Interactive Mode: Opens your editor before generation, allowing you to explain the why behind your changes.
- Auto-detected Language: Supports multiple languages (set
GIT_COMMIT_LANGenvironment variable). - Verifies message file was saved before committing.
Language Configuration:
# Set in ~/.bash_profile or ~/.zshrc
export GIT_COMMIT_LANG=pt-BR # Portuguese (Brazilian)
export GIT_COMMIT_LANG=en # English (default)
export GIT_COMMIT_LANG=es # Spanish
# ... any language supported by GeminiHooks:
prepare-commit-msg- Generates AI commit message suggestionscommit-msg- Verifies message file was saved
You can easily install these AI-powered git hooks in any of your projects using the provided script. The script automatically detects if the project uses lefthook and configures it accordingly, or installs standard git hooks.
# From your project directory, run:
my-git-hook install
# Or specify the path:
my-git-hook install --path /path/to/project
# Force Lefthook configuration (even if lefthook.yml is missing):
my-git-hook install --force-lefthookTo see available commands:
my-git-hook helpFeatures:
- Lefthook Support: Automatically adds hooks to
lefthook-local.ymliflefthook.ymlis present. - Standard Hooks: Installs symlinks to
.git/hooksif no hook manager is detected. - Local Config: Configures
git config core.hooksPath .git/hooksto ensure local hooks are used without conflicting with global configurations.
- tmux - Terminal multiplexer configuration
- SSH - OS-specific SSH config
- GPG - 1Password integration for key management
dotfiles/
├── .config/
│ └── mise/
│ └── tasks/ # Development tasks (lint, test, debug)
│ ├── test/ # Test tasks
│ ├── debug/ # Debug environments
│ └── lint # Linting task
├── bin/ # Installation scripts
│ ├── apply-config-macos # macOS system configuration
│ ├── apply-config-linux # Linux system configuration
│ ├── apply-install-macos # macOS package installation
│ ├── apply-install-linux # Linux package installation
│ ├── apply-files # Copy dotfiles to home
│ └── validate-url # URL validation utility
├── home/ # Configuration files (→ ~/)
│ ├── .my-git-hooks/ # My Git Hooks (subproject)
│ ├── .bin/ # Custom scripts
│ └── .* # Dotfiles (bash, zsh, git, tmux, etc.)
├── macos/ # macOS-specific configs
│ └── DefaultKeyBinding.dict
├── mise.toml # mise configuration
└── dotfiles # Main script (apply commands)
To update your dotfiles from the repository:
git pull origin master # or 'main'
./dotfiles applyThis will:
- Pull the latest changes
- Reapply all configurations, packages, and dotfiles
- Show instructions to reload your shell if needed
After updating, reload your shell:
source ~/.bash_profile # for Bash
source ~/.zshrc # for Zsh- Edit files in the
home/directory - Run
./dotfiles apply:filesto apply changes - Reload your shell:
source ~/.bash_profileorsource ~/.zshrc
Private files (not versioned) are automatically loaded if they exist:
~/.bash_private~/.zshrc_private~/.shared_shell_config_private
Add your personal configurations here without committing them to the repository.
Symptoms: Changes to dotfiles aren't taking effect, or files aren't found.
Solution:
./dotfiles apply:install # Ensure packages are installed
./dotfiles apply:files # Re-copy dotfiles
source ~/.bash_profile # Reload shell (Bash)
# or
source ~/.zshrc # Reload shell (Zsh)Symptoms: Commands like bat, rg, fzf, etc. are not recognized.
Solutions:
- Verify packages are installed:
./dotfiles apply:install - Check if
~/.shared_shell_configis loaded in your shell - Verify PATH includes
~/.local/bin(Linux) or Homebrew paths (macOS) - Reload shell:
source ~/.bash_profileorsource ~/.zshrc - Check if the package manager (Homebrew/apt) is working correctly
Symptoms: GPG key not imported, Git commits not signed, or 1Password integration not working.
Common Causes:
- 1Password CLI not installed or not signed in
- GPG key import failed during initial setup
- GPG agent not configured correctly
Solution - Use the GPG Setup Script:
We provide a dedicated script to fix GPG setup issues:
# From the dotfiles directory
./bin/setup-gpg-with-1passwordThis script will:
- ✅ Verify 1Password CLI is installed and authenticated
- ✅ Retrieve the PGP key from 1Password
- ✅ Import or reimport the GPG key
- ✅ Configure Git signing automatically
- ✅ Verify GPG agent configuration
Force Reimport: If you need to reimport the key even if it already exists:
./bin/setup-gpg-with-1password --forceManual Troubleshooting Steps:
-
Verify 1Password CLI:
op --version # Check if installed op account list # Check if signed in op signin # Sign in if needed
-
Verify GPG Key in 1Password:
op document get b2lpibkkqfqtp5lvvp25ugx3kq | head -20 -
Check Current GPG Keys:
gpg --list-secret-keys
-
Verify Git Configuration:
git config --global user.signingkey git config --global commit.gpgsign
-
Re-run Setup:
./bin/setup-gpg-with-1password # Use the setup script # or ./bin/apply-config-gpg # Original config script
Symptoms: SSH connections failing, keys not found, or 1Password SSH agent not working.
Solutions:
-
Verify 1Password SSH agent is running:
ls -la ~/.1password/agent.sock -
Check SSH config:
cat ~/.ssh/config -
Verify SSH keys in 1Password:
op item list --categories "Secure Note" | grep -i ssh
-
Re-apply SSH configuration:
./dotfiles apply:files
Symptoms: Wrong editor, merge tool, or signing not working.
Solutions:
-
Check current Git configuration:
git config --global --list
-
Verify GUI detection (should match your environment):
echo $DISPLAY # Linux GUI echo $WAYLAND_DISPLAY # Linux Wayland
-
Re-apply Git configuration:
./dotfiles apply:files
Symptoms: Packages fail to install, or installation is incomplete.
Solutions:
macOS:
# Update Homebrew
brew update
# Fix Homebrew issues
brew doctor
# Re-run installation
./dotfiles apply:installLinux:
# Update package lists
sudo apt update
# Fix broken packages
sudo apt --fix-broken install
# Re-run installation
./dotfiles apply:installUse the debug environments to troubleshoot issues in isolated containers:
# Ubuntu with GUI (VNC access)
mise run debug:linux:gui
# Debian slim without GUI
mise run debug:linux:noguiThe debug environments provide:
- Interactive bash shell with pre-configured environment
- VNC access (GUI mode) for visual debugging
- Automatic cleanup on exit
- Full access to test installation scripts
VNC Connection (GUI mode):
After starting debug:linux:gui, the script will display connection instructions.
Typically: vncviewer localhost:<port> with password password.
Run tests to verify everything works:
mise run test # Run all tests
mise run test:linux # Test on Linux (Docker)Tests verify:
- Script syntax and execution
- Dotfiles are copied correctly
- Git configuration (GUI/nogui detection)
- Shell configuration validity
This project is licensed under the WTFPL (Do What The Fuck You Want To Public License).
See LICENSE file for details.
Personal project. Feel free to use as reference.
Important: This is a personal dotfiles repository. I do not intend to transform this into a project for direct use by other people. Instead, this is meant to be forked and adapted to create your own personalized dotfiles setup.
Recommended approach:
- Fork this repository and start your own dotfiles project from here
- Adapt and customize the configuration to your needs
- Use as reference for your own setup
However, if you still want to contribute (e.g., report bugs, suggest improvements, or share ideas), feel free to:
- Report issues or suggest improvements
- Share ideas or best practices
- Submit pull requests (though they may not be merged if they're too personal/specific)