master ohmu/dihfiles / bin / nerdfetch
ohmu  ·  2026-09-26
  1#!/bin/sh
  2
  3## OS/ENVIRONMENT INFO DETECTION
  4
  5ostype="$(uname)"
  6
  7version=8.4.2
  8font=nerd
  9distrotype=none
 10osi=""
 11ki=""
 12ri="󰍛"
 13pi="󰏔"
 14ui="󰅶"
 15ci=""
 16
 17case $1 in
 18"-p")
 19	font=phosphor
 20	osi=""
 21	ki=""
 22	ri=""
 23	pi=""
 24	ui=""
 25	ci=""
 26	;;
 27"-c")
 28	font=cozette
 29	ki="♥"
 30	ri=""
 31	pi=""
 32	ui=""
 33	ci=""
 34	;;
 35"-e")
 36	font=emoji
 37	osi="🐧"
 38	ki="💓"
 39	ri="🐐"
 40	pi="📦"
 41	ui="☕"
 42	ci="🎨"
 43	;;
 44"-v")
 45	echo "NerdFetch $version"
 46	exit
 47	;;
 48"-h"|"--help")
 49	echo "Flags:
 50-c: Cozette font
 51-p: Phosphor font
 52-e: Emoji font
 53-v: Version"
 54	exit
 55	;;
 56esac
 57
 58if command -v getprop 1>/dev/null 2>&1; then
 59	distrotype=android
 60fi
 61kernel=$(uname -r)
 62kernel=${kernel%%-*}
 63case $ostype in
 64*"Linux"*)
 65	if [ $distrotype = android ]; then
 66		host="$(hostname)"
 67		USER="$(whoami)"
 68		os="Android $(getprop ro.build.version.release)"
 69		case $font in
 70		phosphor) osi="" ;;
 71		emoji) osi="🤖" ;;
 72		*) osi="󰀲" ;;
 73		esac
 74	else
 75		host="$(cat /proc/sys/kernel/hostname)"
 76		. /etc/os-release
 77		if [ -f /bedrock/etc/bedrock-release ]; then
 78			os="$(brl version)"
 79		else
 80			os="${PRETTY_NAME}"
 81			if [ $font = nerd ]; then
 82				case ${ID%% *} in
 83				debian) osi="" ;;
 84				arch) osi="󰣇" ;;
 85				endeavouros) osi="" ;;
 86				fedora) osi="" ;;
 87				gentoo) osi="" ;;
 88				rhel) osi="" ;;
 89				slackware) osi="" ;;
 90				void) osi="" ;;
 91				alpine) osi="" ;;
 92				nixos) osi="󱄅" ;;
 93				artix) osi="" ;;
 94				exherbo) osi="󰆚" ;;
 95				mageia) osi="" ;;
 96				manjaro) osi="" ;;
 97				opensuse) osi="" ;;
 98				solus) osi="" ;;
 99				ubuntu) osi="" ;;
100				linuxmint) osi="󰣭" ;;
101				trisquel) osi="" ;;
102				puppy) osi="" ;;
103				coreos) osi="" ;;
104				mx) osi="" ;;
105				vanilla) osi="" ;;
106				pop_os) osi="" ;;
107				raspbian) osi="" ;;
108				deepin) osi="" ;;
109				almalinux) osi="" ;;
110				garuda) osi="" ;;
111				centos) osi="" ;;
112				rocky) osi="" ;;
113				esac
114			elif [ $font = cozette ]; then
115				case ${ID%% *} in
116				debian) osi="" ;;
117				arch) osi="" ;;
118				fedora) osi="" ;;
119				gentoo) osi="" ;;
120				slackware) osi="" ;;
121				void) osi="" ;;
122				alpine) osi="" ;;
123				nixos) osi="" ;;
124				mageia) osi="" ;;
125				manjaro) osi="" ;;
126				opensuse) osi="" ;;
127				ubuntu) osi="" ;;
128				linuxmint) osi="" ;;
129				coreos) osi="" ;;
130				centos) osi="" ;;
131				esac
132			fi
133		fi
134	fi
135	;;
136*"Darwin"*)
137	host="$(hostname -f | sed -e 's/^[^.]*\.//')"
138	mac_product="$(/usr/libexec/PlistBuddy -c "Print:ProductName" /System/Library/CoreServices/SystemVersion.plist)"
139	mac_version="$(/usr/libexec/PlistBuddy -c "Print:ProductVersion" /System/Library/CoreServices/SystemVersion.plist)"
140	os="${mac_product} ${mac_version}"
141	case $font in
142	nerd) osi="" ;;
143	phosphor) osi="" ;;
144	cozette) osi="" ;;
145	emoji) osi="🍎" ;;
146	esac
147	;;
148*"FreeBSD"*)
149	host="$(hostname)"
150	distrotype=bsd
151	os="FreeBSD $(freebsd-version | sed 's/-.*//')"
152	case $font in
153	nerd) osi="" ;;
154	phosphor) osi="" ;;
155	cozette) osi="" ;;
156	emoji) osi="😈" ;;
157	esac
158	;;
159*"OpenBSD"*)
160	host="$(hostname)"
161	distrotype=bsd
162	os="OpenBSD $(uname -r)"
163	case $font in
164	nerd) osi="" ;;
165	phosphor) osi="" ;;
166	cozette) osi="⌘" ;;
167	emoji) osi="🐡" ;;
168	esac
169	;;
170*"NetBSD"*)
171	host="$(hostname)"
172	distrotype=netbsd
173	os="NetBSD $(uname -r)"
174	case $font in
175	nerd) osi="󰉀" ;;
176	phosphor) osi="" ;;
177	cozette) osi="" ;;
178	emoji) osi="🚩" ;;
179	esac
180	;;
181*)
182	os="Unix-like"
183	host="host"
184	;;
185esac
186
187## PACKAGE MANAGER AND PACKAGES DETECTION
188
189MANAGER=$(for x in nix-env pkg flatpak yum zypper dnf rpm dpkg-query brew port pacman xbps-query emerge cave apk kiss pmm /usr/sbin/slackpkg bulge birb yay paru pacstall pmm opkg eopkg getprop; do command -v $x; done 2>/dev/null)
190manager=${MANAGER##*/}
191if [ $distrotype = netbsd ]; then
192	manager="pkg_info-netbsd"
193fi
194case $manager in
195cpm) packages="$(cpm C)" ;;
196flatpak) packages="$(flatpak list --app | wc -l)" ;;
197brew) packages="$(printf '%s\n' "$(brew --cellar)/"* | wc -l)" ;;
198port) packages="$(($(port installed | wc -l) - 1))" ;;
199dpkg-query) packages="$(dpkg-query -f '${binary:Package}\n' -W | wc -l)" ;;
200rpm) packages="$(rpm -qa --last | wc -l)" ;;
201yum) packages="$(yum list installed | wc -l)" ;;
202dnf) packages="$(dnf list installed | wc -l)" ;;
203zypper) packages="$(zypper se | wc -l)" ;;
204pacman) packages="$(pacman -Q | wc -l)" ;;
205yay) packages="$(yay -Q | wc -l)" ;;
206paru) packages="$(paru -Q | wc -l)" ;;
207pacstall) packages="$(pacstall -L | wc -l)" ;;
208kiss) packages="$(kiss list | wc -l)" ;;
209emerge) packages="$(qlist -I | wc -l)" ;;
210pkg) packages="$(pkg info | wc -l | tr -d ' ')" ;;
211cave) packages="$(cave show installed-slots | wc -l)" ;;
212xbps-query) packages="$(xbps-query -l | wc -l)" ;;
213nix-env) packages="$(nix-store -q --requisites /run/current-system/sw | wc -l)" ;;
214apk) packages="$(apk list --installed | wc -l)" ;;
215pmm) packages="$(/bedrock/libexec/pmm pacman pmm -Q 2>/dev/null | wc -l)" ;;
216opkg) packages="$(opkg list-installed | wc -l)" ;;
217eopkg) packages="$(eopkg li | wc -l)" ;;
218slackpkg) packages="$(ls /var/log/packages | wc -l)" ;;
219bulge) packages="$(bulge list | wc -l)" ;;
220birb) packages="$(birb --list-installed | wc -l)" ;;
221pkg_info)
222	packages="$(pkg_info -A | wc -l)"
223	manager="pkg"
224	;;
225pkg_info-netbsd)
226	packages="$(pkg_info -a | wc -l)"
227	manager="pkg"
228	;;
229*)
230	if [ $distrotype = android ]; then
231		packages="$(pkg list-installed 2>/dev/null | wc -l)"
232		manager="pkg"
233	else
234		packages="$(ls /usr/bin | wc -l)"
235		manager="bin"
236	fi
237	;;
238esac
239
240packages="${packages#"${packages%%[![:space:]]*}"}"
241manager=${manager%-query}
242
243## UPTIME DETECTION
244
245if [ $distrotype = android ]; then
246	uptime="$(uptime -p | cut -c 4-)"
247elif [ $distrotype = bsd ] || [ $distrotype = netbsd ]; then
248	uptime="$(uptime | sed -e 's/.* up //; s/, [0-9]* user.*//')"
249else
250	case $ostype in
251	*"Linux"*)
252		IFS=. read -r s _ </proc/uptime
253		;;
254	*)
255		s=$(sysctl -n kern.boottime)
256		s=${s#*=}
257		s=${s%,*}
258		s=$(($(date +%s) - s))
259		;;
260	esac
261	d="$((s / 60 / 60 / 24))"
262	h="$((s / 60 / 60 % 24))"
263	m="$((s / 60 % 60))"
264	# Plurals
265	[ "$d" -gt 1 ] && dp=s
266	[ "$h" -gt 1 ] && hp=s
267	[ "$m" -gt 1 ] && mp=s
268	[ "$s" -gt 1 ] && sp=s
269	# Hide empty fields.
270	[ "$d" = 0 ] && d=
271	[ "$h" = 0 ] && h=
272	[ "$m" = 0 ] && m=
273	[ "$d$h$m" != "" ] && s=
274	# Make the output of uptime smaller.
275	[ "$d" ] && uptime="$d day$dp, "
276	[ "$h" ] && uptime="$uptime$h hour$hp, "
277	[ "$m" ] && uptime="$uptime$m min$mp"
278	[ "$s" ] && uptime="$uptime$s sec$sp"
279	uptime=${uptime%, }
280fi
281
282## RAM DETECTION
283
284case $ostype in
285*"Linux"*)
286	while IFS=':k ' read -r key val _; do
287		case $key in
288		MemTotal)
289			mem_used=$((mem_used + val))
290			mem_full=$val
291			;;
292		Shmem) mem_used=$((mem_used + val)) ;;
293		MemFree | Buffers | Cached | SReclaimable) mem_used=$((mem_used - val)) ;;
294		esac
295	done </proc/meminfo
296	mem_used=$((mem_used / 1024))
297	mem_full=$((mem_full / 1024))
298	;;
299*"Darwin"*)
300	mem_full=$(($(sysctl -n hw.memsize) / 1024 / 1024))
301	[ $mem_full -gt 0 ] || mem_full=$(expr $(sysctl -n hw.memsize) / 1024 / 1024)
302	while IFS=:. read -r key val _; do
303		case $key in
304		'Anonymous '*|*' wired'* | *' occupied'*)
305			mem_used=$((mem_used + ${val:-0}))
306			;;
307		*' purgeable'*)
308			mem_used=$((mem_used - ${val:-0}))
309			;;
310		esac
311	done <<-EOF
312		$(vm_stat)
313	EOF
314
315	mem_used=$((mem_used * ( $(sysctl -n vm.pagesize) / 1024 ) / 1024))
316	;;
317*"BSD"*)
318	mem_full=$(($(sysctl -n hw.physmem) / 1024 / 1024))
319	[ $mem_full -gt 0 ] || mem_full=$(expr $(sysctl -n hw.physmem) / 1024 / 1024)
320	if [ $distrotype = netbsd ]; then
321		mem_free=$(($(vmstat | awk 'NR==3 {print $4}') / 1024))
322	else
323		mem_free=$(($(sysctl -n vm.stats.vm.v_free_count) * ( $(sysctl -n vm.stats.vm.v_page_size) / 1024 ) / 1024))
324	fi
325	mem_used=$((mem_full - mem_free))
326	;;
327*)
328	mem_full=1
329	mem_used=0
330	;;
331esac
332memstat="${mem_used}/${mem_full} MiB"
333mempercent='('$((mem_used * 100 / mem_full))'%)'
334
335## DEFINE COLORS
336
337bold=''
338black=''
339red=''
340green=''
341yellow=''
342blue=''
343magenta=''
344cyan=''
345white=''
346grey=''
347reset=''
348
349## USER VARIABLES -- YOU CAN CHANGE THESE
350
351lc="${reset}${bold}${magenta}" # labels
352nc="${reset}${bold}${yellow}"  # user
353hn="${reset}${bold}${blue}"    # hostname
354ic="${reset}${green}"          # info
355c0="${reset}${grey}"           # first color
356c1="${reset}${white}"          # second color
357c2="${reset}${yellow}"         # third color
358
359## OUTPUT
360
361cat <<EOF
362
363${c0}      ___     ${nc}${USER}${red}@${reset}${hn}${host}${reset} 
364${c0}     (${c1}.. ${c0}\    ${lc}${osi}  ${ic}${os}${reset}
365${c0}     (${c2}<> ${c0}|    ${lc}${ki}  ${ic}${kernel}${reset}
366${c0}    /${c1}/  \\ ${c0}\\   ${lc}${ri}  ${ic}${RAM}${memstat} ${mempercent}
367${c0}   ( ${c1}|  | ${c0}/|  ${lc}${pi}  ${ic}${packages} (${manager})${reset}
368${c2}  _${c0}/\\ ${c1}__)${c0}/${c2}_${c0})  ${lc}${ui}  ${ic}${uptime}${reset}
369${c2}  \/${c0}-____${c2}\/${reset}   ${lc}${ci}  ${red}███${green}███${yellow}███${blue}███${magenta}███${cyan}███${reset}
370EOF