Skip to content

Google Play launch readiness: finish VPS deployment, signing, assetlinks, Play Console and device QA #340

Open

Description

@baba-dev

Objective

Move MenuMinute Restaurant Manager (com.bababuilds.menuminute) from the merged Android foundation PR #338 to a verified Google Play Internal Testing release, then closed testing/production when eligible. No production Play launch is authorized by this issue.

Confirmed baseline (2026-11-08)

Gate 0: Recover safe VPS staging

  • Run read-only disk audit on VPS and retain output in private operator notes (no env contents/passwords):
    df -h / /var/www/menuminute /var/lib/menuminute
    sudo du -xhd1 /var/www/menuminute /var/lib/menuminute /var/log /var/cache 2>/dev/null | sort -h | tail -45
    readlink -f /var/www/menuminute/current
    readlink -f /var/www/menuminute/worker-current
    sudo find /var/www/menuminute/releases -mindepth 1 -maxdepth 1 -type d -printf '%TY-%Tm-%Td %p\n' | sort
  • Safely free enough space to exceed 4 GiB before staging. Review old release dirs/incoming archives and preserve active web, worker, rollback targets, user media, DB, env and backups. Never run blanket Docker volume prune / restic deletion.
  • Reran the same reviewed main release through existing gated deployment workflow. Verified MenuMinute web, worker, PostgreSQL, Redis queue/cache and ERP healthy at SHA ddc533d02f2cee66cd6e9e41452c2a5d329c3315.
  • Verified public /app is login-gated and /api/app/launch route now exists (redirect observed). Cookie attributes still require direct response-header check before Play launch. /.well-known/assetlinks.json returns 503 until a verified SHA256 signing fingerprint is supplied.

Gate 1: Google Play app and identity

  • Google Play developer account verification passed (owner confirmed 2026-11-10). App creation, first Play AAB upload, and closed-test/production-access requirements remain separate verification gates.
  • Create app named MenuMinute Restaurant Manager, default language English, developer support contact admin@bababuilds.com.
  • Confirm permanent Android application ID com.bababuilds.menuminute before first AAB upload.
  • Confirm Android 16/API 36 target meets current requirement.

Gate 2: Sign release privately

  • Generate upload-only JKS locally with JDK keytool; back it up off repository with password in a secure secret manager. Do not post/share keystore or key passwords in GitHub issues/chat.
  • GitHub Actions environment android-play-internal created by owner and used successfully by signed candidate run #42496478422. Verify environment branch restriction and reviewers separately.
  • Configure environment secrets (owner confirmed four names; signing run verified key availability without exposing values):
    ANDROID_UPLOAD_KEYSTORE_BASE64, ANDROID_UPLOAD_STORE_PASSWORD, ANDROID_UPLOAD_KEY_ALIAS, ANDROID_UPLOAD_KEY_PASSWORD.
  • Manually ran workflow on reviewed main (008c7aefa1c9434d0d2911168d1b9e862604b744). Run #42496478422 succeeded; Gradle built AAB, jar verified. passed, artifact menuminute-android-signed-008c7aefa1c9434d0d2911168d1b9e862604b744 uploaded (ID 13624040761, 7-day retention). Owner still to download and preserve AAB + SHA-256.
  • Upload signed AAB to Play internal testing, enroll in Play App Signing. An APK is only for sideload/internal troubleshooting.

Gate 3: Digital Asset Links and trusted fullscreen

  • From Play Console App integrity / Play app signing, copy the App signing key certificate SHA-256 (NOT the upload key's certificate) after app enrollment.
  • Set valid ANDROID_PLAY_APP_SIGNING_SHA256=XX:..(32 bytes) in /etc/menuminute/web.env privately, restart/redeploy web process through controlled procedure. Never commit the fingerprint's private key; fingerprint itself is public.
  • Verify https://food.bababuilds.com/.well-known/assetlinks.json returns HTTP 200, JSON target com.bababuilds.menuminute, correct SHA-256, publicly reachable, no redirect.
  • Install from Play internal track, confirm TWA fullscreen with no fallback Chrome browser toolbar. Test Android Back, app restart, auth, Google sign-in and logout.

Gate 4: Play Console declarations / store listing

  • Privacy URL: https://food.bababuilds.com/privacy (already publicly accessible).
  • Account deletion URL: https://food.bababuilds.com/delete-account (already publicly accessible; owner confirmed workflow).
  • Complete Data safety against actual live features: account/contact, guest CRM, order history, photos/uploads, analytics, logs, session/push endpoint, AI providers, processors. Never claim 'no collection' merely because Android shell has no SDK.
  • App access: dedicated non-admin reviewer test merchant with stable reusable credentials, reachable internationally, without one-time MFA blocking Play reviewers. Do not put passwords in this issue.
  • Set ad/age/content-rating/target-audience declarations accurately; free app with no digital checkout (consumption only).
  • Complete store listing: 512x512 app icon, 1024x500 opaque feature graphic, 2+ real Android screenshots, short/full description, support details.
  • Audit Play client all payment-entry and deep-link routes to ensure no Razorpay checkout for digital subscriptions inside TWA, while web Razorpay and existing paid entitlements remain supported.

Gate 5: Device tests / release

  • Execute docs/android-release/device-test-matrix.md on physical Android phones/tablets including Chrome TWA, OAuth, MFA, POS orders, Kitchen background/reconnect, camera, 58/80 mm BLE printers, denied printer permissions and Print/PDF fallback. Bluetooth Classic/USB unsupported until separately built and verified.
  • Use Play internal testing first. Capture crash/ANR, TWA full-screen, order and printing evidence.
  • If personal Play developer account created after 2023-11-13, meet 12 opted-in testers continuously for 14 days before applying for production access (verify account-specific requirements in Play Console).
  • Review Play's latest policy warnings / rejection notices; move to staged production only after every gate has evidence and signoff.

Evidence and references

Privacy/safety: Do not paste keys, tokens, env file contents, or unmasked customer data in this issue.

Activity

  1. baba-dev commented on Nov 8, 2026

    @baba-dev
    OwnerAuthor

    Signing preparation now tracked independently in PR #343, based on current main and non-overlapping with Claude's draft PR #342. It supplies a portable-JDK17 local Windows generator and hardens the Android signed AAB GitHub Actions workflow (main-only; short-lived environment secrets; verify JKS alias; remove temporary key). Owner action remains mandatory: generate and privately back up the upload JKS, create restricted android-play-internal GitHub environment, and enter four environment secrets. No credentials or keystore have been generated, retrieved or uploaded by ChatGPT. Sign the intended release only after #342 is reviewed, merged and exact-head Android CI passes.

  2. baba-dev commented on Nov 8, 2026

    @baba-dev
    OwnerAuthor

    Update: Play signing setup PR #343 merged into main at 3a533780fc505c96c8318697e0132f67f667a68a, after exact-head green CI https://github.com/baba-dev/menuminute/actions/runs/42460674025. Includes scripts/android/prepare-play-signing.ps1, docs/android-release/signing-setup.md, and hardened Android manual signing workflow. Still not complete: owner must generate and encrypt offline backup of menuminute-upload.jks locally, create restricted android-play-internal environment and add four secrets, then (after PR #342 merge and CI) invoke manual signing workflow. No real key was created or uploaded through ChatGPT; no AAB has been signed in this operation.

  3. baba-dev commented on Nov 8, 2026

    @baba-dev
    OwnerAuthor

    2026-11-08 owner update: GitHub environment android-play-internal and all four required signing secrets have been created (owner-reported; secret names/values cannot be read or verified by the GitHub app). PR #342 is merged in main (ed134eb99c7ce6d1232a68529a5e68684909b4f4); main CI and production deploy both passed. Next action: manually dispatch Android signed internal-release candidate on main, verify signing and AAB artifact, and retain a private offline keystore backup. GitHub connector lacks workflow_dispatch permission; no signed candidate has been launched in this chat.

  4. baba-dev commented on Nov 8, 2026

    @baba-dev
    OwnerAuthor

    Resolved the first signed AAB candidate failure: run 42490767388 successfully loaded the JKS and built signed AAB, but jarsigner -verify -strict failed with exit 4 because the Google Play upload certificate is intentionally self-signed (PKIX path failure). Regression-tested fix merged in PR #344 at 008c7aefa1c9434d0d2911168d1b9e862604b744; all 19 PR CI jobs passed at run 42491513264. The workflow now validates strictly using only the configured JKS trust store, preserving signature integrity; local test confirmed modified signed contents still fail. No keystore or GitHub secret changes required. Owner must launch a new Android signed internal-release candidate workflow manually on updated main—do not rerun the old failed job, which uses the previous workflow revision. A signed artifact is not yet confirmed.

  5. baba-dev commented on Nov 8, 2026

    @baba-dev
    OwnerAuthor

    Implemented the split Android versus SaaS web release workflow in merged PR #346, SHA a4065c145a31810958da3fdc673b140903a531db. All 19 PR CI jobs passed (run 42514363796). Reviewed native files (android/, scripts/android/, signing workflow) now generate a versioned, strictly verified signed candidate automatically after green current-main push CI; web-only updates retain the original web/VPS pipeline and do not generate Play AABs. VersionCode uses per-workflow run_number+1 (initially signed code1). Signed candidate has 30-day checksum/provenance artifact. Google Play internal draft submission is a separate manual-only, reviewer-gated, WIF-authenticated workflow that requires android-play-publish env with PLAY_PUBLISH_ENABLED=true and can only submit an internal draft, with distribution requiring another owner Play Console action. Not configured or tested on live Google Play yet; developer identity/Play app/first manual upload/assetlinks/device QA remain outstanding. Current merged-main CI run 42514821347 is pending verification.

  6. baba-dev commented on Nov 8, 2026

    @baba-dev
    OwnerAuthor

    First end-to-end automatic Android signed release verified after PR #346 merge. Exact reviewed main SHA a4065c145a31810958da3fdc673b140903a531db; main CI #42514821347 passed 19/19 jobs. This automatically triggered Android signed candidate #42515347084 via workflow_run; preflight passed, Gradle BUILD SUCCESSFUL, trusted upload cert jar verified., and artifact menuminute-android-signed-a4065c145a31810958da3fdc673b140903a531db-3 (ID 13631087826) was uploaded containing the signed AAB, checksum and provenance JSON. Managed release version: 1.0.3 / versionCode 4 (workflow run_number=3). All GitHub signing jobs succeeded, reusing existing JKS without credential changes. Independent ARM64 publish #42515347093 and VPS deploy #42515410342 also passed. Google Play API uploader remains intentionally disabled, pending the separately protected android-play-publish environment and Play Console developer/app/API setup; no store upload/distribution has occurred. This validates the independent web and native release tracks.

  7. baba-dev commented on Nov 9, 2026

    @baba-dev
    OwnerAuthor

    Google Play reviewer fixture prepared in merged PR #347, SHA c7b12c771aafb78a1242af691b1cb4790bb2f259; 19/19 exact-head PR CI jobs passed in run #42696967343. Adds isolated normal Better Auth "Reviewer Account" tenant "The Droid Pie" with 55 dishes across 6 categories, 10 tables, sample orders, three KDS stations/routes, two non-billable reviewer entitlements (Ordering/Kitchen; normal POS enabled), synthetic reservations and CRM guests. Includes one-time owner-only runtime provisioner and runbook, no hardcoded secrets or auto-provision in deploy. Owner's provided password was never checked in; use an owner-controlled reviewer email and a newly rotated private 16+ character password. Not live/provisioned yet; user must execute the one-time operator command against production migration owner credentials once the post-merge VPS release succeeds and then verify clean Android login/functional review. Main CI: run #42697755381 ongoing.

  8. baba-dev commented on Nov 9, 2026

    @baba-dev
    OwnerAuthor

    Owner confirmed 2026-11-10: the one-time production VPS Play reviewer provisioner ran successfully with an owner-controlled reviewer email and reported The Droid Pie; 55 dishes; 119 synthetic orders; 10 tables. Credentials were not included in logs or this issue. The dedicated real-login reviewer tenant was created in the production database (owner-reported), and the exact merged commit c7b12c771aafb78a1242af691b1cb4790bb2f259 passed CI, signed Android candidate and production VPS deploy #42698954093. Remaining verification: test login in a clean Android/browser session; test feature access, menu and kitchen; rotate any password previously shared in conversation and provision with PLAY_REVIEWER_ROTATE_PASSWORD=true if needed; delete the temporary root-only reviewer env file afterward; add verified credentials privately to Google Play Console App access. No claim yet that manual end-to-end login or Google review succeeded.

  9. baba-dev commented on Nov 10, 2026

    @baba-dev
    OwnerAuthor

    2026-11-10: Owner configured ANDROID_PLAY_APP_SIGNING_SHA256. Live public /.well-known/assetlinks.json independently retrieved and shows com.bababuilds.menuminute, delegate_permission/common.handle_all_urls, and SHA-256 74:12:F2:A3:3C:E5:AC:2A:84:53:91:E7:2B:F3:74:13:F7:BE:2F:44:F1:9D:19:75:BE:FB:66:C6:6D:B8:15:2B. Source route src/app/.well-known/assetlinks.json/route.ts validated to emit configured fingerprint. Website association configured; physical Play-installed Android TWA fullscreen verification remains pending, as does confirming this value is the Play app signing certificate and not the upload key. For device QA: install from Internal Testing opt-in link, open app, confirm Chrome address bar absent, test login (Play reviewer sample tenant), Dashboard/POS/Orders/Kitchen/QR, reload/logout, and assess billing/printer integration separately.

  10. baba-dev commented on Nov 10, 2026

    @baba-dev
    OwnerAuthor

    P0 Android Play internal launch crash reproduced and diagnosed (2026-11-10). After owner reported the Play-installed app immediately closes, a new API 35 Google Play emulator launch smoke workflow reproduced a Java fatal exception in run #42804640519: IllegalArgumentException: Component class com.google.androidbrowserhelper.trusted.ManageDataLauncherActivity does not exist in com.bababuilds.menuminute, raised by LauncherActivity on startup. The missing component was added to android/app/src/main/AndroidManifest.xml, with its site-settings metadata and regression test, in PR #349. Before/after emulator test passed on fixed manifest in run #42805335697: Status: ok, no Java fatal exception. Final current-head CI and emulator checks are still running. Next release gate: merge only after CI passes, obtain higher-version signed AAB, upload new internal testing release, test on same physical device. The temporary Play listing name/icon are normal before app review and unrelated to this native crash. No credentials or keys changed.

  11. baba-dev commented on Nov 10, 2026

    @baba-dev
    OwnerAuthor

    Startup crash remediation merged via PR #349, main commit 3c6f95c59bd1b11ab29cef4a9c0060accbd16b5b. Root cause verified by real emulator crash stack: missing com.google.androidbrowserhelper.trusted.ManageDataLauncherActivity declaration. Fixed manifest, added version-controlled regression test and Android emulator startup smoke workflow. Corrected startup passed on clean Google Play API 35 emulator at run #42805745875, and all 19 PR CI jobs passed at run #42805745914. Native code and package ID unchanged except companion activity/management metadata; keys & DAL unaffected. Existing Play internal app remains broken until updated via a new signed AAB. Post-merge main CI run #42806438654 is in progress, after which automatic signing should produce a higher-version AAB. Next action: owner uploads updated AAB to Play internal track, waits for availability and verifies on same Android phone; do not promote broken code4 package.

  12. baba-dev commented on Nov 10, 2026

    @baba-dev
    OwnerAuthor

    P0 fixed and signed replacement ready. Merged PR #349 at 3c6f95c59bd1b11ab29cef4a9c0060accbd16b5b; exact-main CI #42806438654 passed 19/19. The original emulator captured a FATAL EXCEPTION because ManageDataLauncherActivity was absent from the manifest; fixed emulator passed with no Java fatal at #42805745875. Automatic signed release #42807375988 passed BUILD SUCCESSFUL and jar verified., produced com.bababuilds.menuminute, version 1.0.6, versionCode 7, artifact menuminute-android-signed-3c6f95c59bd1b11ab29cef4a9c0060accbd16b5b-6 (artifact ID 13760575549, signed AAB SHA256 8437ac6f4a2f0b014351575281c07ddc3f7ea7134e2c5eecff11370fd88a9aae). This is a signed candidate only, NOT uploaded to Play. Owner to create a NEW Internal Testing release using this AAB and verify Play-delivered update on same phone. Do not promote original versionCode 4.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions