thermograph/infra/deploy/twa/README.md

86 lines
3.7 KiB
Markdown
Raw Permalink Normal View History

# Thermograph Android app (Trusted Web Activity)
The Android app is a **Trusted Web Activity (TWA)**: a thin native shell that opens
`https://thermograph.org` full-screen in the user's Chrome engine. It *is* the live
PWA — no content is duplicated, and the existing service worker + VAPID **web push
keeps working** inside the app via Android notification delegation (no Firebase, no
backend change). `enableNotifications: true` in `twa-manifest.json` turns that on
and wires the Android 13+ `POST_NOTIFICATIONS` runtime permission.
This folder holds the build config. **Building the APK is a local/manual step**
it needs a JDK, the Android SDK, and a signing keystore that only you should hold.
The current goal is a **signed APK you sideload for testing**; Play Store
submission ($25 one-time) is deferred.
## What's in the repo
- `twa-manifest.json` — Bubblewrap config (reference values; see comment inside).
- `../../frontend/.well-known/assetlinks.json` — Digital Asset Links, served at
`https://thermograph.org/.well-known/assetlinks.json`. Its fingerprint is a
**placeholder** until you generate the signing key (step 4).
## One-time build (you)
Prereqs: Node 18+, JDK 17. Bubblewrap can download the Android SDK for you.
```bash
npm install -g @bubblewrap/cli
# 1. Scaffold from the live manifest (creates ./twa-manifest.json + a keystore).
# Accept defaults, then reconcile with this repo's twa-manifest.json — in
# particular set: packageId = org.thermograph.twa, enableNotifications = true.
bubblewrap init --manifest https://thermograph.org/manifest.webmanifest
# 2. (Or) copy this repo's config and let Bubblewrap fill the SDK bits:
# cp deploy/twa/twa-manifest.json ./twa-manifest.json && bubblewrap update
# 3. Build the signed APK (and .aab for the store, for later).
bubblewrap build
# -> ./app-release-signed.apk and ./app-release-bundle.aab
```
### 4. Wire Digital Asset Links (required — or the app opens with a URL bar)
```bash
# Print the signing key's SHA-256 fingerprint:
bubblewrap fingerprint list # or: keytool -list -v -keystore android-keystore.jks
```
Copy the `SHA256` value into `frontend/.well-known/assetlinks.json`, replacing
`REPLACE_WITH_TWA_SIGNING_KEY_SHA256_FINGERPRINT`, then **deploy the site** so the
new file is live. Confirm:
```bash
curl -s https://thermograph.org/.well-known/assetlinks.json # must show your fingerprint, Content-Type: application/json
```
> If you later publish to Play Store with **Play App Signing**, add *Google's* app
> signing certificate fingerprint (from the Play Console) to `assetlinks.json` too —
> the upload-key fingerprint alone won't verify the store build.
### 5. Sideload and test
```bash
adb install app-release-signed.apk
```
On the device:
- Launch Thermograph — it must open **full-screen with no browser address bar**
(that confirms assetlinks verified).
- Subscribe to a city (or trigger a test alert) and confirm the "unusual weather"
push arrives as a **native Android notification**.
- Grant the notifications permission when prompted (Android 13+).
## Keep the keystore safe
`android-keystore.jks` is required for **every future update** and for the
eventual Play Store listing. Losing it means a new package identity and a fresh
install for every user. Store it out of the repo, backed up.
## Deferred
- **Play Store listing** ($25 one-time Google Play developer account). Upload the
`.aab`; the store review for a well-formed TWA is light. Not part of this pass.
## Why no backend changes
Android delegates the TWA's web notifications to the OS, so `backend/push.py`
(VAPID) and `backend/notify.py` deliver push to the app unchanged. Nothing in
`backend/` is touched by this track.