Skip to content

Instantly share code, notes, and snippets.

@Aabayoumy
Last active July 30, 2026 05:23
Show Gist options
  • Select an option

  • Save Aabayoumy/0d9eaec0629bbaea0c2c318b058525c1 to your computer and use it in GitHub Desktop.

Select an option

Save Aabayoumy/0d9eaec0629bbaea0c2c318b058525c1 to your computer and use it in GitHub Desktop.
#!/bin/bash
set -e
# ===========================================================
# Step 1: Backup existing configurations
# ===========================================================
if ! command -v zip &> /dev/null; then
sudo apt-get update -qq && sudo apt-get install -y zip -qq
fi
BACKUP_DATE=$(date +"%Y-%m-%d_%H-%M-%S")
BACKUP_FILE="$HOME/terminal_backup_$BACKUP_DATE.zip"
zip -rq "$BACKUP_FILE" \
~/.zshrc ~/.zprofile ~/.zsh_history ~/.oh-my-zsh \
~/.config/nvim ~/.local/share/nvim ~/.local/state/nvim ~/.cache/nvim \
~/.config/fastfetch ~/.config/starship.toml \
2>/dev/null || true
echo "Backup saved to: $BACKUP_FILE"
# ===========================================================
# Step 2: Clean existing config files
# ===========================================================
rm -rf ~/.config/nvim ~/.local/share/nvim ~/.local/state/nvim ~/.cache/nvim
rm -rf ~/.config/fastfetch
rm -rf ~/.oh-my-zsh
rm -f ~/.zshrc ~/.zprofile ~/.zsh_history
ARCH=$(uname -m)
echo "Detected architecture: $ARCH"
# ===========================================================
# Step 3: Install core packages
# ===========================================================
echo "Installing core packages..."
sudo apt update && sudo apt install -y \
curl git wget gawk zsh fzf \
fastfetch eza zoxide bat ripgrep fd-find build-essential \
unzip luarocks xclip qemu-guest-agent aria2
sudo systemctl enable --now qemu-guest-agent
# fd-find installs as 'fdfind' on Debian/Ubuntu โ€” symlink to expected name
if command -v fdfind &> /dev/null && ! command -v fd &> /dev/null; then
sudo ln -sf "$(which fdfind)" /usr/local/bin/fd
fi
# batcat โ†’ bat symlink on Debian/Ubuntu
if command -v batcat &> /dev/null && ! command -v bat &> /dev/null; then
sudo ln -sf "$(which batcat)" /usr/local/bin/bat
fi
# ===========================================================
# Step 4: Install latest Fastfetch
# ===========================================================
echo "Installing Fastfetch..."
if grep -q "Ubuntu" /etc/issue 2>/dev/null; then
sudo add-apt-repository -y ppa:zhangsongcui3371/fastfetch
sudo apt update && sudo apt install -y fastfetch
else
if [ "$ARCH" = "x86_64" ]; then
FF_DEB="fastfetch-linux-amd64.deb"
elif [ "$ARCH" = "aarch64" ] || [ "$ARCH" = "arm64" ]; then
FF_DEB="fastfetch-linux-aarch64.deb"
fi
aria2c -x 4 -s 4 -o "$FF_DEB" \
"https://github.com/fastfetch-cli/fastfetch/releases/latest/download/$FF_DEB"
sudo apt install "./$FF_DEB" -y && rm "$FF_DEB"
fi
# ===========================================================
# Step 5: Remove any existing Neovim installation
# ===========================================================
echo "Removing existing Neovim..."
sudo apt-get purge -y neovim neovim-runtime || true
sudo apt-get autoremove -y || true
if command -v snap &> /dev/null; then sudo snap remove neovim || true; fi
if command -v flatpak &> /dev/null; then sudo flatpak uninstall -y org.neovim.nvim || true; fi
sudo rm -f /usr/bin/nvim /usr/local/bin/nvim
sudo rm -rf /opt/nvim-linux* /opt/nvim
# ===========================================================
# Step 6: Install latest stable Neovim from GitHub
# ===========================================================
echo "Installing Neovim..."
if [ "$ARCH" = "x86_64" ]; then
NVIM_URL="https://github.com/neovim/neovim/releases/latest/download/nvim-linux-x86_64.tar.gz"
elif [ "$ARCH" = "aarch64" ] || [ "$ARCH" = "arm64" ]; then
NVIM_URL="https://github.com/neovim/neovim/releases/latest/download/nvim-linux-arm64.tar.gz"
else
echo "Unsupported architecture: $ARCH"; exit 1
fi
NVIM_TAR="nvim-download.tar.gz"
aria2c -x 4 -s 4 -o "$NVIM_TAR" "$NVIM_URL"
sudo mkdir -p /opt/nvim
sudo tar -C /opt/nvim --strip-components=1 -xzf "$NVIM_TAR"
sudo ln -sf /opt/nvim/bin/nvim /usr/local/bin/nvim
rm "$NVIM_TAR"
# ===========================================================
# Step 7: Install Starship + download personal config from gist
# ===========================================================
echo "Installing Starship..."
curl -sS https://starship.rs/install.sh | sh -s -- --yes
mkdir -p ~/.config
curl -fsSL "https://gist.githubusercontent.com/Aabayoumy/0d9eaec0629bbaea0c2c318b058525c1/raw/3f9ac8c2edc61eb9531a70fe962964aab4afa8d1/starship.toml" \
-o ~/.config/starship.toml
# ===========================================================
# Step 8: Configure Fastfetch
# ===========================================================
echo "Configuring Fastfetch..."
mkdir -p ~/.config/fastfetch
cat << 'EOF' > ~/.config/fastfetch/config.jsonc
{
"$schema": "https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json",
"logo": {
"type": "small",
"padding": { "top": 1 }
},
"display": {
"separator": " โฏ ",
"bar": {
"char": { "elapsed": "โ– ", "total": " " },
"width": 12
}
},
"modules": [
"title",
"os",
{ "type": "cpu", "format": "{1} ({4} cores)" },
{ "type": "cpuusage", "key": "CPU ", "percent": { "type": 3 } },
{ "type": "memory", "key": "Mem ", "percent": { "type": 3 } },
{ "type": "disk", "key": "Disk", "percent": { "type": 3 } },
"break"
]
}
EOF
# ===========================================================
# Step 9: Download Catppuccin Mocha zsh-syntax-highlighting theme
# ===========================================================
echo "Downloading Catppuccin Mocha syntax highlight theme..."
mkdir -p ~/.config
curl -fsSL \
"https://raw.githubusercontent.com/catppuccin/zsh-syntax-highlighting/main/themes/catppuccin_mocha-zsh-syntax-highlighting.zsh" \
-o ~/.config/catppuccin_mocha-zsh-syntax-highlighting.zsh
# ===========================================================
# Step 10: Write .zshrc
# ===========================================================
echo "Writing .zshrc..."
cat << 'ZSHRC' > ~/.zshrc
# ===========================================================
# ZINIT โ€” plugin manager (auto-installs on first run)
# ===========================================================
ZINIT_HOME="${XDG_DATA_HOME:-${HOME}/.local/share}/zinit/zinit.git"
if [ ! -d "$ZINIT_HOME" ]; then
mkdir -p "$(dirname "$ZINIT_HOME")"
git clone https://github.com/zdharma-continuum/zinit.git "$ZINIT_HOME"
fi
source "${ZINIT_HOME}/zinit.zsh"
# ===========================================================
# PLUGINS
# ===========================================================
# zsh-completions: use blockf so zinit registers the extra fpath entries
# before compinit runs โ€” this is what enables filename/command completions
zinit light zsh-users/zsh-autosuggestions
zinit light zsh-users/zsh-history-substring-search
zinit ice blockf; zinit light zsh-users/zsh-completions
# Catppuccin Mocha syntax highlight theme โ€” must load before the plugin
source ~/.config/catppuccin_mocha-zsh-syntax-highlighting.zsh
zinit light zsh-users/zsh-syntax-highlighting
# OMZ snippets
zinit snippet OMZL::git.zsh
zinit snippet OMZP::git
zinit snippet OMZP::sudo
zinit snippet OMZP::command-not-found
# ===========================================================
# COMPLETION ENGINE (compinit BEFORE fzf-tab)
# ===========================================================
autoload -Uz compinit
# Refresh .zcompdump at most once per day for faster startup
if [[ -n ~/.zcompdump(#qN.mh+24) ]]; then
compinit
else
compinit -C
fi
zinit cdreplay -q
# fzf-tab must load AFTER compinit โ€” it replaces the completion menu
zinit light Aloxaf/fzf-tab
# Completion styling
zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*'
zstyle ':completion:*' list-colors "${(s.:.)LS_COLORS}"
zstyle ':completion:*' group-name ''
zstyle ':completion:*:descriptions' format '%F{yellow}-- %d --%f'
zstyle ':completion:*:warnings' format '%F{red}no matches%f'
zstyle ':completion::complete:*' use-cache yes
zstyle ':completion::complete:*' cache-path ~/.zcompcache
zstyle ':completion:*' special-dirs true
zstyle ':completion:*' menu no # fzf-tab takes over the menu
# fzf-tab: live eza preview for cd and zoxide
zstyle ':fzf-tab:complete:cd:*' fzf-preview 'eza --icons --group-directories-first --color=always $realpath'
zstyle ':fzf-tab:complete:__zoxide_z:*' fzf-preview 'eza --icons --group-directories-first --color=always $realpath'
# fzf-tab: also preview file content for any completion
zstyle ':fzf-tab:complete:*:*' fzf-preview 'bat --color=always --style=numbers $realpath 2>/dev/null || eza --icons --color=always $realpath'
setopt AUTO_MENU COMPLETE_IN_WORD ALWAYS_TO_END AUTO_PARAM_SLASH NO_CASE_GLOB
# ===========================================================
# HISTORY
# ===========================================================
HISTFILE=~/.zsh_history
HISTSIZE=50000
SAVEHIST=50000
HISTDUP=erase
setopt APPEND_HISTORY INC_APPEND_HISTORY SHARE_HISTORY
setopt HIST_IGNORE_SPACE HIST_IGNORE_ALL_DUPS HIST_SAVE_NO_DUPS
setopt HIST_IGNORE_DUPS HIST_FIND_NO_DUPS HIST_REDUCE_BLANKS
setopt HIST_VERIFY EXTENDED_HISTORY
# ===========================================================
# KEY BINDINGS
# ===========================================================
bindkey -e
bindkey '^[[H' beginning-of-line
bindkey '^[[F' end-of-line
bindkey '^[[3~' delete-char
bindkey '^[[1;5C' forward-word # Ctrlโ†’ jump word
bindkey '^[[1;5D' backward-word # Ctrlโ† jump word
bindkey '^[c' kill-region
# โ†’ accepts the current autosuggestion (same as macOS behaviour)
bindkey '^[[C' forward-char
# End key also accepts full autosuggestion
bindkey '^[[F' end-of-line
# Ctrl-Space accepts autosuggestion without moving cursor
bindkey '^ ' autosuggest-accept
# zsh-history-substring-search: โ†‘/โ†“ filters by typed prefix
bindkey '\e[A' history-substring-search-up
bindkey '\e[B' history-substring-search-down
# ===========================================================
# DIRECTORY NAVIGATION
# ===========================================================
setopt AUTO_CD AUTO_PUSHD PUSHD_IGNORE_DUPS PUSHD_SILENT
# ===========================================================
# MISC
# ===========================================================
setopt INTERACTIVE_COMMENTS CORRECT NO_BEEP MULTIOS
# ===========================================================
# FZF
# ===========================================================
eval "$(fzf --zsh)"
export FZF_DEFAULT_OPTS="
--height 40%
--layout=reverse
--border=rounded
--preview-window=right:50%:wrap
--color=fg:#cdd6f4,bg:#1e1e2e,hl:#89b4fa
--color=fg+:#cdd6f4,bg+:#313244,hl+:#89dceb
--color=info:#cba6f7,prompt:#f38ba8,pointer:#f5c2e7
--color=marker:#a6e3a1,spinner:#f5c2e7,header:#94e2d5
"
if command -v fd &> /dev/null; then
export FZF_DEFAULT_COMMAND='fd --type f --hidden --follow --exclude .git'
export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"
fi
ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE="fg=#585b70"
ZSH_AUTOSUGGEST_STRATEGY=(history completion)
HISTORY_SUBSTRING_SEARCH_HIGHLIGHT_FOUND='fg=#1e1e2e,bg=#a6e3a1,bold'
HISTORY_SUBSTRING_SEARCH_HIGHLIGHT_NOT_FOUND='fg=#1e1e2e,bg=#f38ba8,bold'
# ===========================================================
# EXTERNAL TOOLS
# ===========================================================
eval "$(zoxide init zsh)"
eval "$(starship init zsh)"
# ===========================================================
# ALIASES โ€” Navigation
# ===========================================================
alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'
alias ~='cd ~'
alias -- -='cd -'
# ===========================================================
# ALIASES โ€” ls / eza
# ===========================================================
alias l='eza --icons --group --group-directories-first'
alias ls='eza --icons --group --group-directories-first'
alias la='eza --icons -la --all --long --group --group-directories-first --header --time-style long-iso'
alias ll='eza --long --group --group-directories-first --icons --header --time-style long-iso'
alias lla='eza -lha --icons --git --group-directories-first --header --time-style long-iso'
alias lt='eza --icons -T -L=1'
alias llt='eza --tree --level=3 --icons --long'
alias tree="eza --tree --all --ignore-glob='*.o|*.log' --git"
# ===========================================================
# ALIASES โ€” cat / bat
# ===========================================================
alias cat='bat --paging=never'
alias catp='bat'
# ===========================================================
# ALIASES โ€” Editor
# ===========================================================
alias v='nvim'
alias vi='nvim'
alias vim='nvim'
alias nv='nvim'
alias svim='sudo nvim'
alias vz='nvim ~/.zshrc'
alias sz='source ~/.zshrc'
# ===========================================================
# ALIASES โ€” Git
# ===========================================================
alias g='git'
alias gs='git status -sb'
alias gaa='git add .'
alias gc='git commit -m'
alias gca='git commit --amend --no-edit'
alias gp='git push'
alias gpf='git push --force-with-lease'
alias gl='git pull'
alias glog='git log --oneline --graph --decorate --all'
alias gd='git diff'
alias gds='git diff --staged'
alias gcb='git checkout -b'
alias gst='git stash'
alias gstp='git stash pop'
alias gri='git rebase -i'
# ===========================================================
# ALIASES โ€” System / apt
# ===========================================================
alias update='sudo apt update && sudo apt upgrade -y'
alias install='sudo apt install'
alias remove='sudo apt remove'
alias purge='sudo apt purge'
alias autoremove='sudo apt autoremove -y'
alias ports='ss -tulpn'
alias psg='ps aux | grep'
alias df='df -h'
alias du='du -sh'
alias free='free -h'
alias top='htop 2>/dev/null || top'
alias path='echo $PATH | tr ":" "\n"'
alias myip='curl -s ifconfig.me'
alias localip="ip -4 addr | grep -oP '(?<=inet\s)\d+(\.\d+){3}' | grep -v 127"
# ===========================================================
# ALIASES โ€” Safety
# ===========================================================
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias mkdir='mkdir -pv'
# ===========================================================
# ALIASES โ€” Utilities
# ===========================================================
alias c='clear'
alias cls='clear'
alias q='exit'
alias h='history | tail -50'
alias hg='history | grep'
alias reload='exec zsh'
alias zshconfig='nvim ~/.zshrc'
alias week='date +%V'
alias timestamp='date +"%Y%m%d_%H%M%S"'
alias rg='rg --smart-case --hidden'
alias fd='fd -Lu'
alias weather='curl v2.wttr.in'
alias ff='clear && fastfetch'
# ===========================================================
# FUNCTIONS
# ===========================================================
# mkcd โ€” mkdir + cd in one shot
mkcd() { mkdir -p "$1" && cd "$1"; }
# up N โ€” go up N directories (e.g. up 3)
up() { local p=""; for _ in $(seq 1 "${1:-1}"); do p+="../"; done; cd "$p"; }
# extract โ€” universal archive extractor
extract() {
if [ -f "$1" ]; then
case "$1" in
*.tar.bz2) tar xjf "$1" ;;
*.tar.gz) tar xzf "$1" ;;
*.tar.xz) tar xJf "$1" ;;
*.tar.zst) tar --zstd -xf "$1" ;;
*.bz2) bunzip2 "$1" ;;
*.gz) gunzip "$1" ;;
*.rar) unrar x "$1" ;;
*.tar) tar xf "$1" ;;
*.tbz2) tar xjf "$1" ;;
*.tgz) tar xzf "$1" ;;
*.zip) unzip "$1" ;;
*.Z) uncompress "$1" ;;
*.7z) 7z x "$1" ;;
*) echo "'$1' cannot be extracted" ;;
esac
else
echo "'$1' is not a valid file"
fi
}
# bak โ€” timestamped backup copy
bak() { cp "$1" "$1.bak.$(date +%Y%m%d_%H%M%S)"; }
# fcd โ€” fuzzy-find a directory and cd into it
fcd() { cd "$(find "${1:-.}" -type d 2>/dev/null | fzf)" || return; }
# fe โ€” fuzzy-find a file and open in nvim
fe() { nvim "$(fzf --preview 'bat --color=always {}')"; }
# ===========================================================
# FASTFETCH โ€” run on every new terminal
# ===========================================================
fastfetch
ZSHRC
# ===========================================================
# Step 11: Install LazyVim
# ===========================================================
echo "Setting up LazyVim..."
mkdir -p ~/.config/nvim
git clone https://github.com/LazyVim/starter ~/.config/nvim
rm -rf ~/.config/nvim/.git
# ===========================================================
# Step 12: Set Zsh as default shell
# ===========================================================
echo "Setting Zsh as default shell..."
sudo chsh -s "$(which zsh)" "$USER"
echo ""
echo "Done! Backup saved to: $BACKUP_FILE"
echo "Run 'exec zsh' or open a new terminal to start."
echo "(zinit will auto-install all plugins on first launch)"
"$schema" = 'https://starship.rs/config-schema.json'
format = """
[๎‚ถ](red)\
$os\
$username$hostname\
[๎‚ฐ](bg:peach fg:red)\
$directory\
[๎‚ฐ](bg:yellow fg:peach)\
$git_branch\
$git_status\
[๎‚ฐ](fg:yellow bg:green)\
$c\
$rust\
$golang\
$nodejs\
$bun\
$php\
$java\
$kotlin\
$haskell\
$python\
[๎‚ฐ](fg:green bg:sapphire)\
$conda\
[๎‚ฐ](fg:sapphire bg:lavender)\
$time\
[๎‚ด ](fg:lavender)\
$cmd_duration\
$line_break\
$character"""
palette = 'catppuccin_mocha'
[os]
disabled = false
style = "bg:red fg:crust"
[os.symbols]
Windows = "๎œ"
Ubuntu = "๓ฐ•ˆ"
SUSE = "๏Œ”"
Raspbian = "๓ฐฟ"
Mint = "๓ฐฃญ"
Macos = "๓ฐ€ต"
Manjaro = "๏Œ’"
Linux = "๓ฐŒฝ"
Gentoo = "๓ฐฃจ"
Fedora = "๓ฐฃ›"
Alpine = "๏Œ€"
Amazon = "๏‰ฐ"
Android = "๎œŽ"
AOSC = "๏Œ"
Arch = "๓ฐฃ‡"
Artix = "๓ฐฃ‡"
CentOS = "๏Œ„"
Debian = "๓ฐฃš"
Redhat = "๓ฑ„›"
RedHatEnterprise = "๓ฑ„›"
[username]
show_always = true
style_user = "bg:red fg:crust"
style_root = "bg:red fg:crust"
format = '[ $user]($style)'
[hostname]
ssh_only = true
format = '[@$hostname](bg:red fg:crust)'
disabled = false
[directory]
style = "bg:peach fg:crust"
format = "[ $path ]($style)"
truncation_length = 3
truncation_symbol = "โ€ฆ/"
[directory.substitutions]
"Documents" = "๓ฐˆ™ "
"Downloads" = "๏€™ "
"Music" = "๓ฐš "
"Pictures" = "๏€พ "
"Developer" = "๓ฐฒ‹ "
[git_branch]
symbol = "๏˜"
style = "bg:yellow"
format = '[[ $symbol $branch ](fg:crust bg:yellow)]($style)'
[git_status]
style = "bg:yellow"
format = '[[($all_status$ahead_behind )](fg:crust bg:yellow)]($style)'
[nodejs]
symbol = "๎œ˜"
style = "bg:green"
format = '[[ $symbol( $version) ](fg:crust bg:green)]($style)'
[bun]
symbol = "๎ฏ"
style = "bg:green"
format = '[[ $symbol( $version) ](fg:crust bg:green)]($style)'
[c]
symbol = "๎˜ž "
style = "bg:green"
format = '[[ $symbol( $version) ](fg:crust bg:green)]($style)'
[rust]
symbol = "๎žจ"
style = "bg:green"
format = '[[ $symbol( $version) ](fg:crust bg:green)]($style)'
[golang]
symbol = "๎˜ง"
style = "bg:green"
format = '[[ $symbol( $version) ](fg:crust bg:green)]($style)'
[php]
symbol = "๎˜ˆ"
style = "bg:green"
format = '[[ $symbol( $version) ](fg:crust bg:green)]($style)'
[java]
symbol = "๎‰– "
style = "bg:green"
format = '[[ $symbol( $version) ](fg:crust bg:green)]($style)'
[kotlin]
symbol = "๎˜ด"
style = "bg:green"
format = '[[ $symbol( $version) ](fg:crust bg:green)]($style)'
[haskell]
symbol = "๎˜Ÿ"
style = "bg:green"
format = '[[ $symbol( $version) ](fg:crust bg:green)]($style)'
[python]
symbol = "๎˜†"
style = "bg:green"
format = '[[ $symbol( $version)(\(#$virtualenv\)) ](fg:crust bg:green)]($style)'
[docker_context]
symbol = "๏Œˆ"
style = "bg:sapphire"
format = '[[ $symbol( $context) ](fg:crust bg:sapphire)]($style)'
[conda]
symbol = " ๏„Œ "
style = "fg:crust bg:sapphire"
format = '[$symbol$environment ]($style)'
ignore_base = false
[time]
disabled = false
time_format = "%R"
style = "bg:lavender"
format = '[[ ๏บ $time ](fg:crust bg:lavender)]($style)'
[line_break]
disabled = true
[character]
disabled = false
success_symbol = '[โฏ](bold fg:green)'
error_symbol = '[โฏ](bold fg:red)'
vimcmd_symbol = '[โฎ](bold fg:green)'
vimcmd_replace_one_symbol = '[โฎ](bold fg:lavender)'
vimcmd_replace_symbol = '[โฎ](bold fg:lavender)'
vimcmd_visual_symbol = '[โฎ](bold fg:yellow)'
[cmd_duration]
show_milliseconds = true
format = "๎ซด in $duration "
style = "bg:lavender"
disabled = false
show_notifications = true
min_time_to_notify = 45000
[palettes.catppuccin_mocha]
rosewater = "#f5e0dc"
flamingo = "#f2cdcd"
pink = "#f5c2e7"
mauve = "#cba6f7"
red = "#f38ba8"
maroon = "#eba0ac"
peach = "#fab387"
yellow = "#f9e2af"
green = "#a6e3a1"
teal = "#94e2d5"
sky = "#89dceb"
sapphire = "#74c7ec"
blue = "#89b4fa"
lavender = "#b4befe"
text = "#cdd6f4"
subtext1 = "#bac2de"
subtext0 = "#a6adc8"
overlay2 = "#9399b2"
overlay1 = "#7f849c"
overlay0 = "#6c7086"
surface2 = "#585b70"
surface1 = "#45475a"
surface0 = "#313244"
base = "#1e1e2e"
mantle = "#181825"
crust = "#11111b"
[palettes.catppuccin_frappe]
rosewater = "#f2d5cf"
flamingo = "#eebebe"
pink = "#f4b8e4"
mauve = "#ca9ee6"
red = "#e78284"
maroon = "#ea999c"
peach = "#ef9f76"
yellow = "#e5c890"
green = "#a6d189"
teal = "#81c8be"
sky = "#99d1db"
sapphire = "#85c1dc"
blue = "#8caaee"
lavender = "#babbf1"
text = "#c6d0f5"
subtext1 = "#b5bfe2"
subtext0 = "#a5adce"
overlay2 = "#949cbb"
overlay1 = "#838ba7"
overlay0 = "#737994"
surface2 = "#626880"
surface1 = "#51576d"
surface0 = "#414559"
base = "#303446"
mantle = "#292c3c"
crust = "#232634"
[palettes.catppuccin_latte]
rosewater = "#dc8a78"
flamingo = "#dd7878"
pink = "#ea76cb"
mauve = "#8839ef"
red = "#d20f39"
maroon = "#e64553"
peach = "#fe640b"
yellow = "#df8e1d"
green = "#40a02b"
teal = "#179299"
sky = "#04a5e5"
sapphire = "#209fb5"
blue = "#1e66f5"
lavender = "#7287fd"
text = "#4c4f69"
subtext1 = "#5c5f77"
subtext0 = "#6c6f85"
overlay2 = "#7c7f93"
overlay1 = "#8c8fa1"
overlay0 = "#9ca0b0"
surface2 = "#acb0be"
surface1 = "#bcc0cc"
surface0 = "#ccd0da"
base = "#eff1f5"
mantle = "#e6e9ef"
crust = "#dce0e8"
[palettes.catppuccin_macchiato]
rosewater = "#f4dbd6"
flamingo = "#f0c6c6"
pink = "#f5bde6"
mauve = "#c6a0f6"
red = "#ed8796"
maroon = "#ee99a0"
peach = "#f5a97f"
yellow = "#eed49f"
green = "#a6da95"
teal = "#8bd5ca"
sky = "#91d7e3"
sapphire = "#7dc4e4"
blue = "#8aadf4"
lavender = "#b7bdf8"
text = "#cad3f5"
subtext1 = "#b8c0e0"
subtext0 = "#a5adcb"
overlay2 = "#939ab7"
overlay1 = "#8087a2"
overlay0 = "#6e738d"
surface2 = "#5b6078"
surface1 = "#494d64"
surface0 = "#363a4f"
base = "#24273a"
mantle = "#1e2030"
crust = "#181926"
@Aabayoumy

Aabayoumy commented May 21, 2026

Copy link
Copy Markdown
Author

๐Ÿš€ Automated Debian/Ubuntu VM Bootstrap Script

This script completely automates the process of setting up a fresh Linux VM into a highly optimized, technical workspace. It cleans old configurations, installs modern CLI alternatives, sets up a clean Zsh environment, and configures Neovim with LazyVim.

๐Ÿ› ๏ธ What This Script Installs & Configures:

  • Backup Protection: Creates a timestamped .zip backup of your old configs (~/.zshrc, ~/.config/nvim, etc.) before making changes.
  • Modern Toolchain: Installs aria2, eza (modern ls), zoxide (smart cd), bat (cat with syntax highlighting), ripgrep, fzf, and luarocks.
  • Neovim Upgrade: Completely purges any native apt/snap/flatpak Neovim versions and safely installs the latest Stable Pre-built GitHub binary into /opt/nvim using lightning-fast aria2c downloads.
  • Text Editor Starter: Automatically clones the LazyVim Starter framework into ~/.config/nvim.
  • Custom Fastfetch: Configures a minimal, clean performance dashboard that runs seamlessly every time you open a terminal shell.
  • Zsh Environment: Switches your default shell to Zsh configured with local history optimization, clear native auto-completion, and native key-binding fixes for Home/End keys.

๐Ÿ’ป How to Run Directly on Any Fresh VM

Run this command as your regular user. Do not run the entire command with sudoโ€”the script will gracefully prompt you for your sudo password only when installing system packages.

curl -sSL [tinyurl.com/debian-boorstrab](https://tinyurl.com/debian-boorstrab) | bash

# or short link 
curl -sSL tinyurl.com/debian-boorstrab | bash

@Aabayoumy

Aabayoumy commented Jul 30, 2026

Copy link
Copy Markdown
Author

Unified Script for Debian/ Alma

curl -fsSL https://gist.githubusercontent.com/Aabayoumy/b396342263018e486fa87745f5efa62b/raw/unified-bootstrap.sh | bash

# Short link version:
curl -fsSL https://tinyurl.com/2y9kga3g | bash

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment