- Go 76.6%
- SCSS 17.1%
- Shell 5.8%
- Makefile 0.4%
- Dockerfile 0.1%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| .forgejo/workflows | ||
| .github/workflows | ||
| cmd | ||
| config | ||
| data/screenshots | ||
| internal | ||
| modules | ||
| scripts | ||
| styles | ||
| tests | ||
| .gitignore | ||
| .golangci.yml | ||
| CHANGELOG.md | ||
| Containerfile | ||
| go.mod | ||
| go.sum | ||
| install.sh | ||
| Makefile | ||
| README.md | ||
| VERSION | ||
Niti
Wayland-панель для тайлового скроллинг-композитора Niri. Написана на Go с использованием gotk4 (Go-биндинги GTK4) и gtk4-layer-shell. Быстрая работа, мгновенный отклик и минимальное потребление ресурсов. Создано специально для ALT Atomic Niri и выступает там в качестве нативного псевдо-шелла по аналогии с gnome-shell. Структура полностью модульная, в будущем с полной свободой включения/отключения модулей и виджетов, а также полной заменой их порядка по усмотрению пользователя.
![]() |
![]() |
![]() |
Что это
Niti — это панель плюс набор окон-компаньонов для Niri: лаунчер приложений, быстрое меню, уведомления, OSD-индикаторы, меню выключения, календарь. Всё рисуется как нативные Wayland-слои (layer-shell) и управляется через IPC Niri. Сам композитор и сессию Niti не заменяет — работает рядом с ними.
Почему Go
| Преимущество | Что это даёт |
|---|---|
| Один статический бинарник | мгновенный запуск, нет интерпретатора и рантайма в памяти |
| Нативная скорость и низкий расход памяти | быстрее и легче JS/TS-шеллов (Ags/Astal на GJS) и Python-обёрток |
| Горутины | конкурентность из коробки: D-Bus-сервисы, Niri IPC, MPRIS, трей работают параллельно без ручного управления потоками |
| Типобезопасность gotk4 | полный доступ к GTK4/libadwaita с проверкой типов на этапе компиляции |
| PGO | сборка с профилем реального использования (make pgo-build) — дополнительное ускорение горячих путей |
Итог: панель стартует за миллисекунды, в простое почти не нагружает CPU и держит минимальный RAM — в отличие от шеллов на JavaScript и Python.
Возможности
Панель (Bar)
Панель с виджетами в трёх зонах — левая, центр, правая. Состав по умолчанию:
| Зона | Виджеты |
|---|---|
| Левая | Рабочие столы, Таскбар |
| Центр | Часы, Медиа |
| Правая | Горячие клавиши, Инфо о системе, Диски, Системный монитор (CPU/RAM/temp), Питание, Раскладка, Трей, Быстрое меню |
Состав зон и параметры виджетов меняются в ~/.config/niti/config.json. В коде есть и дополнительные виджеты, не включённые по умолчанию: запись экрана (PipeWire), заряд периферии (клавиатура/мышь/геймпад) — подключаются добавлением в конфиг.
Окна и оверлеи
| Модуль | Что делает |
|---|---|
| Launcher | запуск приложений (Mod+D): парсинг .desktop, поиск, закреплённые приложения (пин-бар) |
| QuickCenter | быстрое меню: медиаплеер + компактные переключатели (Не беспокоить, режим питания, авиарежим) |
| OSD | всплывающие индикаторы громкости и яркости |
| Notifications | встроенный демон уведомлений (с поддержкой DND) |
| PowerMenu | меню выключения / перезагрузки / выхода |
| Settings | окно настроек панели и модулей |
| Calendar | календарь-попап (клик по часам), интеграция с Google Calendar |
| AppGrid | сетка установленных приложений |
| Corners | скруглённые углы экрана |
| Hotkeys | оверлей со списком горячих клавиш |
Архитектура
cmd/niti/main.go — точка входа, single-instance (unix-сокет), IPC-команды
config/ — загрузка конфига, старт модулей
internal/
app/ — GTK Application, жизненный цикл
css/ — компиляция SCSS (sass), hot-reload стилей
services/ — D-Bus / IPC-бэкенды (niri, audio, mpris, …)
widgets/ — обёртки над GTK-виджетами
panel/ window/ types/ reactive/
modules/ — окна: bar, launcher, quickcenter, osd, …
widgets/ — виджеты бара + manifest.json (динамическая конфигурация)
styles/ — 19 SCSS-файлов, компилируются при запуске
Стили написаны на SCSS и компилируются в рантайме (internal/css), поэтому тему можно менять «на лету» через ~/.config/niti/colors.scss (Material 3).
Сервисы — интеграции с системой
Каждый источник данных — отдельный сервис, общающийся через D-Bus или IPC:
niri (IPC Niri), audio (PipeWire), mpris (медиаплееры), network (NetworkManager), bluetooth (BlueZ), backlight (яркость), upower (питание/батарея), systemtray (SNI), notifications (демон уведомлений), applications (парсинг .desktop), wallpaper (обои), udisks (диски), pwrec (запись экрана), abooster (интеграция с Atomic Booster), eds (Evolution Data Server), gcal (Google Calendar).
Системные интеграции: systemd и D-Bus
systemd
Панель сама работает как пользовательский сервис niti.service
(ExecStart=/usr/bin/niti, WantedBy=graphical-session.target) — сессия
запускает её вместе с графическим окружением. Других сервисов панель при
старте не поднимает; через systemctl выполняются только явные действия
пользователя:
- Меню выключения (
PowerMenu):systemctl reboot/poweroff/reboot --firmware-setup, перезапуск панелиsystemctl --user restart niti. - Виджет питания: управление планировщиком
scx_lavd(systemctl start/stop scx_lavd).
D-Bus
| Шина | Сервис | Для чего |
|---|---|---|
| System | org.freedesktop.NetworkManager |
Wi-Fi/сети |
| System | org.bluez |
Bluetooth |
| System | org.freedesktop.UPower |
питание/батарея периферии |
| System | org.freedesktop.UDisks2 |
диски |
| Session | org.mpris.MediaPlayer2 |
медиаплееры (бар + Quick Center) |
| Session | org.freedesktop.Notifications |
Niti регистрирует это имя — является демоном уведомлений |
| Session | org.kde.StatusNotifierItem + com.canonical.dbusmenu |
системный трей (иконки + меню) |
| Session | org.plafonlinux.AtomicBooster |
интеграция с Atomic Booster |
| Session | org.gnome.evolution.dataserver.Calendar (через libecal) |
события календаря (EDS/GOA) |
Прочие IPC
- Niri — собственный IPC через unix-сокет (
$NIRI_SOCKET): окна, воркспейсы, события, действия. - PipeWire — управление громкостью через CLI
pactl(pipewire-pulse). - Niti ↔ Niti — single-instance через unix-сокет
niti.sock(команды--open-window,--toggle-windowи т.д.).
Установка
curl -fsSL https://altlinux.space/plafonlinux/Niti/raw/branch/main/install.sh | bash
Установщик сам определит ветку ALT (Sisyphus или p11), поставит нужные зависимости и соберёт панель.
Сборка и разработка
git clone https://altlinux.space/plafonlinux/Niti.git
cd Niti
make # собрать бинарник в bin/niti
make install # установить в ~/bin/niti + стили
Зависимости для сборки:
- Go 1.23+, GCC (нужен CGo для gotk4)
libgtk4-devel,libgtk4-layer-shell-develpipewire-libs-devel
Конфигурация
| Файл | Назначение |
|---|---|
~/.config/niti/config.json |
настройки панели и модулей |
~/.config/niti/colors.scss |
цвета (Material 3) |
~/.config/niti/styles/ |
скомпилированные CSS-стили |
Профилирование и производительность
make run # запуск с pprof на :6060
make pgo-capture # собрать профиль (30 секунд использования)
make pgo-build # пересборка с PGO-оптимизацией
make profile-flame # flame-graph
make profile-top # top горячих функций



