CrimsonCode2026 is a Kotlin Multiplatform emergency response mobile app. The current runnable app is the Android Compose build with phone OTP screens, settings, contacts, map/list event browsing, and event creation when Supabase credentials are configured.
The Android app builds, installs, and launches on the local emulator.
Verified locally:
./gradlew :mobile:assembleDebug :mobile:compileKotlinIosSimulatorArm64
./gradlew :mobile:installDebug
/Users/fadyy/Library/Android/sdk/platform-tools/adb shell monkey -p org.crimsoncode2026 -c android.intent.category.LAUNCHER 1What works without backend keys:
- App launch
- Local shell OTP flow
- Settings screen
- Contacts shell
- Map screen
- Event list/detail UI
What needs Supabase/Firebase keys:
- Real SMS OTP
- Live public events from Supabase
- Persisted event creation
- Push notifications
- macOS
- JDK 17 or newer
- Android Studio or Android SDK
- Android SDK platform 36
- Android emulator named
Medium_Phone_API_36.1 - Optional: Supabase project URL and anon key
- Optional: Firebase Android
google-services.json
This workspace expects the Android SDK here:
/Users/fadyy/Library/Android/sdkCreate the root Android SDK config:
cat > local.properties <<'EOF'
sdk.dir=/Users/fadyy/Library/Android/sdk
EOFlocal.properties is gitignored and should stay local.
Confirm the emulator exists:
/Users/fadyy/Library/Android/sdk/emulator/emulator -list-avdsExpected output includes:
Medium_Phone_API_36.1
From the repo root:
cd /Users/fadyy/CrimsonCode2026Start the emulator UI:
/Users/fadyy/Library/Android/sdk/emulator/emulator \
-avd Medium_Phone_API_36.1 \
-no-snapshot \
-gpu swiftshader_indirectIn another terminal, wait for Android to finish booting:
/Users/fadyy/Library/Android/sdk/platform-tools/adb wait-for-device shell 'while [ "$(getprop sys.boot_completed)" != "1" ]; do sleep 1; done; echo booted'Install the debug app:
./gradlew :mobile:installDebugLaunch CrimsonCode:
/Users/fadyy/Library/Android/sdk/platform-tools/adb shell monkey \
-p org.crimsoncode2026 \
-c android.intent.category.LAUNCHER \
1Confirm it is running:
/Users/fadyy/Library/Android/sdk/platform-tools/adb shell pidof org.crimsoncode2026If the command prints a number, the app process is alive.
Check for launch crashes:
/Users/fadyy/Library/Android/sdk/platform-tools/adb logcat -d -t 200 | rg -i "org.crimsoncode2026|FATAL EXCEPTION|AndroidRuntime"Build the Android debug APK:
./gradlew :mobile:assembleDebugBuild Android and compile the iOS simulator shared target:
./gradlew :mobile:assembleDebug :mobile:compileKotlinIosSimulatorArm64The debug APK is created at:
apps/mobile/build/outputs/apk/debug/mobile-debug.apk
The app opens without credentials. Real backend behavior needs Supabase.
Create apps/mobile/androidApp/local.properties:
mkdir -p apps/mobile/androidApp
cat > apps/mobile/androidApp/local.properties <<'EOF'
supabase.url=https://your-project-ref.supabase.co
supabase.anon.key=your-supabase-anon-key
EOFOr provide environment variables before building:
export SUPABASE_URL=https://your-project-ref.supabase.co
export SUPABASE_ANON_KEY=your-supabase-anon-keyThen rebuild and reinstall:
./gradlew :mobile:installDebugInside the app:
- Use shell mode for local-only OTP navigation.
- Turn on real auth in Settings when Supabase credentials are configured.
- Enter a phone number in E.164 format, such as
+15551234567. - Use the map screen to load public events and create events.
Firebase is optional for the debug MVP build. If google-services.json is missing, Gradle logs:
MVP build: google-services.json not found, skipping Google Services plugin.
To enable Firebase services:
cp apps/mobile/androidApp/google-services.json.template apps/mobile/androidApp/google-services.jsonThen replace the template values with the Firebase Android app config from the Firebase console.
Supabase schema and edge-function code live in:
backend/migrations/
backend/functions/
backend/config/supabase.toml
More backend detail:
Use this as the current quality gate:
./gradlew :mobile:assembleDebug :mobile:compileKotlinIosSimulatorArm64Known caveat:
./gradlew :mobile:allTestscurrently reaches app compilation, then fails while compiling legacy commonTest sources. Those tests reference modules excluded from the MVP source set (auth, storage, notification/realtime/performance helpers) and JVM-only APIs. Follow-up issue:
beads_CrimsonCode2026-shd — Restore or prune stale commonTest suite
List devices:
/Users/fadyy/Library/Android/sdk/platform-tools/adb devicesRe-launch the app:
/Users/fadyy/Library/Android/sdk/platform-tools/adb shell monkey -p org.crimsoncode2026 -c android.intent.category.LAUNCHER 1Stop the emulator:
/Users/fadyy/Library/Android/sdk/platform-tools/adb emu killThis project uses bd (beads).
Initial setup after a fresh clone:
bd onboard
bd bootstrapUseful commands:
bd ready
bd show <id>
bd update <id> --status in_progress
bd close <id>
bd export -o .beads/issues.jsonlThis installed bd version does not provide bd sync; use bd export -o .beads/issues.jsonl to update the tracked issue export after issue changes.