█████╗ █████╗ ███████╗██╗ ██╗██╗ ██╗████████╗ ██████╗ ███████╗██╗ ██╗
██╔══██╗██╔══██╗██╔════╝██║ ██║██║ ██║╚══██╔══╝██╔═══██╗██╔════╝██║ ██║
███████║███████║███████╗███████║██║ ██║ ██║ ██║ ██║███████╗███████║
██╔══██║██╔══██║╚════██║██╔══██║██║ ██║ ██║ ██║ ██║╚════██║██╔══██║
██║ ██║██║ ██║███████║██║ ██║╚██████╔╝ ██║ ╚██████╔╝███████║██║ ██║
╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝╚═╝ ╚═╝
Arch Linux · Omarchy · Hyprland — my daily driver, versioned.
- Screenshots
- Features
- Included Configurations
- Installation
- Updating an Existing Installation
- 🩺 Diagnose & Repair
- Zsh Is Required
- About
~/.local/bin/env - What
install.shActually Does - What
bootstrap.shActually Does - Repository Structure
- Requirements
- Backups & Rollback
- Wallpaper Credits
- License
Hero shot: Hyprland + Omarchy shell + wallhaven
|
|
| Ghostty + Fastfetch + Starship | Editor workflow in VS Code |
|
|
|
| LazyVim | Yazi file manager | Idle screensaver |
| 🖥️ WM | Hyprland on Omarchy (Quickshell-based shell) |
| 🎨 Theme | wallhaven, applied system-wide via Aether |
| ⚡ System Info | Fastfetch |
| ⭐ Prompt | Starship |
| 📝 Editors | Neovim (LazyVim) & VS Code |
| 📂 File Manager | Yazi |
| 🐚 Shell | Zsh (fish in foot) |
| 👻 Terminal | Ghostty / Alacritty / Kitty / Foot |
| 📊 Monitor | Btop |
| 🚀 Bar / Launcher / OSD | Omarchy shell (Quickshell) |
| 🖼️ Wallpapers | Curated collection included |
alacritty · atuin · btop · fastfetch · fish · foot · ghostty · hyprland
kitty · lazydocker · lazygit · mise · mpv · neovim · omarchy · starship
tmux · voxtype · VS Code · yazi · zellij · zsh
curl -fsSL https://raw.githubusercontent.com/Aashutosh31/dotfiles/main/bootstrap.sh | bashHandles everything: installs git/yay if missing, clones the repo, and runs the installer.
git clone https://github.com/Aashutosh31/dotfiles.git
cd dotfiles
chmod +x install.sh
./install.shAfter installation, if Hyprland is running, reload the config to apply changes:
hyprctl reloadThen open a new terminal — the installer makes sure zsh is your login shell, and a shell change only applies to new login sessions.
install.sh is safe to re-run at any time — that is the update mechanism:
cd ~/dotfiles
git pull
./install.sh- Every file it overwrites is backed up first to
~/.dotfiles-backup/<timestamp>/. - It never deletes your config directories and never removes files that only exist on your system.
- It does not perform a system upgrade (no
pacman -Syu) — on Omarchy, upgrades belong toomarchy update, which the installer never bypasses. It only installs packages frompackages/that are missing. - If something in your shell environment is still off afterwards, see Diagnose & Repair below.
Two companion scripts let you fix problems without reinstalling everything.
./doctor.shChecks, without touching anything:
| Check | Severity |
|---|---|
Required packages installed (zsh, starship, zoxide, atuin, yazi, mise, plugins, …) |
FAIL if missing |
Commands resolvable on $PATH |
FAIL if missing |
/bin/zsh + /usr/bin/zsh exist, zsh listed in /etc/shells |
FAIL if missing |
| Login shell is zsh | FAIL otherwise |
~/.local/bin/env + env.fish present |
FAIL if missing |
| zsh-autosuggestions / zsh-syntax-highlighting plugin files | FAIL if missing |
| Installed shell configs match the repo | WARN on drift |
Broken symlinks under ~/.config |
WARN |
Exit code is non-zero when any required component is missing, so you can use it in scripts or CI.
./repair.shSafe and idempotent — run it as many times as you like; unchanged state prints [SKIP]. It:
- Installs only required packages that are actually missing.
- Ensures zsh is installed and listed in
/etc/shells. - Sets your login shell to zsh — only if it isn't already (never repeats
chsh), printing a clear message and reminding you to start a new session. - Recreates
~/.local/bin/env/env.fishwhen they are missing (see below). - Re-applies only the shell-related configs (
.zshrc,.XCompose, starship, fish, mise, atuin) — each backed up before being overwritten.
It never runs a system upgrade, never deletes home/config data, and exits non-zero if anything could not be fixed.
This setup requires Zsh. The shell environment depends on zsh-specific features:
- zsh options & completion (
setopt,autoload -Uz compinit) - zoxide integration (
z,cd=z) - atuin history integration (
eval "$(atuin init zsh)") - zsh-autosuggestions & zsh-syntax-highlighting
- Starship prompt
- all existing aliases/functions in .zshrc
install.sh and repair.sh both ensure: zsh installed → /bin/zsh present and listed in /etc/shells → login shell set to /bin/zsh (only when needed). After the change you must start a new login session/terminal for it to take effect. Don't try to source ~/.zshrc from Bash — it uses zsh-only builtins and will error.
The last line of .zshrc sources ~/.local/share/../bin/env (= ~/.local/bin/env). That file is created by uv's standalone installer (curl -LsSf https://astral.sh/uv/install.sh | sh), not by mise, Omarchy, pacman, or this repo. On a fresh machine where uv was never installed standalone, the file doesn't exist and every zsh startup ends with:
/home/<you>/.local/share/../bin/env: No such file or directory
install.sh and repair.sh recreate this file — byte-for-byte identical to uv's template — whenever it is missing, so the shell always starts cleanly even before uv itself is installed.
Click to expand the step-by-step breakdown
- Resolves the repo path — works regardless of where you run it from (
$REPO= script's own directory). - Installs missing official packages — ensures everything in
packages/pacman.txtis present, using Omarchy'somarchy-pkg-addhelper when available (falling back topacman -S --needed). This does not perform a full system upgrade — on Omarchy, system upgrades belong toomarchy update, which the installer never bypasses. - Installs AUR packages — if
yayis present, installs everything inpackages/aur.txtnon-interactively (--answerclean None --answerdiff None). Skips gracefully ifyayisn't found. - Creates a timestamped backup at
~/.dotfiles-backup/<YYYY><MM><DD>-<HHMMSS>/— see Backups & Rollback below. - Backs up and replaces each config — for every tool in the list (
alacritty,atuin,btop,fastfetch,fish,foot,ghostty,hypr,kitty,lazydocker,lazygit,mise,mpv,nvim,omarchy,tmux,voxtype,yazi,zellij):- if a matching config exists in this repo, each file in your current
~/.config/<tool>is backed up individually, then replaced in-place (safe to run while a desktop session is live — the directory is never deleted).
- if a matching config exists in this repo, each file in your current
- Installs starship at
~/.config/starship.toml, the wallhaven theme background into~/.config/omarchy/themes/wallhaven/, and the custom About screen launcher to~/.local/bin/omarchy-launch-about. - Backs up and replaces dotfiles —
~/.zshrcand~/.XComposeget the same backup-then-overwrite treatment. - Sets up the shell environment (Stage 4) — makes sure copying
.zshrcactually results in a usable shell:- adds zsh to
/etc/shellsif missing, - sets your login shell to zsh only if it isn't already (never re-runs
chshunnecessarily; prints a clear message when it changes and reminds you that a new login session is needed), - recreates
~/.local/bin/env+env.fishif they're missing (uv-installer template — see About~/.local/bin/env), - verifies every command
.zshrcdepends on resolves, warning about any that don't.
- adds zsh to
- Prints the backup location so you always know exactly where your previous setup went.
Nothing is deleted without a backup first. Every overwrite is preceded by a copy (cp -a) into the timestamped backup folder. Configs are installed via per-file in-place replacement so a running desktop session never sees a missing or partially-written config directory.
Click to expand
Bootstrap is for a brand-new machine that doesn't have this repo (or possibly git/yay) yet:
- Verifies you're on Arch — checks for
pacman, exits cleanly otherwise (no Arch, no dice). - Installs Git if missing.
- Installs
yayif missing — clones and builds it from the AUR viamakepkg -si. - Clones or updates the repo — clones fresh to
~/dotfilesif it doesn't exist, orgit pulls if it does. - Makes scripts executable —
install.shand everything inscripts/. - Hands off to
install.shto do the actual config installation described above.
In short: bootstrap.sh gets a bare Arch install to the point where install.sh can run — then runs it.
.
├── alacritty/
├── atuin/
├── btop/
├── doctor.sh # read-only installation health check
├── fastfetch/
├── fish/
├── foot/
├── ghostty/
├── home/ # ~/.zshrc, ~/.XCompose
├── hypr/ # Hyprland Lua config (Quattro)
├── kitty/
├── lazydocker/
├── lazygit/
├── mise/
├── mpv/
├── nvim/
├── repair.sh # safe, idempotent in-place repair
├── vscode/
├── omarchy/ # shell, bar plugin, theme, hooks, theme.name
├── bootstrap.sh # one-shot installer for fresh machines
├── packages/ # pacman.txt, aur.txt
├── scripts/ # omarchy-launch-about, lib/shell-env.sh
├── starship/
├── tmux/
├── voxtype/
├── wallpapers/
├── yazi/
└── zellij/
- Arch Linux
- Omarchy
- Zsh (installed and set as login shell automatically by
install.sh/repair.sh— required for this setup to function) yay(auto-installed bybootstrap.shif missing)- Git
Every run of install.sh creates a fresh timestamped snapshot before touching anything:
~/.dotfiles-backup/20260701-143022/
To roll back a specific config manually:
cp -a ~/.dotfiles-backup/<timestamp>/.config/<tool> ~/.config/MIT License
built in the terminal, for the terminal