Cross-platform developer environment for macOS, Arch Linux, Debian, and WSL—featuring automated setup, modular configuration management, and zero-friction onboarding.
git clone git@github.com:av1155/.dotfiles.git ~/.dotfiles
cd ~/.dotfiles
./install.sh
exec zsh- Portable: Works across macOS (Intel/Apple Silicon), Arch Linux, Debian, WSL, and Raspberry Pi
- Safe & Idempotent: Automatically backs up conflicts, can be run multiple times safely
- Zero Configuration: Automated detection and installation of tools based on your platform
- Modular: Managed with GNU Stow—easy to add, remove, or customize individual packages while only version-controlling the paths you choose
- Fast: Optimized shell startup with lazy-loading and caching (1-2s faster than default configs)
- Robust: Error-resistant with network checks, retry protection, and graceful degradation
- .dotfiles
- Universal Shell Environment: Zsh configuration that adapts to macOS, Arch, Debian, WSL, and Raspberry Pi
- Automated Tool Installation: Homebrew, Oh-My-Zsh, Conda, and platform-specific package managers installed automatically
- Smart Plugin Management: ZPlug with Pure theme, syntax highlighting, autosuggestions, and async rendering
- Self-Healing tmux: Automatic plugin manager setup with session persistence and custom keybindings
- Enhanced Navigation: FZF fuzzy finder integrated with bat, git, and file browsing
- AI Development Tools: Pre-configured OpenCode agents, Claude MCP servers, and Aider integration
- Python Environment: Conda/Miniforge auto-setup with Neovim provider configuration
- Node.js Management: NVM lazy-loading for instant shell startup
- Java Development: Auto-configured classpath with JUnit and common libraries
- Modern CLI Tools: fastfetch, yazi, lazygit, eza, zoxide, ripgrep, and more
- Catppuccin Theming: Consistent color schemes across bat, tmux, and terminal
- Nerd Font Included: JetBrains Mono with icons and ligatures
- Git: For cloning the repository
- Zsh: Your default shell (will be configured automatically)
- GNU Stow: Symlink management (installation instructions provided below)
- curl/wget: For downloading tools (usually pre-installed)
Optional but recommended:
- tmux: Terminal multiplexer
- Neovim: Modern vim editor
- Python 3: For Neovim provider and development
The installation script handles everything automatically:
-
Clone this repository:
git clone git@github.com:av1155/.dotfiles.git ~/.dotfiles -
Install GNU Stow (if not already installed):
# macOS brew install stow # Arch Linux sudo pacman -S stow # Debian/Ubuntu sudo apt install stow
-
Run the installation script:
cd ~/.dotfiles ./install.sh
By default, the installer will ask whether you want to run a dry run first or apply changes immediately.
What the script does:
- Auto-detects required base directories (such as
.config,.local,.ssh,.fonts,.claude, andLibrarywhen present in package roots) - Creates only required base directories for Stow (such as
~/.config,~/.local,~/.ssh,~/.fonts,~/.claude, and~/Library) - Avoids relying on pre-created nested managed paths, so Stow can link managed entries cleanly
- Detects conflicts with existing files
- Backs up conflicting files to
filename.bak(with notification) - Runs Stow safely using the detected package set
- Idempotent—safe to run multiple times
- Offers optional troubleshooting menu for fixing common issues
- Auto-detects required base directories (such as
-
Restart your shell:
exec zsh
Click to expand manual installation steps
If you prefer manual control:
-
Pre-create only base directories:
mkdir -p ~/.config ~/.local ~/.ssh ~/.fonts ~/.claude ~/Library
Do not pre-create nested managed paths such as:
~/.config/opencode ~/.config/opencode/ollama-opencode
-
Back up any conflicting files:
mv ~/.zshrc ~/.zshrc.bak mv ~/.gitconfig ~/.gitconfig.bak # ... repeat for other conflicts
-
Run GNU Stow:
cd ~/.dotfiles stow --restow */
-
Restart your shell:
exec zsh
Note: Run man stow to understand how symlink management works.
The installer supports interactive and explicit modes.
Interactive mode:
cd ~/.dotfiles
./install.shThis will prompt you to choose:
- Dry run (show what would happen)
- Apply changes
Explicit dry run:
cd ~/.dotfiles
./install.sh --dry-run
# or
./install.sh -nApply mode without the initial dry-run prompt:
cd ~/.dotfiles
./install.sh --yes
# or
./install.sh -yHelp:
cd ~/.dotfiles
./install.sh --helpDry run mode shows exactly what the installer would do without making filesystem changes, including:
- base directories it would create
- conflicting files it would back up
- the Stow command it would run
- troubleshooting actions it would take
This repository is the canonical source of truth for all Stow-managed paths.
GNU Stow is not a background sync tool. It creates symlinks from $HOME into .dotfiles.
In practice, some target directories may be:
- symlinked directly to entries in
.dotfiles - real directories containing a mix of:
- symlinked entries managed by Stow
- local unmanaged files
This is intentional for places like ~/.config, where only selected application configs should be version-controlled.
Implications:
-
Changes to existing symlinked files or directories are reflected immediately.
-
New files added inside an already-symlinked directory are reflected immediately.
-
New top-level files or directories added to a Stow package may require re-running Stow:
cd ~/.dotfiles stow --restow Config
Example:
~/.configremains a normal directory~/.config/opencodemay be a mixed directory.dotfilesis the source of truth only for the symlinked entries inside that managed path
Click to expand directory structure
.
├── install.sh # Automated installation script
├── .stow-global-ignore # Files to exclude from stowing
│
├── App-Configs/ # Application-specific configurations
│ └── configs/
│ ├── iTerm2_Profile/ # iTerm2 profile and icons
│ ├── KittyAppIconMac/ # Custom Kitty icons
│ └── MacOS-Bootstrap/ # macOS dev environment bootstrap script
│
├── Claude/ # Claude AI MCP server configurations
│ └── .claude/
│
├── Config/ # XDG config directory
│ └── .config/
│ ├── bat/ # Bat (better cat) themes
│ ├── fastfetch/ # System info display
│ ├── hypr/ # Hyprland window manager (Linux)
│ ├── kitty/ # Kitty terminal emulator
│ ├── lazygit/ # Git TUI configuration
│ ├── opencode/ # OpenCode AI agents & settings
│ ├── tmux/ # Tmux configuration & plugins
│ └── yazi/ # File manager configuration
│
├── Fonts/ # JetBrains Mono Nerd Font (all variants)
│ └── .fonts/
│
├── Formatting-Files/ # Code formatters & linters
│ ├── .clang-format
│ ├── .markdownlint-cli2.yaml
│ └── .prettierrc.json
│
├── Git/ # Git configuration
│ ├── .gitconfig
│ ├── .gitignore_global
│ └── README.md # Git subtree workflow guide
│
├── Java-Jars/ # Java development libraries
│ └── javaClasspath/ # JUnit, jsoup, etc.
│
├── Local/ # XDG local data
│ └── .local/
│
├── macOS-Library/ # macOS Application Support
│ └── Library/
│ └── Application Support/
│ ├── Code/ # VSCode settings
│ └── lazygit/ # Lazygit config
│
├── SSH/ # SSH configuration
│ └── .ssh/
│ └── config
│
└── ZSH/ # Zsh shell configuration
├── .zshrc # Main shell config
├── .zprofile # Login shell config
└── fzf-git.sh/ # FZF git integrationThe .zshrc is designed to work seamlessly across different platforms:
- Platform Detection: Automatically detects macOS, Arch Linux, Debian, WSL, and Raspberry Pi
- Oh-My-Zsh: Managed with automatic installation and plugin support
- ZPlug: Plugin manager with Pure theme, syntax highlighting, and autosuggestions
- Performance: Lazy-loading (NVM), caching (conda config), and optimized PATH management
- Fastfetch: System information display on new shells
- Smart Aliases: Context-aware shortcuts for common tasks
Auto-configured tmux with plugin management:
- Auto-Start: Automatically starts or attaches to tmux sessions
- Plugin Manager: TPM (Tmux Plugin Manager) can be set up via the troubleshooting menu
- Plugins Included:
tmux-sensible: Sensible defaultsvim-tmux-navigator: Seamless vim/tmux navigationcatppuccin/tmux: Beautiful themetmux-cpu: CPU usage displaytmux-yank: System clipboard integrationtmux-sessionx: Advanced session switcher
- Custom Keybindings:
Ctrl+Aprefix, intuitive pane navigation - Status Bar: Custom top status with directory, session, and system info
Automatic setup for platform-specific package managers:
- macOS: Homebrew with automatic installation
- Arch Linux: Paru (AUR helper) with auto-compilation
- Conda/Miniforge: Python environment management
- NVM: Node.js version management (lazy-loaded)
Pre-configured for modern development:
- Neovim: Python provider auto-configured with conda environments
- Git: Enhanced with FZF integration and custom aliases
- AI Tools:
- OpenCode with specialized agents (code-reviewer, debugger, refactorer, etc.)
- Claude MCP servers (git, time, fetch, brave-search, playwright, magic)
- File Navigation:
- FZF: Fuzzy finder with custom keybindings
- Bat: Syntax-highlighted file viewer
- Eza: Modern
lsreplacement - Yazi: Terminal file manager
- Zoxide: Smart directory jumping
- Terminal Tools:
- Lazygit: Git TUI
- Thefuck: Command correction
- Ripgrep: Fast text search
Consistent Catppuccin theming:
- Bat: Catppuccin Macchiato syntax highlighting
- Tmux: Catppuccin Frappe theme
- Kitty: Dynamic font size and opacity per OS
- Ghostty: Dynamic font size and opacity per OS
- Fonts: JetBrains Mono Nerd Font (all variants included)
Comprehensive macOS development environment setup script:
- Location:
App-Configs/configs/MacOS-Bootstrap/ - Features: Automated installation of Homebrew, development tools, AstroNvim, and essential utilities
- Documentation: See MacOS-Bootstrap README
Create a new stow package:
cd ~/.dotfiles
mkdir -p MyCustom/.config/myapp
# Add your configs
stow MyCustomIf you later add new top-level files or directories to an existing package, re-run Stow for that package:
cd ~/.dotfiles
stow --restow MyCustomCreate local override files that won't be tracked:
# Add personal zsh customizations
echo "# My custom aliases" >> ~/.zshrc.local
source ~/.zshrc.local # Add this to .zshrcOnly stow specific packages:
# Install only Git and ZSH configs
cd ~/.dotfiles
stow Git ZSHPull the latest changes and re-run the installer:
cd ~/.dotfiles
git pull --rebase
./install.sh
exec zshNote: The installer safely re-stows managed packages. Existing symlinked content updates immediately, while newly added top-level package paths may require a restow.
Use GNU Stow to remove all symlinks:
cd ~/.dotfiles
stow -D */Restore your original files from .bak backups:
mv ~/.zshrc.bak ~/.zshrc
mv ~/.gitconfig.bak ~/.gitconfig
# ... restore other backupsRemove installation markers to allow fresh reinstalls:
rm ~/.homebrew_install_attempted
rm ~/.ohmyzsh_install_attempted
rm ~/.miniforge_install_attempted
rm ~/.tmux_tpm_setup_complete
# ... etc.The installation script includes an interactive troubleshooting menu. Run it anytime with:
cd ~/.dotfiles
./install.shWhen prompted, choose y to access the troubleshooting menu with these options:
- Fix Tmux Plugin Manager (TPM): Installs or repairs TPM installation
- Reinstall all Tmux plugins: Removes and reinstalls all tmux plugins
- Reset Tmux configuration completely: Nuclear option—completely removes and reinstalls everything tmux-related
- Exit: Return to normal operation
Dry run also applies to the troubleshooting menu, so you can preview those actions safely before making changes.
If tmux plugins aren't working, use the troubleshooting menu above, or manually:
-
Remove existing plugins:
rm -rf ~/.config/tmux/plugins ~/.tmux/plugins
-
Reinstall TPM:
git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm -
Reload tmux configuration:
tmux source-file ~/.config/tmux/tmux.conf -
Install plugins:
- Inside tmux:
Ctrl+AthenI(capital i) - Or run:
~/.tmux/plugins/tpm/bin/install_plugins
- Inside tmux:
If you encounter symlink conflicts:
# See what's conflicting
cd ~/.dotfiles
stow --simulate --restow */
# Manually backup conflicting files
mv ~/.conflicting-file ~/.conflicting-file.bak
# Re-run stow
./install.shCommon causes:
- A managed target path already exists as a real file or directory
- A nested managed path was created manually before Stow ran
- A target directory contains local unmanaged files, so Stow cannot replace it with a single symlink
Example:
~/.configis expected to remain a normal directory~/.config/opencodemay remain a mixed directory containing both symlinked entries and local unmanaged files
In mixed directories, .dotfiles is the source of truth only for the symlinked entries.
If you add a new sibling path in a Stow package and it does not appear in the target directory, re-run Stow for that package:
cd ~/.dotfiles
stow --restow Config- Oh-My-Zsh not installed: Delete
~/.ohmyzsh_install_attemptedand restart shell - Brew commands not found: Restart shell or run
eval "$(/opt/homebrew/bin/brew shellenv)" - Python provider errors in Neovim: Run
:checkhealth providerin Neovim for diagnostics