Skip to content

Android: Capacitor shell + signed-release workflow + Play listing (Kam na mši) - #32

Merged
Chartres merged 1 commit into
mainfrom
claude/autoskola-signin-spacing-fyh0e4
Sep 12, 2026
Merged

Chartres merged 1 commit into
mainfrom
claude/autoskola-signin-spacing-fyh0e4

Conversation

@Chartres

Copy link
Copy Markdown
Owner

What

The Android version of Kam na mši, ready for Google Play:

  • android/ (Capacitor 8 shell, committed) with icons + splash generated from resources/, app name Kam na mši, and only the permissions the code uses (coarse/fine location on-device, POST_NOTIFICATIONS for reminders). Gradle reads versionName/versionCode from -P properties and signs the release only when the upload keystore is in the environment — unsigned otherwise, never a debug key.
  • .github/workflows/release-android.yml: tag android-vX.Y.Z → web build → cap sync → signed .aab + .apk → aapt2/apksigner read-back → GitHub Release → Play internal track when PLAY_SERVICE_ACCOUNT_JSON exists (ships dark and says so otherwise).
  • scripts/android-keystore.sh: one run creates the upload key and sets the four ANDROID_* secrets via gh.
  • ci.yml: new android job (assembleDebug) so the shell can't rot.
  • Store: docs/store/play-metadata.md (listing copy, data safety, content rating, declarations, the owner-only console steps), store-assets/android/ feature graphic 1024×500 + icon 512 (scripts/play-graphics.mjs), phone 1080×1920 device in store-shots.spec.ts, whatsnew-cs-CZ.

Why

Same app, same data, second store. The shell was already portable (ios-app.md §14); what was missing was the release path and the forms. Standard written up in flywheel PR #42 (android-app.md).

Proof

Local, with the Android 36 SDK: gradlew assembleDebug bundleRelease green (APK 6.5 MB, AAB 4.7 MB); aapt2 dump badging → label Kam na mši, versionName 1.2.0, versionCode 101, the intended permissions; a throwaway keystore signs assembleRelease and apksigner verify accepts it. npm run typecheck clean; both workflows parse. The android CI job on this PR is the runnable check.


  • Green CI (typecheck · test · build)
  • Tests added/updated — android CI gate; store-shots device
  • Portfolio record updated — when the Play listing goes live

🤖 Generated with Claude Code

https://claude.ai/code/session_01RicgHjbdeNb3ZGA6DMYMfS


Generated by Claude Code

…m na mši)

`npx cap add android` committed (icons/splash from resources/ via capacitor-
assets), app name "Kam na mši", only the permissions the code uses (coarse/
fine location on-device, POST_NOTIFICATIONS for reminders), gradle version +
signing from -P/env (unsigned when no keystore — never a debug key on a
release), capacitor.config android block.

release-android.yml: tag android-vX.Y.Z → web build → cap sync → signed .aab
+ .apk → aapt2/apksigner read-back → GitHub Release → Play internal track
when PLAY_SERVICE_ACCOUNT_JSON exists; ships dark and says so otherwise.
scripts/android-keystore.sh creates the upload key + sets the four secrets
in one run. ci.yml gains an `android` assembleDebug gate so the shell can't
rot. Store: docs/store/play-metadata.md (listing, data safety, content
rating, owner steps), feature graphic + 512 icon (scripts/play-graphics.mjs),
`phone` 1080×1920 device in store-shots.spec.ts, whatsnew text.

Verified locally with the Android 36 SDK: assembleDebug + bundleRelease
green; badging shows label 'Kam na mši', versionName 1.2.0, the intended
permissions; a throwaway keystore signs and apksigner verifies.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RicgHjbdeNb3ZGA6DMYMfS
@Chartres
Chartres merged commit 5b1fa94 into main Sep 12, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant