A modular, cross-platform dotfiles configuration supporting CachyOS (Niri), NixOS, and Arch Linux (i3).
This repository is organized to support multiple operating systems while keeping reusable configurations modular:
dotfiles/
├── nvim/ # Neovim config (submodule: github.com/yourusername/nvim-config)
├── rofi/ # Rofi launcher (submodule: github.com/yourusername/rofi-config)
├── hypr/ # Hyprland WM (submodule: github.com/yourusername/hypr-config)
├── niri/ # Niri WM (submodule: github.com/yourusername/niri-config)
├── tmux/ # Tmux terminal multiplexer (submodule: github.com/yourusername/tmux-config)
├── zsh/ # Zsh shell (submodule: github.com/yourusername/zsh-config)
├── kanata/ # Kanata keyboard remapper (submodule: github.com/yourusername/kanata-config)
├── kitty/ # Kitty terminal (submodule: github.com/yourusername/kitty-config)
├── waybar/ # Waybar status bar (submodule: github.com/yourusername/waybar-config)
├── shared/ # Cross-platform utilities
│ ├── bin/ # Installation scripts
│ ├── scripts/ # Helper scripts
│ ├── themes/ # Color schemes and themes
│ ├── wallpapers/ # Wallpaper collection
│ └── run.sh # Main installation orchestrator
├── cachyos/ # CachyOS-specific configs
│ ├── dunst/ # Notification daemon
│ ├── wal/ # Pywal theming
│ ├── waypaper/ # Wallpaper manager
│ ├── nix-files/ # Nix packages on CachyOS
│ └── package-manager/
├── nixos/ # NixOS-specific configs
│ ├── flake.nix # NixOS flake configuration
│ ├── flake.lock # Flake lock file
│ ├── hosts/ # Per-host configurations
│ └── stow/ # Stow-based configs
└── arch-i3/ # Arch Linux i3 configs
├── i3/ # i3 window manager
├── polybar/ # Polybar status bar
├── picom/ # Compositor
└── alacritty/ # Alacritty terminal
Clone the repository with all submodules:
git clone --recurse-submodules https://github.com/yourusername/dotfiles.git ~/dotfiles
cd ~/dotfilesIf you already cloned without submodules, initialize them:
git submodule update --init --recursiveThe automated installation script will install packages and symlink configurations using GNU Stow:
cd ~/dotfiles/shared
chmod +x run.sh
./run.shThis will:
- Install
stowif not present - Run all
install_*.shscripts inshared/bin/ - Install packages via
paru(Arch-based systems) - Symlink configurations to
~/.config/
You can install individual configurations:
cd ~/dotfiles/shared/bin
./install_nvim.sh # Install Neovim and symlink config
./install_hypr.sh # Install Hyprland and symlink config
./install_zsh.sh # Install Zsh and symlink config
# etc...For NixOS, use the flake configuration:
cd ~/dotfiles/nixos
sudo nixos-rebuild switch --flake .#yourhostnamePull latest changes from all submodule repositories:
git submodule update --remote --mergecd nvim # or any submodule directory
git pull origin main
cd ..
git add nvim
git commit -m "Update nvim submodule"-
Navigate to the submodule directory:
cd nvim -
Make your changes and commit within the submodule:
git checkout main git add . git commit -m "Update configuration" git push origin main
-
Return to the main dotfiles repo and update the submodule reference:
cd .. git add nvim git commit -m "Update nvim submodule reference"
git submodule add https://github.com/yourusername/new-config.git new-config
git commit -m "Add new-config as submodule"git submodule deinit -f new-config
git rm -f new-config
rm -rf .git/modules/new-config
git commit -m "Remove new-config submodule"Uses Wayland with Niri window manager. Key configs:
- Window Manager:
niri/(submodule) - Terminal:
kitty/(submodule) - Status Bar:
waybar/(submodule) - Launcher:
rofi/(submodule) - Notifications:
cachyos/dunst/ - Theming:
cachyos/wal/
Declarative system configuration using Flakes:
- Main config:
nixos/flake.nix - Host-specific:
nixos/hosts/ - All submodules are available and symlinked via Stow
X11-based setup with i3 window manager:
- Window Manager:
arch-i3/i3/ - Terminal:
arch-i3/alacritty/ - Status Bar:
arch-i3/polybar/ - Compositor:
arch-i3/picom/ - Editor:
nvim/(submodule, shared across OS)
Configurations are symlinked using GNU Stow. Each submodule at the root level can be stowed:
cd ~/dotfiles
stow -t ~ nvim # Creates symlinks: ~/.config/nvim -> ~/dotfiles/nvim/.config/nvim
stow -t ~ zsh # Creates symlinks: ~/.config/zsh -> ~/dotfiles/zsh/.config/zshTo unstow (remove symlinks):
stow -D nvimTo restow (update symlinks):
stow -R nvimmain- Unified configuration (current)cachyos/niri- Original CachyOS/Niri branch (preserved)nixos- Original NixOS branch (preserved)arch/i3- Original Arch i3 branch (preserved)
The main branch merges all OS-specific configurations into organized directories while keeping shared configs as submodules at the root level.
When testing changes to a submodule configuration:
- Edit files in the submodule directory (e.g.,
nvim/) - Symlinks created by Stow will reflect changes immediately
- Commit and push changes from within the submodule
- Update the submodule reference in the main repo
Installation scripts follow this pattern:
#!/bin/bash
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd)"
DOTFILES_DIR="$(dirname "$SCRIPT_DIR")" # Points to dotfiles root
source "$SCRIPT_DIR/includes/install.sh"
source "$SCRIPT_DIR/includes/stow_config.sh"
install_pkg "package-name" "command-name"
stow_config "config-name" "$DOTFILES_DIR"Place new scripts in shared/bin/install_<name>.sh and they'll be picked up by run.sh.
MIT License - Feel free to use and modify as needed.
This is a personal dotfiles repository, but feel free to fork and adapt for your own use. If you find bugs or have suggestions, open an issue or PR.
Built with inspiration from the dotfiles community. Thanks to all the open-source projects that make this configuration possible.