ββββββ ββββββ βββββββββββ ββββββ ββββββββββββ βββββββ βββββββββββ βββ
βββββββββββββββββββββββββββ ββββββ ββββββββββββββββββββββββββββββββ βββ
βββββββββββββββββββββββββββββββββββ βββ βββ βββ βββββββββββββββββββ
βββββββββββββββββββββββββββββββββββ βββ βββ βββ βββββββββββββββββββ
βββ ββββββ ββββββββββββββ ββββββββββββ βββ ββββββββββββββββββββ βββ
βββ ββββββ ββββββββββββββ βββ βββββββ βββ βββββββ βββββββββββ βββ
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