How blasco86/tstsiteapp works
Purpose and targets
TstSiteApp is a Kotlin Multiplatform frontend for the external TstSite REST API. It shares Compose UI, API models, request orchestration, and encryption logic across Android, iOS, JVM desktop, JS, and WasmJS. Build topology is defined in build.gradle.kts, composeApp/build.gradle.kts, and settings.gradle.kts.
Entry points and presentation
The shared Compose Material UI is rooted at composeApp/src/commonMain/kotlin/org/tstsite/tstsiteapp/App.kt. Platform launch adapters host that UI:
• Android activity: composeApp/src/androidMain/kotlin/org/tstsite/tstsiteapp/MainActivity.kt
• iOS view controller, embedded by the Swift shell: composeApp/src/iosMain/kotlin/org/tstsite/tstsiteapp/MainViewController.kt, iosApp/iosApp/iOSApp.swift
• JVM desktop main: composeApp/src/jvmMain/kotlin/org/tstsite/tstsiteapp/main.kt
• Browser main and host assets: composeApp/src/webMain/kotlin/org/tstsite/tstsiteapp/main.kt, composeApp/src/webMain/resources/index.html
The UI drives asynchronous login, token validation/profile/logout, user querying, and catalog retrieval via coroutines and the API client boundary.
Shared domain and configuration
Serializable request/response/domain types form the common API contract in composeApp/src/commonMain/kotlin/org/tstsite/tstsiteapp/model/Models.kt. Shared runtime/platform abstraction is declared in composeApp/src/commonMain/kotlin/org/tstsite/tstsiteapp/Platform.kt.
composeApp/src/commonMain/kotlin/org/tstsite/tstsiteapp/config/AppConfig.kt centralizes DEV versus cloud endpoint selection, including Android-emulator localhost handling, and resolves the embedded encrypted payload secret in memory. The cloud API is hosted at Alwaysdata; its backend is separately described as Node.js/Express/PostgreSQL.
API transport boundary
composeApp/src/commonMain/kotlin/org/tstsite/tstsiteapp/network/ApiClient.kt declares the common expect API client contract consumed by shared UI/business flow. Concrete actual clients isolate Ktor engine/platform mechanics:
• Android/OkHttp: composeApp/src/androidMain/kotlin/org/tstsite/tstsiteapp/network/ApiClient.android.kt
• iOS/Darwin: composeApp/src/iosMain/kotlin/org/tstsite/tstsiteapp/network/ApiClient.ios.kt
• JVM/CIO: composeApp/src/jvmMain/kotlin/org/tstsite/tstsiteapp/network/ApiClient.jvm.kt
• JS/Wasm Fetch: composeApp/src/jsMain/kotlin/org/tstsite/tstsiteapp/network/ApiClient.js.kt, composeApp/src/wasmJsMain/kotlin/org/tstsite/tstsiteapp/network/ApiClient.wasmJs.kt
Control flow is UI → client contract → encrypted HTTP request → TstSite API → decrypt/deserialize response → rendered state. JWT, obtained by login, is the authorization boundary; no API key is intended in clients.
Cryptographic boundary
Common expect declarations separate security policy from native implementations: composeApp/src/commonMain/kotlin/org/tstsite/tstsiteapp/utils/crypto/Cryptor.kt and composeApp/src/commonMain/kotlin/org/tstsite/tstsiteapp/utils/crypto/PayloadCrypto.kt.
Cryptor decrypts Fernet-wrapped embedded configuration secrets. PayloadCrypto encrypts API bodies using an AES-256-GCM-compatible payload format where supported. Native implementations are isolated per runtime, for example Android JCE at composeApp/src/androidMain/kotlin/org/tstsite/tstsiteapp/utils/crypto/Cryptor.android.kt and iOS CoreCrypto at composeApp/src/iosMain/kotlin/org/tstsite/tstsiteapp/utils/crypto/PayloadCrypto.ios.kt. This is a material compatibility boundary: README notes iOS payload encryption uses CBC rather than GCM.
Runtimes and delivery
The project requires Kotlin Multiplatform/Compose Multiplatform, Gradle Kotlin DSL, and JDK 21; Android targets minSdk 24. The native iOS wrapper/project is under iosApp/iosApp.xcodeproj and iosApp/iosApp. Web/Wasm output is browser-hosted, with deployment referenced through GitHub Actions in a related central repository and Apache/Alwaysdata hosting. Platform-specific source sets allow security and HTTP dependencies to vary without duplicating the application UI or domain layer.
Components 18
Shared Compose module
Common UI, domain, configuration, transport contract, and crypto policy.
- Shared Compose UI · Drives authentication, user, and catalog flows.
composeApp/src/commonMain/kotlin/org/tstsite/tstsiteapp/App.kt - API models
composeApp/src/commonMain/kotlin/org/tstsite/tstsiteapp/model/Models.kt - Endpoint & secret config · Selects DEV/cloud endpoint and resolves the embedded secret.
composeApp/src/commonMain/kotlin/org/tstsite/tstsiteapp/config/AppConfig.kt - Platform abstraction
composeApp/src/commonMain/kotlin/org/tstsite/tstsiteapp/Platform.kt - API client contract
composeApp/src/commonMain/kotlin/org/tstsite/tstsiteapp/network/ApiClient.kt - Crypto contracts · Fernet secret decryption and encrypted payload policy.
composeApp/src/commonMain/kotlin/org/tstsite/tstsiteapp/utils/crypto/Cryptor.kt - Payload crypto contract · AES-compatible request payload encryption contract.
composeApp/src/commonMain/kotlin/org/tstsite/tstsiteapp/utils/crypto/PayloadCrypto.kt
Platform adapters
Runtime launchers and actual implementations.
- Android activity
composeApp/src/androidMain/kotlin/org/tstsite/tstsiteapp/MainActivity.kt - Desktop main
composeApp/src/jvmMain/kotlin/org/tstsite/tstsiteapp/main.kt - Browser host · Browser entry point and host page.
composeApp/src/webMain/kotlin/org/tstsite/tstsiteapp/main.kt - iOS view controller
composeApp/src/iosMain/kotlin/org/tstsite/tstsiteapp/MainViewController.kt - Android API actual
composeApp/src/androidMain/kotlin/org/tstsite/tstsiteapp/network/ApiClient.android.kt - iOS API actual
composeApp/src/iosMain/kotlin/org/tstsite/tstsiteapp/network/ApiClient.ios.kt - JVM API actual
composeApp/src/jvmMain/kotlin/org/tstsite/tstsiteapp/network/ApiClient.jvm.kt - JS/Wasm API actuals · Separate JS and WasmJS actual clients.
composeApp/src/jsMain/kotlin/org/tstsite/tstsiteapp/network/ApiClient.js.kt - Native crypto actuals · JCE/CoreCrypto and other runtime implementations; iOS uses CBC payload encryption.
composeApp/src/androidMain/kotlin/org/tstsite/tstsiteapp/utils/crypto/Cryptor.android.kt
Other components
- TstSite REST API · Alwaysdata-hosted backend backed by PostgreSQL.
Connections 20
- Android activity → Shared Compose UI: hosts
- Desktop main → Shared Compose UI: hosts
- Browser host → Shared Compose UI: hosts
- Swift iOS shell → iOS view controller: embeds
- iOS view controller → Shared Compose UI: hosts
- Shared Compose UI → API models: uses
- Shared Compose UI → Platform abstraction: uses
- Shared Compose UI → API client contract: calls
- API client contract → Android API actual: actual on Android
- API client contract → iOS API actual: actual on iOS
- API client contract → JVM API actual: actual on JVM
- API client contract → JS/Wasm API actuals: actual on JS/Wasm
- Endpoint & secret config → Crypto contracts: decrypts embedded secret
- API client contract → Payload crypto contract: encrypts request bodies
- Crypto contracts → Native crypto actuals: actual implementations
- Payload crypto contract → Native crypto actuals: actual implementations
- Android API actual → TstSite REST API: encrypted HTTP + JWT
- iOS API actual → TstSite REST API: encrypted HTTP + JWT
- JVM API actual → TstSite REST API: encrypted HTTP + JWT
- JS/Wasm API actuals → TstSite REST API: encrypted HTTP + JWT