Forever work in progress
This repository contains my personal dotfiles and configuration files for various applications and tools I use daily. The goal is to maintain a clean, efficient, and personalized development environment.
This repository includes an intelligent installation system with cross-distribution support.
Quick start:
# Clone the repository
git clone https://github.com/Wabri/dotfiles.git ~/dotfiles
cd ~/dotfiles
# Install the CLI (adds 'dotfiles' command to PATH)
./install-cli.sh
# Stow specific configs
dotfiles stow nvim zsh
# Install packages for the configs you stowed
dotfiles packages nvim zsh
# Run setup tasks (zsh, asdf, etc)
dotfiles setupUsing the CLI:
dotfiles help # Show all commands
dotfiles stow nvim zsh # Stow specific configs
dotfiles preview sway # Preview changes before applying (shows file diffs)
dotfiles packages nvim zsh # Install packages for specific tools
dotfiles setup # Run setup tasks (zsh, asdf, etc)
dotfiles status # Check repository status
dotfiles diff # Show differences between local and remote
dotfiles commit "message" # Stage all changes and commit
dotfiles push # Push local commits to remote
dotfiles update # Pull latest changes and restowAdding a new tool configuration:
# 1. Create directory structure
mkdir -p mytool/.config/mytool
# 2. Add your config files
cp ~/.config/mytool/* mytool/.config/mytool/
# 3. Add packages (optional)
echo "mytool" > mytool/packages.txt
# 4. Exclude packages.txt from stowing
echo "packages.txt" > mytool/.stow-local-ignore
# 5. Test it
dotfiles preview mytool
dotfiles stow mytoolMaking changes:
- Use
dotfiles previewbefore stowing - Test on a clean system if possible
- Keep commit messages clear and descriptive
Architecture:
- Why Bash? Universal on Linux, no runtime dependencies, easy to read/modify
- Why GNU Stow? Simple symlink management, handles directories automatically, battle-tested
- Module structure: CLI → install.sh → specialized scripts (packages.sh, stow.sh, setup.sh)
Code style:
- Use
set -efor fail-fast behavior - Consistent logging:
log_info,log_success,log_warning,log_error - Quote variables:
"$variable"not$variable - Use
[[ ]]for conditions, not[ ]
Known limitations:
- Fully tested on openSUSE Tumbleweed; supported on Debian/Ubuntu, Fedora, Arch
- Existing files prevent stowing (remove them manually or use
dotfiles unstowfirst) - Some packages may not exist in all distro repositories
gitandstow(required)- Supported distributions: openSUSE, Debian/Ubuntu, Fedora, Arch Linux
- 🖥️ Window managers: niri, sway, hyprland, i3wm, gnome
- 💻 Terminals: ghostty, alacritty, kitty
- 🐚 Shells: zsh, bash with custom configurations
- ✏️ Editor: Neovim with extensive plugin setup
- 🛠️ Development tools: tmux, git, asdf, and more
- 🎨 UI components: waybar, rofi, wofi, fuzzel, mako, dunst