Universal App Launcher & Manager — це локальний десктопний застосунок для зручного керування та пакетного запуску програм, ігор, локальних скриптів та веб-посилань на персональному комп’ютері під керуванням Linux (Ubuntu).
Застосунок працює повністю автономно, не потребує підключення до інтернету та зберігає всі дані локально у власному високопродуктивному бінарному сховищі.
Основні можливості застосунку:
- Централізація робочого простору: додавання файлів, проєктів, сайтів та софту в єдине вікно;
- Динамічне сортування ресурсів за категоріями та гнучка класифікація через теги;
- Нативний запуск елементів безпосередньо з інтерфейсу в обхід ізольованого середовища;
- Пакетні пресети (Связки автозапуску): групування та масовий старт dev-оточення, робочих інструментів або ігрових сесій в один клік з інтервалом у 300мс.
Застосунок побудований на базі модульної клієнт-серверної архітектури. Замість важких десктопних фреймворків (як Electron), додаток використовує легковажний системний компонент Webview, а контейнеризоване C++ ядро взаємодіє з операційною системою хоста через асинхронний FIFO-шлюз.
-
Контейнеризоване Ядро (C++ Core / Crow Server):
- Працює всередині ізольованого Docker-контейнера, забезпечуючи повну незалежність від версій системних компіляторів хоста.
- REST API (Crow): Обробляє всю бізнес-логіку — від динамічного керування категоріями, тегами та ресурсами до обробки комплексних сутностей.
- HELL NAH DB: Власна низькорівнева бінарна база даних на базі кастомних бінарних структур. Сховище монтується через Docker Volumes для повної персистентності.
-
Легковажний Нативний Клієнт (Webview UI / Vanilla JS):
- Візуальна частина є чистим веб-інтерфейсом (HTML5 / CSS3 / JS), який відкривається у нативному десктопному вікні за допомогою легковажної бібліотеки Webview (яка використовує системний движок
WebKitGTK). - Клієнт працює на базі реактивного управління станом (
appState) з двостороннім локальним квитуванням, що повністю нівелює затримки дискового введення-виведення бінарних таблиць через шари докера.
- Візуальна частина є чистим веб-інтерфейсом (HTML5 / CSS3 / JS), який відкривається у нативному десктопному вікні за допомогою легковажної бібліотеки Webview (яка використовує системний движок
-
Асинхронний Шлюз Керування ОС (Host Bash Pipe Bridge):
- Скрипт-демон, який безперервно працює на хост-машині користувача та виконує роль "рук" для ізольованого контейнера.
- Механізм взаємодії: Коли C++ бекенд отримує команду на запуск будь-якого системного ресурсу (або вибір картинки через
zenity), він не виконує її всередині Docker (це призвело б до крашу через Snap-оточення чи D-Bus). Замість цього сервер пише команду у файл іменованого каналу (pipe.txt). Хост-демон миттєво зчитує канал, очищає рядки від лапок черезsed, скидає конфліктні бібліотеки оточення (LD_LIBRARY_PATH) та запускає софт у чистій сесії хоста.
- Старт та Валідація Сховища: Docker-контейнер запускається, ініціалізує
HELL NAH DB, перевіряє цілісність бінарних файлів та виділяє пам'ять під індекси таблиць користувачів, категорій та ресурсів. - Запуск Нативного Вікна: На хості стартує бінарник Webview, який миттєво ініціалізує чисте системне вікно додатка та завантажує інтерфейс, підключаючись до Crow-сервера (
http://localhost:18080). - Синхронізація Екосистеми: Веб-інтерфейс при завантаженні всередині Webview робить серію REST-запитів, повністю зчитуючи поточну конфігурацію середовища користувача в локальний
appState. - Наскрізне виконання команд: - Будь-яка дія в UI (додавання категорії, прив'язка ресурсу до пресета, зміна шляху) миттєво відображається в інтерфейсі й надсилає запит на бекенд.
- Якщо дія вимагає системного відгуку (відкриття папки з кодом, запуск гри, вибір локального аватара через
zenity), С++ ядро формує команду та пушить її в/app/pipe.txt. - Нативний демон на хості підхоплює задачу, очищає шлях через
sed, ізолює змінні оточення для обходу конфліктів Snap-пакетів та миттєво відкриває потрібний процес або файл у рідному середовищі ОС.
- Якщо дія вимагає системного відгуку (відкриття папки з кодом, запуск гри, вибір локального аватара через
- 👨💻 Розробники (швидкий запуск комплексного dev-оточення, IDE, локальних серверів та документації в один клік);
- 🎮 Геймери (централізація та кастомізація ігрових лаунчерів, стрім-утиліт та дискорду);
- 🧑💼 Power Users (автоматизація повсякденних задач, групування робочих ресурсів та швидкий доступ до файлової структури).
Користувач відкриває лаунчер і запускає потрібну лабу чи скрипт одним кліком, не відкриваючи файловий менеджер та термінали.
Користувач створює пресет «Development»:
- Автоматично відкривається проєкт у VS Code;
- Поруч у браузері стартує локальна документація;
- Підключається додатковий інструментарій. → Все запускається паралельно з безпечними таймаутами.
Групування ресурсів за категоріями, додавання нативних картинок з хоста через системний діалог Zenity для створення чистого візуального дашборду.
- Docker та Docker Compose
- Linux OS (Ubuntu) з установленими пакетами
zenityтаxdg-utils
Перед першим запуском необхідно ініціалізувати файл іменованого каналу в корені проєкту та видати повні права доступу:
rm -f pipe.txt
mkfifo pipe.txt
chmod 777 pipe.txt##⚡2. Запуск Системного Шлюзу (На хості)
Запусти Bash-скрипт у терміналі хост-машини, щоб активувати зв'язок з контейнером:
while true; do
if read -r line < pipe.txt; then
line=$(echo "$line" | xargs)
if [ "$line" = "SELECT_IMAGE" ]; then
env -i DISPLAY=$DISPLAY HOME=$HOME USER=$USER zenity --file-selection > selected_path.txt 2>zenity_err.log
sync
SELECTED=$(cat selected_path.txt)
if [ ! -z "$SELECTED" ] && [ "$SELECTED" != "CANCELLED" ]; then echo "Selected: $SELECTED"; else echo "CANCELLED" > selected_path.txt; sync; fi
elif [ ! -z "$line" ]; then
CLEAN_PATH=$(echo "$line" | sed 's/"//g')
echo "Executing host command: $CLEAN_PATH"
(
unset LD_LIBRARY_PATH
unset LD_PRELOAD
export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
xdg-open "$CLEAN_PATH"
) &
fi
fi
doneВ іншому вікні терміналу підніми всю інфраструктуру проєкту:
docker compose up -d --build/project
│
├── /core
│ ├── /api # Обробники HTTP запитів (Controllers) та DTO
│ ├── /application # Бізнес-логіка (Services, Маппери)
│ ├── /domain # Сутності (Resource, Category, Preset)
│ └── /infrastructure # Системні виклики та робота з FIFO
│
├── /webview # Нативний легковажний C++ клієнт (WebKitGTK вікно)
│ └── /renderer # Фронтенд-частина (HTML, CSS, Vanilla JS)
│
├── /hellnah # Сирці власної вбудованої бінарної БД
│
├── pipe.txt # FIFO-канал зв'язку Докера з ОС
├── host-bridge.sh # Скрипт-демон шлюзу на хості
└── CMakeLists.txt # Конфігурація збірки всього C++ проекту- C++20 — основна логіка, сервіси та системне ядро.
- Crow — мікрофреймворк для створення асинхронного REST API на C++.
- HELL NAH DB — власна вбудована база даних на базі послідовних бінарних структур.
- Webview (WebKitGTK) — легковажна нативна десктопна оболонка вікна додатку.
- HTML5 / CSS3 / Vanilla JS — інтерфейс користувача з реактивним appState.
[ Нативне вікно Webview (HTML/JS) ]
↕ (Локальний REST API / JSON)
[ Docker-контейнер: Crow Server (C++ Core) ] ──> [ HELL NAH DB (Бінарні файли) ]
↓ (Запис шляху / Сигналу)
[ FIFO Труба: pipe.txt ]
↓ (Зчитування / Очищення оточення)
[ Host Демон (Bash) ] ──> [ Виклики ОС: Нативний xdg-open / Zenity ]{
"id": "int",
"name": "string",
"avatarUrl": "string"
}
Локальний користувач застосунку.
{
"id": "int",
"name": "string",
"description": "string",
"path": "string",
"avatar_url": "string",
"user_id": "int",
"category_id": "int"
}
Описує елемент запуска лаунчера (додаток, гра, скрипт або посилання).
{
"id": "int",
"name": "string",
"description": "string",
"user_id": "int"
}
Використовується для групування ресурсів за вкладками.
{
"id": "int",
"name": "string",
"description": "string"
}
Теги для додаткової фільтрації елементів.
{
"id": "int",
"name": "string",
"description": "string",
"user_id": "int",
"resource_ids": "array of int"
}
Набір ресурсів для пакетного автозапуску.
{
"id": "int",
"resourceId": "int",
"tagId": "int"
}
Службова таблиця зв'язку Many-to-Many між ресурсами та тегами.
{
"id": "int",
"presetId": "int",
"resourceId": "int"
}
User
├── Resource
├── Category
└── Preset
Resource
├── Category (many-to-one)
├── ResourceTag (many-to-many)
└── PresetResource (many-to-many)
Tag
└── ResourceTag
Preset
└── PresetResource