Multiplatform app to check public bike availability across Spanish cities.
This README is developer-oriented: architecture, local setup, commands, and CI/CD.
End-user documentation lives in docs/wiki/ (GitHub Wiki format).
- Kotlin Multiplatform for domain, data, and shared contracts.
- Compose Multiplatform for shared mobile UI (Android + iOS).
- Compose for Wear OS.
- SwiftUI + App Intents for iOS and watchOS.
- Metro DI for compile-time dependency injection.
- Maps and geolocation integration on Android, iOS, and watchOS.
shared/core: models, repositories, platform contracts, Metro graph, and Bizi client.shared/mobile-ui: shared UI for mobile apps.androidApp: main Android app.wearApp: Wear OS app.apple: SwiftUI/App Intents shell for iOS and watchOS.docs: technical plans and internal documentation.docs/wiki: end-user functional documentation.
- Install JDK and mobile toolchains (Android SDK and Xcode on macOS for Apple targets).
- Clone the repository and open the project root.
- Run a baseline build to verify toolchains.
./gradlew build./gradlew :shared:core:jvmTest
./gradlew :shared:mobile-ui:compileKotlinIosSimulatorArm64
./gradlew :androidApp:compileDebugKotlinAndroid
./gradlew :wearApp:compileDebugKotlinAndroid
./gradlew ktlintCheckAll
./gradlew ktlintFormatAll
./gradlew buildThe Android and Wear apps define a dedicated fdroid flavor. Use it when you want builds without Play Store services or Firebase integration.
Common commands:
./gradlew :androidApp:testFdroidDebugUnitTest :wearApp:testFdroidDebugUnitTest
./gradlew :androidApp:assembleFdroidDebug :wearApp:assembleFdroidDebug
./gradlew :androidApp:assembleFdroidRelease :wearApp:assembleFdroidReleaseNotes:
- F-Droid builds do not require
androidApp/google-services.jsonorwearApp/google-services.json. - The
fdroidflavor uses separate application IDs via the.fdroidsuffix. - Play Store publishing commands remain separate and use the
playstoreflavor.
Unified script:
./tooling/project/run_smoke.shExamples:
./tooling/project/run_smoke.sh android-assistant emulator-5554
./tooling/project/run_smoke.sh ios "platform=iOS Simulator,name=iPhone 17 Pro,OS=26.2"
./tooling/project/run_smoke.sh watchos "platform=watchOS Simulator,name=Apple Watch Series 11 (46mm),OS=26.2"GOOGLE_MAPS_API_KEY: optional in local development; enables real map tiles on Android. iOS CI workflows also use it.- Android Crashlytics is enabled automatically when
androidApp/google-services.jsonexists. - Wear OS Crashlytics is enabled automatically when
wearApp/google-services.jsonexists. - iOS Crashlytics is enabled automatically when
apple/iosApp/GoogleService-Info.plistexists.
- Register apps in Firebase:
- Android:
com.gcaguilar.biciradar - Wear OS:
com.gcaguilar.biciradar.wear - iOS:
com.gcaguilar.biciradar.ios
- Android:
- Place configuration files:
androidApp/google-services.jsonwearApp/google-services.jsonapple/iosApp/GoogleService-Info.plist
- Configure local iOS maps key in
apple/Config/LocalSecrets.xcconfigusingGOOGLE_MAPS_IOS_API_KEY. - Rebuild.
The repository already includes safe fallbacks when Firebase files are missing on Android/Wear and iOS.
Main workflow: .github/workflows/build.yml.
It runs on push to main, pull_request, and manual dispatch, with parallel jobs:
android: shared JVM tests, Android unit tests, and debug APK builds (phone + wear).ios: iPhone tests and simulator.appartifact.watchos: Apple Watch tests and simulator.appartifact.
Published artifacts:
android-debug-apksios-simulator-appwatchos-simulator-appios-device-ipa(when Apple signing secrets are configured)
The same workflow can distribute internal builds when required Firebase and Apple signing secrets/variables are present.
Review and manage these values in GitHub Secrets/Variables:
- Firebase:
FIREBASE_SERVICE_ACCOUNT_JSON,FIREBASE_ANDROID_APP_ID,FIREBASE_WEAR_ANDROID_APP_ID,FIREBASE_IOS_APP_ID. - Apple signing:
APPLE_TEAM_ID,APPLE_SIGNING_CERTIFICATE_P12_BASE64,APPLE_SIGNING_CERTIFICATE_PASSWORD,APPLE_PROVISIONING_PROFILE_BASE64,APPLE_KEYCHAIN_PASSWORD. - App Store Connect:
APP_STORE_CONNECT_ISSUER_ID,APP_STORE_CONNECT_KEY_ID,APP_STORE_CONNECT_API_KEY_P8. - Maps/review config:
GOOGLE_MAPS_API_KEY,APP_REVIEW_CONTACT_FIRST_NAME,APP_REVIEW_CONTACT_LAST_NAME,APP_REVIEW_CONTACT_EMAIL,APP_REVIEW_CONTACT_PHONE,APP_REVIEW_NOTES.
App Store publishing workflow: .github/workflows/publish-ios-store.yml (manual).
Build and release checklist: RELEASE.md.
End-user content:
docs/wiki/Home.md: wiki homepage (recommended).docs/wiki/GUIA_USUARIO.md: consolidated one-page guide.