A comprehensive, modular collection of Linux dotfiles and automated installation scripts for setting up development environments across multiple distributions.
- π― Modular Architecture - 50+ individual installation scripts for granular control
- π§ Multi-Distribution - Supports Arch, Debian, Ubuntu, Pop!OS, Fedora, and RHEL
- π§ GNU Stow - Symlink-based configuration management
- β‘ Interactive & Unattended - Both modes supported for flexibility
- π Comprehensive Tools - Development tools, CLI utilities, desktop applications, AI coding assistants
- π¨ Shell Configurations - Bash and advanced ZSH configurations with Oh My Posh/Starship prompts
- π WSL2 Support - Special handling for Windows Subsystem for Linux
- π§ͺ Dry Run & Verbose Modes - Test installations and debug with detailed output
- π¦ Package Groups - Predefined groups (Minimal, Console, Desktop) for quick setup
- Languages: Node.js (v22/24), Python, Go (1.25.4), Rust, .NET SDK (10.0), PowerShell
- Cloud/DevOps: Docker, AWS CLI, GCP CLI, Terraform, Ansible, Helm, kubectl
- Editors: Neovim (with custom config), Zed, VS Code, JetBrains Toolbox
- AI/Code Assistants: Claude Code, OpenCode
- Core: git, tmux, fzf, ripgrep, bat, fd, eza, zoxide, yazi
- System: fastfetch, onefetch, glow, GitHub CLI
- Package Managers: Homebrew (Linux), Rustup
- Bash: Comprehensive configuration with Oh My Posh prompt (default) and Starship support
- ZSH: Two configurations available (see zsh/README.md for details):
config.zshβ standard config requiring external plugins (zsh-syntax-highlighting, zsh-autosuggestions)config-standalone.zshβ self-contained config with no plugin manager; recommended for new setups
- Default prompt: Oh My Posh for Bash, Starship for ZSH
- Terminals: Ghostty, Kitty, Tabby
- Editors: VS Code, Zed, JetBrains Toolbox
- Window Managers: Hyprland configuration
- Oh My Posh (with custom themes)
- Starship (with custom config)
git clone https://github.com/adeotek/dotfiles.git ~/.dotfiles && ~/.dotfiles/setup.sh-
Clone the repository:
git clone https://github.com/adeotek/dotfiles.git ~/.dotfiles cd ~/.dotfiles
-
Run the interactive setup:
./setup.sh
-
Select installation mode:
- Manual selection - Choose specific packages by ID
- Minimal - Essential tools (base-tools, bash, git, tmux, yazi)
- Console - Minimal + development tools (nodejs, golang, fastfetch, onefetch, glow, claude-code)
- Desktop - Console + desktop apps (ghostty, zed)
- Interactive - Prompted for each package individually
- All - Everything including extra packages
For automated setups (CI/CD, provisioning):
# List all available packages
./unattended_setup.sh ls
# Install specific packages
./unattended_setup.sh --packages <package-1>,<package-2>,<package-3>,...
# Examples:
./unattended_setup.sh --packages base-tools,git,zsh,docker,nodejs
./unattended_setup.sh --packages git,nvim,tmux --verbose
./unattended_setup.sh --packages docker,nodejs --dry-runThe following packages can be installed individually or in groups:
- base-tools - Essential CLI utilities (fzf, ripgrep, bat, fd, eza, zoxide, etc.)
- git - Git configuration with custom aliases and settings
- bash - Bash shell configuration with Oh My Posh or Starship prompt
- tmux - Terminal multiplexer configuration
- yazi - Modern file manager
- nodejs - Node.js runtime (v22/24, configurable)
- python - Python programming environment
- golang - Go programming language (v1.25.4)
- dotnet - .NET SDK (v10.0)
- rustup - Rust toolchain installer
- powershell - PowerShell cross-platform shell
- docker - Container platform
- ansible - Automation and configuration management
- terraform - Infrastructure as Code
- aws-cli - Amazon Web Services CLI
- gcp-cli - Google Cloud Platform CLI
- helm - Kubernetes package manager
- kubectl - Kubernetes CLI
- nvim - Neovim with custom configuration
- zed - Zed code editor
- vscode - Visual Studio Code
- jetbrains-toolbox - JetBrains development tools manager
- ghostty - Fast, native terminal emulator (Desktop tier)
- kitty - GPU-accelerated terminal emulator (Desktop Extra)
- tabby - Modern terminal application (Desktop Extra)
- fastfetch - System information display
- onefetch - Git repository information display
- glow - Markdown renderer for the terminal
- github-cli - GitHub command-line interface
- claude-code - Claude AI coding assistant
- opencode - OpenCode configuration
- hypr - Hyprland window manager configuration
- zsh - Z shell with Oh My Zsh or standalone configuration
Packages are organized into logical tiers for easy installation:
- Minimal:
base-tools,bash,git,tmux,yazi - Console: Minimal +
fastfetch,claude-code,glow,golang,nodejs,onefetch - Desktop: Console +
ghostty,zed - Console Extra:
ansible,aws-cli,docker,dotnet,github-cli,gcp-cli,helm,kubectl,nvim,opencode,powershell,python,rustup,terraform - Desktop Extra: Console Extra +
kitty,tabby,vscode,jetbrains-toolbox - All Console: Console + Console Extra
- All Desktop: Desktop + Desktop Extra
To see the complete, current list of available packages:
./unattended_setup.sh lsdotfiles/
βββ setup.sh # Interactive setup script
βββ unattended_setup.sh # Automated setup script
βββ update.sh # Update installed tools
βββ _scripts/
β βββ core/ # 50+ modular install scripts
β βββ _helpers.sh # Shared functions library
β βββ _options.sh # Package definitions
β βββ *-install.sh # Tool installation scripts
β βββ *-setup.sh # Configuration setup scripts
βββ bash/ # Bash configuration
β βββ .config/bash/
β βββ config.bash
βββ zsh/ # ZSH configurations
β βββ README.md # Detailed ZSH documentation
β βββ .config/zsh/
β βββ config.zsh # Standard ZSH config
β βββ config-standalone.zsh # Self-contained ZSH config
βββ git/ # Git configuration
βββ nvim/ # Neovim configuration
βββ tmux/ # Tmux configuration
βββ kitty/ # Kitty terminal config
βββ tabby/ # Tabby terminal config
βββ zed/ # Zed editor config
βββ hypr/ # Hyprland config
βββ starship/ # Starship prompt config
βββ oh-my-posh/ # Oh My Posh themes
βββ yazi/ # Yazi file manager config
βββ fastfetch/ # Fastfetch system info config
βββ opencode/ # OpenCode configuration
βββ _extra/ # Additional configs & templates
This project uses GNU Stow for symlink-based configuration management:
- Configurations are organized in separate directories (bash/, git/, nvim/, etc.)
- Each directory can be "stowed" independently to
$HOME - Easy to enable/disable individual configs
- No file copying - uses symlinks for instant updates
- Simple backup and version control
- Existing configurations are automatically backed up with
.bakextension
When you install a package like git or bash, the setup script:
- Backs up any existing configuration files
- Creates symlinks from
~/.dotfiles/<package>/to$HOME - Preserves your ability to customize with local override files
Example: Installing bash configuration creates:
~/.bashrcβ symlink to~/.dotfiles/bash/.bashrc~/.bashrc.localβ your local customizations (not tracked by git)
| Distribution | Versions | Status |
|---|---|---|
| Arch Linux | Rolling | β Fully Supported |
| Debian | 11+, 12, 13 | β Fully Supported |
| Ubuntu | 22.04, 24.04, 25.04+ | β Fully Supported |
| Pop!_OS | 22.04+ | β Fully Supported |
| Fedora | 40+ | β Fully Supported |
| RHEL | 9+ | β Fully Supported |
| WSL2 | All supported distros | β Special WSL2 support |
./update.shThis will:
- Update system packages (apt, dnf, pacman, etc.)
- Update Flatpak packages
- Update Homebrew packages
- Update npm global packages
- Update oh-my-posh
Create local configuration files that won't be tracked by git:
~/.bashrc.local- Local bash customizations~/.zshrc.local- Local zsh customizations~/.config/git.user/config- User-specific git config
The following default versions are configured (see _scripts/core/_options.sh):
- Node.js: v24 (all distributions)
- .NET SDK: v10.0
- Go: v1.25.4
- Nerd Fonts: v3.4.0 (CascadiaCode)
- Bash Prompt: Oh My Posh
- ZSH Prompt: Starship
Edit _scripts/core/_options.sh to change default versions, installation modes, or add new packages.
-
Install ZSH if not already present:
# Debian/Ubuntu/Pop!_OS sudo apt install zsh # Fedora/RHEL sudo dnf install zsh # Arch sudo pacman -S zsh
-
Change your login shell:
chsh -s $(which zsh) -
Log out and back in (or start a new terminal session) for the change to take effect.
-
Set up the ZSH configuration via the dotfiles installer:
./unattended_setup.sh --packages zsh
This uses Starship as the default prompt. To override:
./unattended_setup.sh --packages zsh --prompt oh-my-posh
-
Change your login shell:
chsh -s $(which bash) -
Log out and back in for the change to take effect.
-
Set up the Bash configuration via the dotfiles installer:
./unattended_setup.sh --packages bash
This uses Oh My Posh as the default prompt. To override:
./unattended_setup.sh --packages bash --prompt starship
chshchanges your login shell β the shell started when you open a terminal or log in.- In WSL2, you may need to set the default shell via your Windows Terminal profile or by editing
/etc/passwddirectly ifchshis not available. - Verify the change took effect with:
echo $SHELL
# Full development environment with Docker, Node.js, and Python
./unattended_setup.sh --packages base-tools,git,bash,tmux,nvim,docker,nodejs,python,github-cli# Infrastructure and cloud tools
./unattended_setup.sh --packages base-tools,git,bash,docker,ansible,terraform,aws-cli,gcp-cli,kubectl# Lightweight setup for servers
./unattended_setup.sh --packages base-tools,git,bash,tmux# Web development environment
./unattended_setup.sh --packages base-tools,git,bash,nodejs,vscode,github-cli# .NET development environment
./unattended_setup.sh --packages base-tools,git,bash,dotnet,vscode,github-cli# Full desktop with Hyprland
./unattended_setup.sh --packages base-tools,git,bash,kitty,hypr,zed,vscodeTest what would be installed without making changes:
./unattended_setup.sh --packages git,nvim,tmux --dry-runEnable verbose output for debugging:
./unattended_setup.sh --packages docker,nodejs --verbose
# Combine flags
./unattended_setup.sh --packages python,golang --verbose --dry-run# List all available packages
./unattended_setup.sh ls
# Interactive installation with menu
./setup.sh
# Install specific packages
./unattended_setup.sh --packages git,bash,tmux,nvim
# Test installation (dry run)
./unattended_setup.sh --packages docker,nodejs --dry-run
# Verbose output for debugging
./unattended_setup.sh --packages python --verbose
# Update all installed tools
./update.sh- Bash:
~/.config/bash/config.bash(sourced from~/.bashrc) - ZSH:
~/.config/zsh/config.zshorconfig-standalone.zsh - Git:
~/.config/git/config(user settings in~/.config/git.user/config) - Neovim:
~/.config/nvim/ - Tmux:
~/.config/tmux/tmux.conf - Kitty:
~/.config/kitty/kitty.conf - Yazi:
~/.config/yazi/ - Oh My Posh:
~/.config/oh-my-posh/themes/
These files are ignored by git and allow personal customizations:
~/.bashrc.local- Local bash configuration~/.zshrc.local- Local ZSH configuration~/.config/git.user/config- User-specific git settings (name, email, etc.)
Contributions are welcome! Please feel free to submit issues or pull requests.
When adding new installation scripts:
- Follow the existing script structure
- Use the helper functions from
_scripts/core/_helpers.sh - Support all major distributions (or clearly document limitations)
- Add dry-run and verbose mode support
- Test on multiple distributions
- Add the package to
_options.shin the appropriate tier array(s) - Map the task type (
installorsetup) in theTASK_TYPESassociative array - Optionally add default arguments in the
TASK_ARGSassociative array (e.g.--prompt starship)
For detailed coding guidelines for AI agents and developers, see AGENTS.md.
- Use shellcheck for linting
- Quote all variable expansions:
"$variable" - Use
[[ ]]for conditionals, not[ ] - Use 2 spaces for indentation (no tabs)
- Add comprehensive error handling
- Support
--verboseand--dry-runflags - Use helper functions:
cecho,decho,install_package,stow_package
This project is open source and available under the MIT License.
Permission Denied
# Make scripts executable
chmod +x setup.sh unattended_setup.sh update.shPackage Not Found
# Verify package name
./unattended_setup.sh lsStow Conflicts
# Existing configs are automatically backed up with .bak extension
# To manually remove stowed configs:
cd ~/.dotfiles
stow -D bash # Unstow bash configSystem Update Fails
# Update manually first
sudo apt update && sudo apt upgrade # Debian/Ubuntu
sudo dnf update # Fedora/RHEL
sudo pacman -Syu # ArchFor detailed error information, use verbose mode:
./unattended_setup.sh --packages <package> --verboseCheck individual script logs in verbose mode for specific issues.
- Inspired by various dotfiles repositories across the GitHub community
- Built with insights from Oh-My-Zsh, Prezto, and other shell frameworks
- Special thanks to the creators of all the amazing tools included
- Icons and terminal themes from Nerd Fonts project
Note: These dotfiles are personalized for development workflows but designed to be easily customizable. Feel free to fork and adapt to your needs!