Skip to content

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

🎓 Universal-App-Launcher

📌 Description

Universal App Launcher & Manager — це локальний десктопний застосунок для зручного керування та пакетного запуску програм, ігор, локальних скриптів та веб-посилань на персональному комп’ютері під керуванням Linux (Ubuntu).

Застосунок працює повністю автономно, не потребує підключення до інтернету та зберігає всі дані локально у власному високопродуктивному бінарному сховищі.

Основні можливості застосунку:

  • Централізація робочого простору: додавання файлів, проєктів, сайтів та софту в єдине вікно;
  • Динамічне сортування ресурсів за категоріями та гнучка класифікація через теги;
  • Нативний запуск елементів безпосередньо з інтерфейсу в обхід ізольованого середовища;
  • Пакетні пресети (Связки автозапуску): групування та масовий старт dev-оточення, робочих інструментів або ігрових сесій в один клік з інтервалом у 300мс.

🧠 Архітектурна концепція, Webview та Linux-Native Шлюз

Застосунок побудований на базі модульної клієнт-серверної архітектури. Замість важких десктопних фреймворків (як Electron), додаток використовує легковажний системний компонент Webview, а контейнеризоване C++ ядро взаємодіє з операційною системою хоста через асинхронний FIFO-шлюз.

🧱 Глобальна структура проєкту:

  1. Контейнеризоване Ядро (C++ Core / Crow Server):

    • Працює всередині ізольованого Docker-контейнера, забезпечуючи повну незалежність від версій системних компіляторів хоста.
    • REST API (Crow): Обробляє всю бізнес-логіку — від динамічного керування категоріями, тегами та ресурсами до обробки комплексних сутностей.
    • HELL NAH DB: Власна низькорівнева бінарна база даних на базі кастомних бінарних структур. Сховище монтується через Docker Volumes для повної персистентності.
  2. Легковажний Нативний Клієнт (Webview UI / Vanilla JS):

    • Візуальна частина є чистим веб-інтерфейсом (HTML5 / CSS3 / JS), який відкривається у нативному десктопному вікні за допомогою легковажної бібліотеки Webview (яка використовує системний движок WebKitGTK).
    • Клієнт працює на базі реактивного управління станом (appState) з двостороннім локальним квитуванням, що повністю нівелює затримки дискового введення-виведення бінарних таблиць через шари докера.
  3. Асинхронний Шлюз Керування ОС (Host Bash Pipe Bridge):

    • Скрипт-демон, який безперервно працює на хост-машині користувача та виконує роль "рук" для ізольованого контейнера.
    • Механізм взаємодії: Коли C++ бекенд отримує команду на запуск будь-якого системного ресурсу (або вибір картинки через zenity), він не виконує її всередині Docker (це призвело б до крашу через Snap-оточення чи D-Bus). Замість цього сервер пише команду у файл іменованого каналу (pipe.txt). Хост-демон миттєво зчитує канал, очищає рядки від лапок через sed, скидає конфліктні бібліотеки оточення (LD_LIBRARY_PATH) та запускає софт у чистій сесії хоста.

🧠 Що відбувається при запуску (Життєвий цикл проєкту)

  1. Старт та Валідація Сховища: Docker-контейнер запускається, ініціалізує HELL NAH DB, перевіряє цілісність бінарних файлів та виділяє пам'ять під індекси таблиць користувачів, категорій та ресурсів.
  2. Запуск Нативного Вікна: На хості стартує бінарник Webview, який миттєво ініціалізує чисте системне вікно додатка та завантажує інтерфейс, підключаючись до Crow-сервера (http://localhost:18080).
  3. Синхронізація Екосистеми: Веб-інтерфейс при завантаженні всередині Webview робить серію REST-запитів, повністю зчитуючи поточну конфігурацію середовища користувача в локальний appState.
  4. Наскрізне виконання команд: - Будь-яка дія в UI (додавання категорії, прив'язка ресурсу до пресета, зміна шляху) миттєво відображається в інтерфейсі й надсилає запит на бекенд.
    • Якщо дія вимагає системного відгуку (відкриття папки з кодом, запуск гри, вибір локального аватара через zenity), С++ ядро формує команду та пушить її в /app/pipe.txt.
    • Нативний демон на хості підхоплює задачу, очищає шлях через sed, ізолює змінні оточення для обходу конфліктів Snap-пакетів та миттєво відкриває потрібний процес або файл у рідному середовищі ОС.

🫂 Цільова аудиторія

  • 👨‍💻 Розробники (швидкий запуск комплексного dev-оточення, IDE, локальних серверів та документації в один клік);
  • 🎮 Геймери (централізація та кастомізація ігрових лаунчерів, стрім-утиліт та дискорду);
  • 🧑‍💼 Power Users (автоматизація повсякденних задач, групування робочих ресурсів та швидкий доступ до файлової структури).

🎯 Основні сценарії використання (Use Cases)

1. 🚀 Швидкий старт робочої сесії

Користувач відкриває лаунчер і запускає потрібну лабу чи скрипт одним кліком, не відкриваючи файловий менеджер та термінали.

📦 2. Використання пакетних пресетів

Користувач створює пресет «Development»:

  • Автоматично відкривається проєкт у VS Code;
  • Поруч у браузері стартує локальна документація;
  • Підключається додатковий інструментарій. → Все запускається паралельно з безпечними таймаутами.

🗂 3. Організація та кастомізація ресурсів

Групування ресурсів за категоріями, додавання нативних картинок з хоста через системний діалог Zenity для створення чистого візуального дашборду.


🚀 Quick Start (Швидкий запуск)

📦 Вимоги

  • Docker та Docker Compose
  • Linux OS (Ubuntu) з установленими пакетами zenity та xdg-utils

🔧 1. Підготовка FIFO-каналу на хості

Перед першим запуском необхідно ініціалізувати файл іменованого каналу в корені проєкту та видати повні права доступу:

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

📦 3. Компіляція та розгортання проєкту (Docker)

В іншому вікні терміналу підніми всю інфраструктуру проєкту:

docker compose up -d --build

📁 Project Structure

/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++ проекту

🛠️ Technologies

  • 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 ]

📊 Data Models

User

{
  "id": "int",
  "name": "string",
  "avatarUrl": "string"
}

Локальний користувач застосунку.

Resource

{
  "id": "int",
  "name": "string",
  "description": "string",
  "path": "string",
  "avatar_url": "string",
  "user_id": "int",
  "category_id": "int"
}

Описує елемент запуска лаунчера (додаток, гра, скрипт або посилання).

Category

{
  "id": "int",
  "name": "string",
  "description": "string",
  "user_id": "int"
}

Використовується для групування ресурсів за вкладками.

Tag

{
  "id": "int",
  "name": "string",
  "description": "string"
}

Теги для додаткової фільтрації елементів.

Preset

{
  "id": "int",
  "name": "string",
  "description": "string",
  "user_id": "int",
  "resource_ids": "array of int"
}

Набір ресурсів для пакетного автозапуску.

ResourceTag

{
  "id": "int",
  "resourceId": "int",
  "tagId": "int"
}

Службова таблиця зв'язку Many-to-Many між ресурсами та тегами.

PresetResource

{
  "id": "int",
  "presetId": "int",
  "resourceId": "int"
}

🫂 Relationships

User
 ├── Resource
 ├── Category
 └── Preset

Resource
 ├── Category (many-to-one)
 ├── ResourceTag (many-to-many)
 └── PresetResource (many-to-many)

Tag
 └── ResourceTag

Preset
 └── PresetResource

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages