Skip to content

Android Clients

EdgeChat now uses capacitor/ as its primary Android release. The APK bundles the Vue Web UI and keeps Kotlin limited to platform integration. The native Compose client in android/ is temporarily deprecated and is no longer the default release, though its source and separate CI remain available.

Web UI + Capacitor (Primary Release)

The Capacitor client lives in capacitor/ and uses the application ID com.aozorae.edgechat.web. Vue owns sign-in, conversations, admin pages, realtime messages, and media UI. A small Kotlin plugin handles Android file selection, microphone and notification permission, opening the matching room from a notification, and delegating external links to the system.

Installation and Connection

  1. Download edgechat-*.apk from GitHub Releases.
  2. Verify it against SHA256SUMS.txt.
  3. Allow installation from the browser or file manager when Android asks.
  4. On the sign-in screen, enter the EdgeChat HTTPS origin, username, and password.
  5. After validation, the client stores that instance and uses it for HTTP, attachments, and WebSocket traffic.

The APK bundles only local web assets and is not tied to one deployment. Users can edit the origin after signing out; switching instances clears the previous token. Web assets and the Android Manifest are embedded in the APK, so frontend or permission changes require a newly built package.

Platform Features and Limits

  • Files use the Storage Access Framework without broad storage permission
  • Android 13 and newer request notification permission when the user enables notifications
  • The first recording waits for microphone permission; the wait can be cancelled and is cancelled when the app moves to the background
  • After denying microphone access, restore it in Settings > Apps > EdgeChat > Permissions > Microphone, then retry
  • The client reuses browser session storage and the frontend realtime flow; it has no Room offline database, WorkManager outbox, or FCM
  • Instant background notifications are not guaranteed when the app stops receiving messages

Local Build

Use JDK 21 and Android SDK 36:

bash
npm ci
npm run build:capacitor

The Debug APK is written to capacitor/android/app/build/outputs/apk/debug/app-debug.apk. GitHub Capacitor Android CI builds the same generic APK and uploads the edgechat-capacitor-debug artifact.

Signed Releases

Push an android-v* tag or run GitHub Android Release manually. The workflow reads the four ANDROID_KEYSTORE_* Secrets, bundles the current Vue frontend into a signed APK and AAB, and creates SHA256SUMS.txt. The signing keystore controls future upgrade installation and must be backed up offline. Never commit signing.properties, a keystore, or its passwords.

Native Compose (Temporarily Deprecated)

The native client lives in android/ and uses Kotlin, Jetpack Compose, Material 3, Room, WorkManager, Hilt, Retrofit, and OkHttp. Its application ID is com.aozorae.edgechat, so it can still be installed beside the Capacitor build. It is fully separate from the Vue frontend and shares only /api/v1, stable error codes, and brand assets.

This implementation now keeps only its source, API v1 contract, and .github/workflows/android-ci.yml verification. The Android Release workflow no longer publishes it. Historical packages remain useful for validation, but new installations and routine updates should use the Capacitor build.

bash
cd android
./gradlew testDebugUnitTest lintDebug assembleDebug

The Debug APK is written to android/app/build/outputs/apk/debug/app-debug.apk.