A Kotlin Multiplatform Instagram-style clone targeting Android and iOS with shared UI using Compose Multiplatform.
Open full flow recording (MP4)
- Profile screen with editable profile data (username, full name, bio, website)
- Instagram-like highlights strip with gradient story rings
- Clickable highlights with story viewer behavior
- Multi-image highlight stories with:
- horizontal swipe pager
- tap-left / tap-right navigation
- auto-advance progress bars
- Post grid with image + video posts
- Post detail screen with:
- Android/iOS video playback
- like and comment actions
- local-only persistence for likes/comments (no server write)
- Firebase push notification plumbing on Android + iOS (token + incoming event bridge to shared code)
- App reads profile data from GitHub Pages JSON:
mock-api/v1/profile.json
- If you change mock data locally, push/deploy to GitHub Pages so devices load the latest payload.
composeApp/src/commonMainshared UI/domain/data logiccomposeApp/src/androidMainAndroid-specific implementations (video player, back handler)composeApp/src/iosMainiOS-specific implementations (video player, back handler)iosAppiOS app entry project for Xcodemock-apiJSON payload used by remote profile API
./gradlew :composeApp:assembleDebug./gradlew :composeApp:compileKotlinIosSimulatorArm64./gradlew :composeApp:testDebugUnitTest- Connect a physical Android device (recommended for macrobenchmarks).
- Enable in Developer Options:
USB debuggingInstall via USBUSB debugging (Security settings)(if your ROM shows it)
- Keep the phone unlocked while benchmarks install/run.
- Run robustness benchmark and export metrics to a stable text report:
./gradlew :benchmark:runInstalledRobustnessWithMetrics- Open the latest robustness metrics:
open benchmark/build/reports/androidTests/connected/benchmark/robustness-metrics-latest.txt- Run connected benchmark suite (Gradle HTML report flow):
./gradlew :benchmark:connectedBenchmarkAndroidTest- Open Gradle connected test report:
open benchmark/build/reports/androidTests/connected/benchmark/index.html- Robustness metrics text report (recommended source of truth):
benchmark/build/reports/androidTests/connected/benchmark/robustness-metrics-latest.txt
- Archived robustness reports:
benchmark/build/reports/androidTests/connected/benchmark/robustness-metrics-YYYYMMDD-HHMMSS.txt
- Gradle connected benchmark HTML:
benchmark/build/reports/androidTests/connected/benchmark/index.html
INSTALL_FAILED_USER_RESTRICTED- Cause: device blocked ADB app install.
- Fix: enable
Install via USB, approve on-device prompts, keep device unlocked, rerun benchmark.
DEBUGGABLEin macrobenchmark- Cause: wrong tested variant/task.
- Fix: run
:benchmark:connectedBenchmarkAndroidTest(benchmark variant), not debug Android test task.
index.htmlshows0 testsbut benchmarks ran- Cause: HTML report reflects a failed Gradle install session.
- Fix: use
robustness-metrics-latest.txtfor actual run metrics.
- Kotlin Multiplatform
- Compose Multiplatform
- Koin
- Ktor
- Coil 3
- Media3 (Android video)
- AVPlayerViewController (iOS video)
- Firebase Cloud Messaging (push)
- Create a Firebase project and add both apps:
- Android package:
de.app.instagram - iOS bundle ID: your
iosAppbundle id from Xcode
- Android package:
- Android setup:
- Download
google-services.json - Place it at
composeApp/google-services.json - Build and run Android app, allow notification permission when prompted (Android 13+)
- Download
- iOS setup (Xcode):
- Add Firebase SDK packages (
FirebaseCore,FirebaseMessaging) toiosApp - Download
GoogleService-Info.plistand add it toiosApp/iosApp - Enable capabilities on app target:
- Push Notifications
- Background Modes -> Remote notifications
- Configure APNs key/certificate in Firebase Console (Cloud Messaging tab)
- Add Firebase SDK packages (
- Send a test push from Firebase Console to verify device token registration and delivery.



