Mobile Build & Release
React Native (Expo SDK 54) Android app. iOS coming later. Released via direct APK download (ka-26.com/download) until Play Store approval.
Build environment
| Tool | Version | Where to install |
|---|---|---|
| Node.js | 20 LTS | nvm install 20 |
| Java JDK | 17 | brew install openjdk@17 |
| Android SDK | latest | Android Studio → SDK Manager |
| Expo CLI | latest | bundled via npx expo (no global install) |
Required env vars (often need to be set explicitly per command):
ANDROID_HOME=/Users/<you>/Library/Android/sdkJAVA_HOME=/opt/homebrew/opt/openjdk@17(Apple Silicon)
APK build (direct download)
cd /Users/siddu/marketplace/mobile
# 1. Generate Android project from app.json (idempotent + clean)
ANDROID_HOME=/Users/siddu/Library/Android/sdk npx expo prebuild --platform android --clean
# 2. Gradle assemble release (~3 min)
cd android
ANDROID_HOME=/Users/siddu/Library/Android/sdk JAVA_HOME=/opt/homebrew/opt/openjdk@17 ./gradlew assembleRelease
# 3. Output
ls -lh app/build/outputs/apk/release/app-release.apk
# → ~84-90 MB
AAB build (for Play Store)
cd mobile/android
ANDROID_HOME=/Users/siddu/Library/Android/sdk JAVA_HOME=/opt/homebrew/opt/openjdk@17 ./gradlew bundleRelease
ls -lh app/build/outputs/bundle/release/app-release.aab
Upload the AAB to Play Console. Play Store accepts only AAB now (not APK).
Distribution flow
Direct APK (current)
- Build APK locally (steps above)
- Copy to landing repo:
cp app-release.apk /tmp/ka26-website/public/downloads/ka26-latest.apk - Bump version label in
/tmp/ka26-website/src/app/download/page.tsx(APK_VERSION) git add -A && git commit -m "chore(download): bump APK to vX" && git push- GitHub Pages deploys in ~1 min
- Users download from
https://ka-26.com/download
Play Store (TBD)
See incident playbook + Authentication. Requires:
- Google Play Console developer account ($25 one-time)
- Aadhaar/PAN verification (1-2 days)
- Store listing assets (icon, screenshots, descriptions, content rating, data safety form)
- AAB upload (not APK)
- Privacy Policy URL (already live:
https://ka-26.com/privacy) - 1-7 day review
Once approved, swap the /download page CTA from APK direct → Play Store redirect.
APK history
| Version | Date | Notable changes |
|---|---|---|
| v9 | 2026-04-10 | Pre-launch baseline |
| v12 | 2026-04-15 | Last v before today's overhaul |
| v13 | 2026-04-17 | First with rebrand to KA26, Eats archived, offline flags, email migration, About link, Sentry SDK |
| v14 | 2026-04-17 | + Shop "My Ads" filter fix |
Versioning convention
Bump the integer for each new build. The major version bump indicates breaking compatibility (e.g. forced re-login, new auth scheme); we haven't crossed one yet.
Release checklist
Before pushing v(N+1):
- All tests pass (
cd mobile && npx vitest run && npx jest --forceExit --detectOpenHandles) - CHANGELOG entry added describing what's new vs prior version
-
mobile/app.jsonversionfield bumped - APK built locally + tested on real device (install with
adb install -r) - APK file copied to landing repo
-
APK_VERSIONupdated on download page - Commit + push to landing repo
Common build issues
| Error | Fix |
|---|---|
JAVA_HOME not set | Use the full env-var prefix shown above |
SDK location not found | Set ANDROID_HOME |
error TS2307: Cannot find module 'react-native' | Mobile imports leaking into web build — ensure mobile path is in web tsconfig.json exclude |
| Gradle hangs at "Resolving dependencies" | First run downloads ~500MB; let it finish |
app-release.apk is unsigned | We use the default Expo debug signing for now; for Play Store builds we'll add a release keystore (Phase B of Play Store submission) |
Related
- Authentication — JWT storage with SecureStore
- Notifications — Expo Push token registration