QALS Wiki · the qalarc network⌂ qalarc.com/projects/qals
generated 2026-09-16 · qalcode autonomous research

PWA vs APK vs Tauri mobile — the ranked path to installable · content/phone-install-paths.md

Phone Install Paths for the QALS PWA (Tailscale-only, plain HTTP)

Researched: 2026-09-15. Sources verified via web fetch (DuckDuckGo HTML + primary docs). Items I could not confirm live are tagged [UNVERIFIED].

Our situation: PWA at http://100.73.134.20:8837/phone — a Tailscale CGNAT IP, no domain, no TLS. This cannot be installed as a PWA today. This doc maps the escape routes.

Ranked recommendations

Rank Path Speed to ship UX quality Security Maintenance Notes
1 tailscale serve HTTPS on *.ts.net + real PWA install ★★★★★ (hours) Good (WebAPK on Android, A2HS on iOS) Strong (real Let's Encrypt cert, tailnet-gated) Trivial (auto-renew) No public domain needed. Unlocks everything else.
2 Plain APK: WebView wrapper + manual Tailscale app ★★★ (days) Native-ish icon/offline shell Good (own signing key) Moderate (2 surfaces to update) Also needs path 1 anyway for service worker; keep UI single-sourced.
3 Private F-Droid repo (distribution layer for #2) ★★★ N/A (channel) Good (signed index) Low-moderate Pairs with any APK; voucher page lists repo URL + fingerprint.
4 Tauri 2 Android build of existing desktop app ★★ (weeks) Best (native shell, deep links, QR plugin) Good Heavier (Rust+Kotlin+Gradle toolchain) Phase-2 upgrade once UX is proven.
5 Play internal/private track ★★ (account + review) Store-grade installs/updates Strong Low, but Google-gated 100 testers internal, org-targeted private apps; consider later.

1. PWA install requirements 2025-26, and what blocks our HTTP URL

Verified (OpenPWA installability criteria, fetched 2026-09-15; MDN "Making PWAs installable"; MDN "Secure contexts", modified 2026-09-14):

The blocker, precisely: http://100.73.134.20:8837 is neither HTTPS nor loopback → window.isSecureContext === false → service worker registration is refused, beforeinstallprompt never fires, and no browser (Chrome, Safari, Samsung, Firefox) will offer install. Clipboard, notifications, and most modern APIs are also gated. The Tailscale tunnel is encrypted, but browsers can't see that — they only trust TLS + trusted roots.

2. Workarounds for plain-HTTP Tailscale URLs — and the real fix

3. Tauri 2 mobile (Android/iOS)

Verified (v2.tauri.app, fetched 2026-09-15):

4. Android APK sideloading for a private-network app

Pieces (standard Android tooling; developer.android.com unreachable during research — specifics tagged):

5. How other projects distribute without stores

7. QALS fit — phased plan

  1. Now (hours): Enable MagicDNS + HTTPS; tailscale serve the phone app at https://<host>.<tailnet>.ts.net/phone. Add manifest + icons + service worker. → Installable PWA everywhere, zero new infrastructure, no public exposure (tailnet still gates access). Publish the voucher page on the same HTTPS origin so post-install QR flows work.
  2. Next (days): If the HyperOS/PWA friction (your Redmi auto-denies adb/PWA oddities — see AGENT_GOTCHAS) annoys anyone, wrap the same UI in a ~1-screen WebView APK, signed once, distributed by QR → public URL. Point it at the ts.net HTTPS origin.
  3. Later (weeks, only if justified): Tauri 2 Android port of the existing desktop app for deep links (qals://voucher/...), QR scanning in-app, biometric unlock — using the Deep-Linking + Barcode-Scanner plugins. F-Droid private repo or Play private track as the channel when the audience grows past sideloading-by-hand.

Key sources: MDN Secure Contexts (2026-09-14); OpenPWA Installability Criteria (fetched 2026-09-15); tailscale.com/kb/1153 (validated 2025-12-10); v2.tauri.app Prerequisites + plugin catalog (updated 2026-08); Play Console Help 9845334 (2026); briarproject.org/download-briar (2026-09-15).