Architecture
Module structure
Section titled “Module structure”nexira/├── client-config # Constants, AppConfig, BuildConfig├── client-core # Domain models, API services, interfaces├── client-launcher # DI wiring, file download, update, launch logic└── client-ui # Compose Multiplatform desktop UIclient-config
Section titled “client-config”App-wide constants: server URLs, timeouts, file paths, proxy config.
Generates BuildConfig with version and build time via gmazzo/buildconfig.
client-core
Section titled “client-core”Pure business logic — no UI, no DI framework dependencies.
AuthService— login, AES token decryption, SSL error detectionServerRepository— dashboard fetch, launcher hash update cycleSkinRepository— skin/cloak uploadHttpClientProvider— switches between secure/insecure OkHttp client at runtime- Domain models:
SessionData,FileManifest,SettingsData, etc.
client-launcher
Section titled “client-launcher”Wires everything together with Koin DI.
FileDownloadService— manifest flattening, parallel download, MD5 verification, extra.zip unpackingLauncherService+GameCommandBuilder— assembles JVM command line for 1.7.10 / 1.12.2 / 1.21.1UpdateService— GitHub Releases API, per-OS asset detection, SHA256 verificationCredentialsManager— AES-256-GCM encryption with PBKDF2 key derivationProfileManager— per-server instance profiles, favorites, last serverJavaManagerService— downloads Bellsoft JDK bundles per Minecraft version
client-ui
Section titled “client-ui”Compose Multiplatform desktop UI.
AppLayout/AppRoot— root composition, window management, auto-loginDashboardScreen— server grid, launch control panelRightPanel— login/account panel, news feedTrayManager— dorkbox/SystemTray wrapperLauncherController— launch pipeline state machine (Idle → Prepare → Downloading → GameRunning)
Key design decisions
Section titled “Key design decisions”HttpClientProvider instead of direct HttpClient injection
Section titled “HttpClientProvider instead of direct HttpClient injection”Repositories receive a provider that resolves the correct client on every call. This allows SSL bypass to take effect immediately without recreating Koin singletons.
JNA version pinning
Section titled “JNA version pinning”dorkbox/SystemTray 4.4 performs a hardcoded version check against JNA. JetBrains Runtime 25 bundles JNA 7.x, which fails this check. Solution: resolutionStrategy.eachDependency forces JNA to 6.1.6 globally, with 5.18.1 pinned explicitly in client-ui for Windows.
AppImage manual assembly
Section titled “AppImage manual assembly”Compose Multiplatform’s built-in Linux packaging produces DEB/RPM. AppImage is assembled manually in CI using jlink for a minimal JRE and appimagetool, with .desktop and AppStream metainfo injected.
GameCommandBuilder version configs
Section titled “GameCommandBuilder version configs”Each supported Minecraft version has an immutable VersionConfig — main class, tweak class, JVM flags, natives dir. NeoForge (1.21.1) requires module path separation (-p) and additional --add-opens flags for Java 21+.
Platform data directories
Section titled “Platform data directories”User data (settings, credentials, downloaded clients, skin cache, logs, crash reports) lives under a single per-OS directory, resolved by PlatformPaths in client-launcher:
| OS | Path |
|---|---|
| Windows | %LOCALAPPDATA%\Nexira\ |
| macOS | ~/Library/Application Support/Nexira/ |
| Linux | $XDG_DATA_HOME/nexira/ (default ~/.local/share/nexira/) |
The environment variable AURA_DATA_DIR overrides the platform default on every OS — useful for moving data to another drive (e.g. D:\Nexira on Windows) without code changes.
On first launch the legacy ~/.aura/ directory (used by versions ≤ 2.2.x) is copied into the resolved data directory and a .migrated marker is written into the legacy directory. The legacy data is not deleted — users can remove it manually after verifying the migration.
Protocol constants (AppConfig.LEGACY_*)
Section titled “Protocol constants (AppConfig.LEGACY_*)”The auth salt, default launcher hash, default server id and protocol JAR descriptor in AppConfig were recovered from the decompiled official SMARTYcraft launcher: Kitty-Hivens/smrt-deco. The upstream is Proguard-obfuscated (a.java, b.java, …) and archived since April 2026, so any future protocol change will need to be re-derived from a fresh dump.