FreedomWave

English Русский

Нативный Android-клиент для администрирования Remnawave — self-hosted панели управления VPN/proxy. Написан на Kotlin Multiplatform и Compose Multiplatform: весь UI и бизнес-логика — в общем коде (iOS-таргет собирается как framework).

Возможности

Начало работы

  1. В панели Remnawave создайте API-токен (раздел API Tokens).
  2. Установите приложение и введите:
    • URL вашей панели (например, https://panel.example.com),
    • API-токен.
  3. Приложение проверит токен и подключится. Токен хранится локально и фактически бессрочен; при ответе 401 приложение возвращается на экран входа.

Сборка

# Debug APK
./gradlew :app:assembleDebug

# Release APK
./gradlew :app:assembleRelease

# Юнит-тесты
./gradlew :composeApp:testAndroidHostTest

# iOS framework (требуется полный Xcode)
./gradlew :composeApp:linkDebugFrameworkIosArm64

Требования: JDK 17+, Android SDK 36. Минимальная версия Android: 12 (API 31).

Архитектура

Двухмодульная структура (AGP 9+ запрещает совмещать com.android.application и kotlin.multiplatform в одном модуле):

Модуль Назначение
:app Тонкий Android-лаунчер — MainActivity, Application, манифест, ресурсы
:composeApp Весь общий код: Compose UI, домен, данные, DI. Собирается в Android AAR и iOS framework

Внутри :composeApp/commonMain: MVVM на StateFlow, Ktor-клиент с Bearer-авторизацией для REST API Remnawave, репозитории с маппингом DTO в доменные модели, Koin для DI и DataStore для настроек. Навигация — нижний навбар с master-detail внутри экранов (без navigation-compose). API-ключ шифруется при хранении через платформенный SecretStore (Android Keystore / iOS Keychain).

Стек

Роль Библиотека
Язык / UI Kotlin Multiplatform, Compose Multiplatform (Material 3)
Сеть Ktor Client + kotlinx.serialization
DI Koin
Хранилище AndroidX DataStore (multiplatform)
ViewModel JetBrains lifecycle-viewmodel-compose
Изображения / QR Coil 3, qrose
Дата/время kotlinx.datetime
Логирование Kermit

Лицензия

Распространяется под лицензией European Union Public Licence v. 1.2 (EUPL-1.2).