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

Глава 1. Эпоха однострочников и страдания ИИ
Тут я столкнулся с главной проблемой архитектуры «всё в одной строке»: Ад экранирования. Чтобы запихнуть сложный пайплайн с 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 с экранированием». ИИ галлюцинировал, забывал запятые, но это всё равно было быстрее, чем считать обратные слэши вручную, хоть и нормальное решение было прямо под носом.
Глава 2. Вывод информации о железе
Когда стандартные модули закончились, я решил выводить ту информацию, которую обычно смотрят в специализированном софте.

1. ОЗУ: Честная частота
Стандартный вывод памяти скучен. Я хотел знать всё: тип, частоту, реальную скорость. Перепробовав кучу утилит, остановился на 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
2. Мышь: Кто ты, «USB DEVICE»?
Казалось бы, cat /proc/bus/input/devices — и готово. Но нет. Китайские мышки и даже брендовые девайсы часто представляются там как непонятные USB DEVICE или Mouse.
Пришлось усложнять. Скрипт теперь:
Опрашивает
udevadmна наличие устройств класса «mouse».Отсекает тачпады, графические планшеты и виртуальные устройства.
Вытаскивает Vendor ID и Product ID.
Скармливает их
lsusb, чтобы получить настоящее коммерческое название устройства.Если
lsusbмолчит — назад на имя из драйвера.

Итоговый вывод:
Mouse : A4Tech
3. Диски: Мини-GParted в терминале
Я хотел видеть всё: вендора (похвастаться 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
4. VRAM и GPU
С Nvidia всё просто: nvidia-smi — стандарт де-факто.

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

Зачем? Потому что могу и хочу отобразить, ведь глазом заметить 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
Глава 3. Софт, Сеть и Святость
Браузер

Переменная $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 🕯
Глава 4. Геометрия Текста и Визуальная Архитектура

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

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

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

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

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

Репозиторий проекта: GitHub Link
P.S. Если вы тоже хотите превратить свой терминал в новогоднюю ёлку, не забудьте поставить Nerd Fonts.
© 2026 ООО «МТ ФИНАНС»

