- PVSM.RU - https://www.pvsm.ru -

В мире Linux существует негласное соревнование: чей neofetch (земля ему пухом) или fastfetch запустится быстрее и покажет заветное лого дистрибутива. Разработчики бьются за миллисекунды, оптимизируют конфиги, переписывают всё на C... Я же решил построить своего рода Машину Голдберга.
Мой путь — это путь slowfetch. Я взял инструмент, который гордится своей скоростью (0.013с), и «оптимизировал» его до 0.77с. Зачем? Чтобы превратить терминал в панель управления космическим кораблём (или алтарь, об этом позже).
Это история о том, как простое желание «пофлексить» конфигом превратилось в полгода разработки на Bash и создание собственного инсталлера.
В декабре 2023 года я увлёкся рисингом (ricing — визуальная настройка Unix-подобных систем). Случайно наткнулся на репозиторий prasanthrangan/hyprdots [1] и увидел там конфиг для fastfetch.

В нём было то, чего мне не хватало: Nerd Fonts (красивые эмодзи), аккуратные рамочки и... кастомный OS Age (время жизни системы).
Вот тот самый кусок JSON, с которого всё началось:
{ "type": "command", "key": " OS Age ", "keyColor": "red", "text": "birth_install=$(stat -c %W /); current=$(date +%s); time_progression=$((current - birth_install)); days_difference=$((time_progression / 86400)); echo $days_difference days"
}
Этот «однострочник» внутри JSON открыл мне глаза: Fastfetch умеет выполнять команды оболочки и выводить их результат как модуль.
С этой мыслью я и шагнул в пропасть на больше чем полгода.

Тут я столкнулся с главной проблемой архитектуры «всё в одной строке»: Ад экранирования. Чтобы запихнуть сложный пайплайн с awk, grep и кавычками в одну строчку JSON-значения, нужно экранировать кавычки. А если внутри есть ещё вложенные кавычки — экранировать экранирование.
В тот момент я совершил классическую ошибку новичка (или «джуна с молотком»): я не знал, что Fastfetch умеет запускать внешние скрипты, и не знал про существование инструментов вроде jq для автоматического форматирования. Я просто пошёл напролом.
Error: failed to parse JSON config file '/home/jorj/.config/fastfetch/config.jsonc' at (19, 7): unexpected character, expected ',' or '}'
Писать руками строку вида \"text\": \"$(awk '{print \"$2\"}')\" — это прямой путь в психушку. Поэтому я делегировал эту механическую работу нейросетям. Я скармливал им рабочую Bash-команду и просил: «Преврати это в валидную строку для JSON с экранированием». ИИ галлюцинировал, забывал запятые, но это всё равно было быстрее, чем считать обратные слэши вручную, хоть и нормальное решение было прямо под носом.
Когда стандартные модули закончились, я решил выводить ту информацию, которую обычно смотрят в специализированном софте.

Стандартный вывод памяти скучен. Я хотел знать всё: тип, частоту, реальную скорость. Перепробовав кучу утилит, остановился на inxi -m. Он лаконичен и не требует sudo.

Но тут всплыл «нюанс». Если у вас планка на 3600 МГц, но XMP не включен (или ограничен чипсетом), inxi выдаёт:
speed: 3600 MT/s actual: 3200 MT/s
А если всё совпадает, то просто:
speed: 3200 MT/s
Парсер ломался на машинах друзей. Пришлось писать логику на awk, которая ищет ключевые слова actual, сравнивает числа и формирует красивую строку вида: DDR4 2x8GiB 3.20 GHz.
Итоговый вывод:
Specs : DDR4 8x4 GiB 3.60 GHz
Казалось бы, cat /proc/bus/input/devices — и готово. Но нет. Китайские мышки и даже брендовые девайсы часто представляются там как непонятные USB DEVICE или Mouse.
Пришлось усложнять. Скрипт теперь:
Опрашивает udevadm на наличие устройств класса «mouse».
Отсекает тачпады, графические планшеты и виртуальные устройства.
Вытаскивает Vendor ID и Product ID.
Скармливает их lsusb, чтобы получить настоящее коммерческое название устройства.
Если lsusb молчит — назад на имя из драйвера.
Итоговый вывод:
Mouse : A4Tech
Я хотел видеть всё: вендора (похвастаться NVMe Samsung Evo), тип (NVMe/SSD/HDD), файловую систему и заполненность.
Сначала я использовал smartctl. Он крайне информативен, но требует sudo.

Внезапно я узнал, что inxi умеет показывать вендора диска без рут-прав. В связке с lsblk получился супер-конвейер, который определяет практически любой тип устройств и рисует красивые проценты занятого места.
Итоговый вывод:
Disk : Crucial CT480BX500SSD1 (SSD) - 390.08 GiB / 447.13 GiB (88%) - fuseblk
Disk : Seagate ST2000DM008-2FR102 (HDD) - 1.63 TiB / 1.82 TiB (90%) - btrfs
Disk : Samsung Flash Drive (USB) - 68.37 GiB / 119.51 GiB (58%) - exfat
Disk : Samsung MZVLB1T0HBLR-00000 (NVMe) - 862.27 GiB / 953.87 GiB (97%) - ext4
С Nvidia всё просто: nvidia-smi — стандарт де-факто.

С AMD (у моего друга на ноутбуке встройка + дискретка) пришлось гуглить. Нормального аналога nvidia-smi «из коробки» нет, пришлось парсить файлы в /sys/class/drm/, искать там вендора 0x1002 (AMD) и читать сырые байты памяти.
Итоговый вывод:
VRAM : 3.8 GiB / 16.0 GiB (24%)

Зачем? Потому что могу и хочу отобразить, ведь глазом заметить Display: 1080x1920 и не понять «прикола» проще, чем прочесть Display 1 - Horizontal и понять. У меня два монитора: один горизонтальный, второй вертикальный.
Скрипт проверяет, что у вас:
Wayland (wlr-randr или JSON выхлоп от него).
Gnome (~/.config/monitors.xml).
X11 (xrandr).
И пишет:
Display 0 - horizontal
Display 1 - vertical
Абсолютно бесполезно, сложновато в парсинге, но круто (надеюсь).
Итоговый вывод:
Ori : Display 0 - horizontal
Ori : Display 1 - vertical

Переменная $BROWSER часто врёт или указывает на xdg-open. Я же хотел знать, что запущено прямо сейчас. Скрипт смотрит список процессов и сверяет их со своим словарём: firefox, chrome, brave, zen... Если находит совпадение — выводит красивое имя с иконкой.
Итоговый вывод:
Browser : Firefox

Speedtest-cli в РФ уже не работает, да и ждать 5–10 секунд ради фетча — перебор как для меня, так и для fastfetch который часто убивал столь долгий процесс.
Решение: curl скачивает небольшой файл с быстрого CDN (Cloudeflare) и замеряет скорость. Это не точный тест канала, но хоть что-то и не хардкод.
Итоговый вывод:
D Speed : ~50 Mbit/s

Раз уж я использую Arch, нужно соответствовать местной культуре. Я сделал модуль-мутатор, который меняет название дистрибутива на Святое:
Arch -> Archangel.
Debian -> Deusbian.
Fedora -> Fideora.
Gentoo -> Genesis.
Плюс модуль «Blessed by the Divine» с иконками свечей. В сочетании с обоями в стиле готического собора выглядит эпично, хоть и возводит до уровня абсурда поклонение Арчу или любому другому дистрибутиву.
Итоговый вывод:
✞✞✞Archangel✞✞✞
🕯 Blessed by the Divine 🕯

Самое сложное в этом конфиге — не код, а композиция. Я не хотел просто список параметров, я хотел структуру. Если присмотреться, весь вывод подчиняется строгой геометрической логике, которая удерживает внимание.
В первом блоке длина названий параметров специально подобрана так, чтобы нарастать сверху вниз:
WM
Edit
Fonts
Terminal
Это создаёт визуальную диагональ, устремлённую вниз-вправо. Практически везде использованы такие клины по 2-3+ модуля.
Второй блок выстроен симметрично, как архитектурная колонна:
Капитель (Верх): Короткие, резкие аббревиатуры (CPU, GPU).
Ствол (Центр): Самая массивная часть — список дисков. Ключ Disk повторяется много раз, создавая вертикальную ось, а справа идёт плотный массив данных. Это визуальный центр тяжести всего фетча.
База (Низ): Блок снова сужается и выравнивается. Периферия и время аптайма (Mouse, Board, OS Age) имеют примерно одинаковую длину ключей, формируя устойчивый фундамент.
Если убрать из этой конструкции «мостик» в виде Memory, структура рассыпется. Память служит плавным переходом от процессора к дискам.
В самом низу находится плеер. Проблема статичных рамок в том, что название песни всегда разное. Если рамка будет фиксированной — будет огромная линия символов и маленькая закрывающая рамка.
Я написал скрипт media_underline, который считает длину строки (Исполнитель + Трек) и рисует нижнюю границу рамки ровно такой длины, какая нужна. Но с условием min_len — рамка не может быть короче определённого значения, чтобы визуально совпадать с шириной верхних блоков. Это сохраняет общую коробочную или же мешочную структуру фетча.
Я упёрся в физический предел. На 1080p мониторе с читаемым шрифтом вертикальное место закончилось. Добавление любого нового модуля сломает эту визуальную иерархию, а также это нельзя сохранить одним скрином и поделиться, так что большую часть остального времени я потратил на допиливание уже имеющихся модулей, в логике и эстетике.
Где-то на середине пути, когда JSON-файл распух до невменяемых размеров, я узнал то, что повергло меня в ужас...:
В поле "text" можно просто написать путь до файла: "$HOME/.config/fastfetch/scripts/my_script.sh". :((((((((

Это был момент, который перевернул игру. Я выкинул однострочники, разбил проект на аккуратную структуру раздельных Bash скриптов и наконец появился нормальный, читаемый Bash без крашей от любого чиха.

Но проект разросся. Появились зависимости: jq, curl, xmlstarlet, inxi, chafa (для вывода обложек альбомов в терминал в виде ASCII/Sixel графики). Просто скопировать конфиг другу уже не получалось.
Так родился Launcher.

Это CLI-утилита, которая:
Проверяет зависимости.
Бэкапит старый конфиг.
Позволяет через меню включать/выключать модули, двигать их вверх-вниз (прямо как в конструкторе).
Настраивать модули (например, выбрать валютную пару для курсов или источник новостей).
После рассказа о лаунчере и всех этих модулях у читателя может возникнуть закономерный вопрос: откуда у одного человека столько знаний о wlr-randr, inxi и внутренностях udev? Ответ прост: изначально — почти никаких. На протяжении большей части этого пути моим R&D-отделом, а зачастую и источником разочарований, были нейросети.
Пример: Сага о дисках
Моя первая версия модуля для дисков использовала smartctl. Это не было простой задачей: мы с нейросетью часами переизобретали inxi. Я заставлял её составлять словари (зачастую неполные) для преобразования технических моделей (вроде WDC WD5000...) в понятные бренды (Western Digital) и выравнивать отступы, чтобы колонка с объёмом диска стояла идеально ровно.
Это работало, но код был чудовищным. И только когда я, спустя дни мучений, наткнулся на правильные флаги inxi и скомбинировал их с lsblk, я понял, что потратил массу времени на создание того, что уже существует. Но этот опыт был необходим, чтобы понять, как должно быть.
Это не «быстрый путь»
На своём опыте могу сказать: использование ИИ — это не всегда однозначно способ ускорить разработку, особенно, если ваша цель — качественный и продуманный продукт. В моём случае это оказался путь огромного упорства, оправданность которого до сих пор под вопросом, ведь проект занял несоразмерно много времени. Впрочем, его мне не занимать, в чём вы могли убедиться по моим прошлым статьям:
Проект потребовал десятки часов отладки и готовности переписывать всё с нуля. Путь от первых проблемных однострочников до сложной системы скриптов, а затем и до полного рефакторинга ради создания инсталлера был очень долгим.

Стандартный fastfetch на моём железе: 0.013s.
Мой конфиг: ~0.460s с выключением интернет модулей.
Я замедлил вывод информации в 30 раз. Но теперь, открывая терминал, я вижу не просто фэтч, а визуальный маркер «я самый крутой на районе»: что играет в плеере, курс доллара, состояние дисков, реальную частоту памяти и свежие заголовки новостей с OpenNet.
Стоило ли оно того? Для продуктивности — нет. Для души — однозначно да.

Репозиторий проекта: GitHub Link [5]
P.S. Если вы тоже хотите превратить свой терминал в новогоднюю ёлку, не забудьте поставить Nerd Fonts.
© 2026 ООО «МТ ФИНАНС»
Автор: Realife
Источник [6]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/linux/443955
Ссылки в тексте:
[1] prasanthrangan/hyprdots: https://github.com/prasanthrangan/hyprdots
[2] Image: https://sourcecraft.dev/
[3] Archivist: Как я учил нейросеть понимать физику плёнки, вместо того чтобы просто размывать шум: https://habr.com/ru/companies/ruvds/articles/980304/
[4] Реставрация, которая меня сломала: Почему убрать смех из Скуби-Ду сложнее, чем сделать ремастер Тома и Джерри в 2к: https://habr.com/ru/companies/ruvds/articles/962908/
[5] GitHub Link: https://github.com/Loganavter/slowfetch
[6] Источник: https://habr.com/ru/companies/ruvds/articles/991888/?utm_source=habrahabr&utm_medium=rss&utm_campaign=991888
Нажмите здесь для печати.