#!/bin/bash # color definitions C_RESET=$'\e[0m' C_GRAY=$'\e[90m' C_CYAN=$'\e[36m' C_WHITE=$'\e[97m' C_BYELLOW_BOLD=$'\e[1;93m' C_BWHITE_BOLD=$'\e[1;97m' C_DIMYELLOW_ITALIC=$'\e[3;93m' # Gruvbox Dark Hard palette C_RESET=$'\e[0m' C_GRAY=$'\e[38;2;102;92;84m' # gray C_CYAN=$'\e[38;2;125;174;163m' # muted blue C_WHITE=$'\e[38;2;235;219;178m' # light foreground C_BYELLOW_BOLD=$'\e[1;38;2;250;189;47m' C_BWHITE_BOLD=$'\e[1;38;2;235;219;178m' C_DIMYELLOW_ITALIC=$'\e[3;38;2;215;153;33m' # yellow C_AQUA=$'\e[38;2;142;192;124m' LOGO=" $C_GRAY|$C_RESET $C_CYAN /\\ /\\ $C_GRAY|$C_RESET $C_CYAN // \\ \\ $C_GRAY|$C_RESET $C_CYAN // \\ \\ $C_GRAY|$C_RESET $C_CYAN /// \\ \\ $C_GRAY|$C_RESET $C_CYAN // \\ \\ $C_GRAY|$C_RESET $C_CYAN \\ $C_GRAY|$C_RESET $C_GRAY|$C_RESET" LOGO_ARCH=" $C_GRAY|$C_RESET $C_CYAN /\\ $C_GRAY|$C_RESET $C_CYAN / \\ $C_GRAY|$C_RESET $C_CYAN / \\ $C_GRAY|$C_RESET $C_CYAN / \\ $C_GRAY|$C_RESET $C_CYAN / ,, \\ $C_GRAY|$C_RESET $C_CYAN / | | \\ $C_GRAY|$C_RESET $C_CYAN /_-'' ''-_\\ $C_GRAY|$C_RESET $C_GRAY|$C_RESET" LOGO_slash=" $C_GRAY/$C_RESET $C_CYAN /\\ $C_GRAY/$C_RESET $C_CYAN / \\ $C_GRAY/$C_RESET $C_CYAN / \\ $C_GRAY/$C_RESET $C_CYAN / \\ $C_GRAY/$C_RESET $C_CYAN / ,, \\ $C_GRAY/$C_RESET $C_CYAN / | | \\ $C_GRAY/$C_RESET $C_CYAN /_-'' ''-_\\ $C_GRAY/$C_RESET $C_GRAY/$C_RESET" LOGO_VOID=" $C_GRAY/$C_RESET $C_CYAN _______ $C_GRAY/$C_RESET $C_CYAN _ \______ \\ $C_GRAY/$C_RESET $C_CYAN | \ ___ \ | $C_GRAY/$C_RESET $C_CYAN | | / \ | | $C_GRAY/$C_RESET $C_CYAN | | \___/ | | $C_GRAY/$C_RESET $C_CYAN | \______ \_| $C_GRAY/$C_RESET $C_AQUA \\_______\ $C_GRAY/$C_RESET $C_GRAY/$C_RESET" LOGO_DEVUAN=" $C_GRAY/$C_RESET $C_CYAN ..:::. $C_GRAY/$C_RESET $C_CYAN ..-==- $C_GRAY/$C_RESET $C_CYAN .+#: $C_GRAY/$C_RESET $C_CYAN =@@ $C_GRAY/$C_RESET $C_CYAN :+%@#: $C_GRAY/$C_RESET $C_CYAN .:=+#@@%*: $C_GRAY/$C_RESET $C_CYAN #@@@#=: $C_GRAY/$C_RESET $C_GRAY/$C_RESET" LOGO_GENTOO=" $C_GRAY/$C_RESET $C_WHITE _-----_ $C_GRAY/$C_RESET $C_WHITE ( \ $C_GRAY/$C_RESET $C_WHITE \ 0 \ $C_GRAY/$C_RESET $C_WHITE \ ) $C_GRAY/$C_RESET $C_WHITE / _/ $C_GRAY/$C_RESET $C_WHITE ( _- $C_GRAY/$C_RESET $C_WHITE \____- $C_GRAY/$C_RESET $C_GRAY/$C_RESET" # all the info fields USER=$USER HOSTNAME=$(cat /etc/hostname) CPU_MODELNAME=$(cat /proc/cpuinfo | awk -F ":" '/model name/ {print $2}' | awk -F " " '{print $3}' | head -1) CPU_THREADS_NUM=$(nproc) RAM_TOTAL=$(awk '/MemTotal:/ { printf "%.1f\n", $2 / 1000000 }' /proc/meminfo) RAM_FREE=$(awk '/MemAvailable:/ { printf "%.1f\n", $2 / 1000000 }' /proc/meminfo) RAM="$(awk -v total="${RAM_TOTAL}" -v free="${RAM_FREE}" 'BEGIN { print (total - free) }') G / ${RAM_TOTAL} G" DISTRO="$(source /etc/os-release && echo $NAME)" APK_INSTALLED_PACKAGES="apk list --installed" INSTALLED_PACKAGES_COUNT=$($APK_INSTALLED_PACKAGES | wc -l) format_duration() { local seconds=$1 local days=$((seconds / 86400)) local hours=$((seconds % 86400 / 3600)) local minutes=$((seconds % 3600 / 60)) local result="" (( days > 0 )) && result+="${days}d " (( hours > 0 )) && result+="${hours}h " (( minutes > 0 )) && result+="${minutes}m" printf '%s' "${result% }" } installed="Thu Nov 5 05:00:00 PM CET 2026" # Alpine Linux install date installed_ts=$(date -d "$installed" +%s) now_ts=$(date +%s) TIME_SINCE_LAST_REINSTALL=$(format_duration "$((now_ts - installed_ts))") uptime_seconds=$(awk '{ print int($1) }' /proc/uptime) UPTIME=$(format_duration "$uptime_seconds") KERNEL=$(uname -r) if [ -n "$HYPRLAND_INSTANCE_SIGNATURE" ]; then WM="hyprland" elif [ -n "$SWAYSOCK" ]; then WM="sway" else WM="unknown" fi TERM=$TERM SHELL="${SHELL##*/}" horizontal_n=$((${#USER} + ${#HOSTNAME} + 3)) horizontal_separator_char="-" HORIZONTAL_SEPARATOR=$(printf '%*s' "$horizontal_n" ' ' | tr ' ' "$horizontal_separator_char") value=$(grep -E '^gtk-theme-name=' "$HOME/.config/gtk-4.0/settings.ini") value=${value#*=} value=${value//-/ } THEME="$value" # ----- # output login # convert the logo into an array of "lines" (strings) mapfile -t LOGO_LINES <<< "$LOGO" # array of strings as well for the info fields INFO_LINES=( "${C_CYAN}$USER${C_GRAY} @ ${C_WHITE}$HOSTNAME${C_RESET}" ${C_DIMYELLOW_ITALIC}$HORIZONTAL_SEPARATOR${C_RESET} # "${C_CYAN}cpu ${C_DIMYELLOW_ITALIC} : $CPU_MODELNAME ($CPU_THREADS_NUM threads)${C_RESET}" "${C_CYAN}distro${C_DIMYELLOW_ITALIC} : $DISTRO${C_RESET}" "${C_CYAN}theme ${C_DIMYELLOW_ITALIC} : $THEME${C_RESET}" #"${C_CYAN}ram ${C_DIMYELLOW_ITALIC} : $RAM${C_RESET}" "${C_CYAN}age ${C_DIMYELLOW_ITALIC} : $TIME_SINCE_LAST_REINSTALL${C_RESET}" "${C_CYAN}pkgs ${C_DIMYELLOW_ITALIC} : $INSTALLED_PACKAGES_COUNT${C_RESET}" # "${C_CYAN}uptime${C_DIMYELLOW_ITALIC} : $UPTIME${C_RESET}" #"${C_CYAN}kernel${C_DIMYELLOW_ITALIC} : $KERNEL${C_RESET}" "${C_CYAN}wm ${C_DIMYELLOW_ITALIC} : $WM${C_RESET}" "${C_CYAN}term ${C_DIMYELLOW_ITALIC} : $TERM${C_RESET}" "${C_CYAN}shell ${C_DIMYELLOW_ITALIC} : $SHELL${C_RESET}" ) for i in "${!LOGO_LINES[@]}"; do # 15 chars is the length of the logo printf "%-15s" "${LOGO_LINES[$i]}" # only print info if it exists for this line [ $i -lt ${#INFO_LINES[@]} ] && printf " %s" "${INFO_LINES[$i]}" printf "\n" done printf "${C_RESET}"