В мире 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.

Пришлось усложнять. Скрипт теперь:

  1. Опрашивает udevadm на наличие устройств класса «mouse».

  2. Отсекает тачпады, графические планшеты и виртуальные устройства.

  3. Вытаскивает Vendor ID и Product ID.

  4. Скармливает их lsusb, чтобы получить настоящее коммерческое название устройства.

  5. Если 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. Эффект «Клина» (Системный блок)

В первом блоке длина названий параметров специально подобрана так, чтобы нарастать сверху вниз:

  • WM

  • Edit

  • Fonts

  • Terminal

Это создаёт визуальную диагональ, устремлённую вниз-вправо. Практически везде использованы такие клины по 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-утилита, которая:

  1. Проверяет зависимости.

  2. Бэкапит старый конфиг.

  3. Позволяет через меню включать/выключать модули, двигать их вверх-вниз (прямо как в конструкторе).

  4. Настраивать модули (например, выбрать валютную пару для курсов или источник новостей).

Глава 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 ООО «МТ ФИНАНС»