Kotlin Multiplatform app for climbers. Track your climbing sessions with real-time alerts on height changes, natively on iOS and Android.
β’ Clean Architecture - Backend business logic shared in Kotlin, native UIs with Jetpack Compose (Android) and SwiftUI (iOS)
β’ Declarative DI - Koin setup with Singleton & Factory patterns, bridging ViewModels to native layers
β’ Platform Features - expect/actual structure for sensors and notifications across platforms
β’ Background Tracking - Sensor data aggregation with Coroutines + WakeLock (Android), Background Tasks (iOS)
β’ Storage - SQLDelight for offline database + Firestore for remote sync. Anonymous sign-in, no user sign-up required
β’ Offline First - Full offline mode with conflict resolution. Changes sync seamlessly when connectivity returns
β’ Native UX - Native UI components, theme design system, and Lottie animations
βββ composeApp/ # Android - Jetpack Compose UI
βββ iosApp/ # iOS - SwiftUI UI
βββ shared/ # Shared Kotlin business logic
βββ commonMain/ # Domain, data, DI modules
βββ androidMain/# Android platform implementations
βββ iosMain/ # iOS platform implementations
Tech Stack:
- Shared: Kotlin Multiplatform, Koin DI, SQLDelight, Ktor, Firebase Firestore, Coroutines
- Android: Jetpack Compose, Material 3, Navigation, Maps, Vico Charts, Lottie
- iOS: SwiftUI, Core Motion, Background Tasks, Core Location
Prerequisites: JDK 17+, Android Studio, Xcode 15+
git clone https://github.com/InonELGABSI/TopOut.git
cd TopOut
# Android
./gradlew :composeApp:installDebug
# iOS
./gradlew :shared:syncFramework
# Then open iosApp.xcodeproj in XcodeLiveSessionManager - Real-time session tracking with sensor fusion
expect/actual - Platform abstractions for sensors, notifications, background tasks
Offline Sync - Conflict resolution with sync flags in SQLDelight schema
Anonymous Auth - Firebase auth without registration, data persists until app deletion
Built for the climbing community π§ββοΈπ§ββοΈ