Repository navigation
✨ feat(android): add Play Store TWA packaging - #37
martinezharo wants to merge 3 commits into
Conversation
Wrap the PWA in an Android Trusted Web Activity so it can be published on Google Play without a second client: - Gradle project targeting API 36 with App Links, adaptive icons, a branded splash screen, and the Android share sheet wired to the existing /share-target flow. - Serve /.well-known/assetlinks.json from the Worker using one shared android.config.json package id and certificate fingerprints. - Play listing artwork and copy generated from the real app. - CI for debug APKs and signed release AABs, plus a complete Play release guide. The web service remains the only implementation: same origin, storage, passkeys and service worker.
android-actions/setup-android@v3 still asks sdkmanager for the removed 'tools' package, so use the runner's own cmdline-tools and install only the platform and build-tools this build needs.
A machine-level ignore rule for *.jar otherwise hides future wrapper updates.
Deploying with
|
| Status | Name | Latest Commit | Updated (UTC) |
|---|---|---|---|
| ✅ Deployment successful! View logs |
sendself | 817722d | Oct 20 2026, 04:39 PM |
There was a problem hiding this comment.
Review
Adds an Android Trusted Web Activity wrapper for the PWA: a Gradle project with App Links, adaptive icons, a branded splash and share-target metadata, a Worker route serving /.well-known/assetlinks.json from android.config.json, Play listing assets/copy, CI for debug and signed release builds, and release documentation.
Risk: medium
19 file(s) not reviewed
apps/android/app/src/main/res/drawable-nodpi/splash.png— generated or binaryapps/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png— generated or binaryapps/android/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png— generated or binaryapps/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png— generated or binaryapps/android/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png— generated or binaryapps/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png— generated or binaryapps/android/app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png— generated or binaryapps/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png— generated or binaryapps/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png— generated or binaryapps/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png— generated or binaryapps/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png— generated or binaryapps/android/play/feature-graphic.png— generated or binaryapps/android/play/icon-512.png— generated or binaryapps/android/play/screenshots/01-first-run.png— generated or binaryapps/android/play/screenshots/02-create-space.png— generated or binaryapps/android/play/screenshots/03-chat.png— generated or binaryapps/android/play/screenshots/04-spaces.png— generated or binaryapps/android/play/screenshots/05-devices.png— generated or binarypnpm-lock.yaml— generated or binary
Automated review — opencode-go/deepseek-v4.1-flash · 1 comment(s)
| SENDSELF_KEYSTORE_PASSWORD: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }} | ||
| SENDSELF_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }} | ||
| SENDSELF_KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }} | ||
| run: ./gradlew bundleRelease --no-daemon |
There was a problem hiding this comment.
🟠 major — Increment versionCode in CI release builds
bundleRelease runs without -PsendselfVersionCode, and apps/android/gradle.properties does not define one, so every tag or manual dispatch produces an AAB with versionCode = 1. The first Play upload succeeds, but the next release is rejected for reusing the code; pass the version explicitly (for example from the android-v* tag or github.run_number) or add the property to gradle.properties.
Summary
Adds the Android Trusted Web Activity wrapper needed to publish SendSelf on Google Play, and parks the work here so it can be resumed later.
Nothing is published by this PR: the Play Console account, the Play App Signing fingerprint, and the production deploy are still pending.
Included
apps/android: Gradle project targeting API 36 (minSdk 26), packagecom.fourli.sendself, App Links withautoVerify, adaptive/monochrome icons, branded splash, and notification delegation for the future Web Push work./share-targetflow through the browser helper'sMETADATA_SHARE_TARGET./.well-known/assetlinks.json, generated fromandroid.config.jsonso the Android build and the Worker cannot drift.apps/android/play/.e2e/pwa-installability.spec.ts..github/workflows/android.yml: debug APK + lint on PRs, signed release AAB onandroid-v*tags or manual dispatch.docs/play-store.md: release sequence, Play Console declarations, costs, verification and troubleshooting.pnpm android:icons,pnpm android:play-assets,pnpm android:fingerprint,pnpm android:debug,pnpm android:bundle.Verification
pnpm lint,pnpm format:check,pnpm typecheck,pnpm buildpnpm test— 541 testspnpm test:e2e— 15 tests (installability reports 0 errors)apps/android/gradlew -p apps/android assembleDebug lintDebugapps/android/gradlew -p apps/android bundleReleasebundletool validateandjarsigner -verifyon the AABaapt2 dump permissions: onlyINTERNETand the AndroidX signature-level receiver permissionThe AAB itself is a local build artifact and is not committed.
To resume
/.well-known/assetlinks.jsonis live.apps/android/app/build/outputs/bundle/release/app-release.aab, copy the Play App Signing SHA-256, then runpnpm android:fingerprint "AA:BB:…"and redeploy.The upload key and its password are intentionally outside the repository. See
apps/android/README.md. Web Push remains on the roadmap and is not a Play blocker.