Use this as the source of truth for public releases.
A tag is release-ready only when all of the following are true:
npm testpasses on the exact commit being tagged- CI is green
- the APK is built from a clean working tree
- runtime evidence required by RUNTIME-VERIFICATION.md is attached or linked
- release signing secrets are configured
- the release keystore has not been rotated in a way that breaks Android upgrade continuity
- no TLS keys, certificates,
.envfiles, or generated release artifacts are tracked in git
Run these from the repository root:
npm ci
npm testThen verify:
package.jsonversion is finalREADME.md,SECURITY.md, and release-facing docs still match the product- screenshots and showcase notes are current enough for the release you are about to publish
- the release keystore still matches the signing identity used for the previous public APK if you want users to update in place
- if you are recovering from an accidental signing-key change, both the previous and current signing keys are still available so a rotated release can be produced
- Tag the exact release commit with the matching version, for example
v1.1.0. - Push the tag.
- Let
.github/workflows/release.ymlbuild the signed APK and checksum. - Open or update a runtime evidence record using docs/evidence/RELEASE-EVIDENCE-TEMPLATE.md or the
Runtime evidenceissue form. - Review the generated GitHub Release before sharing it publicly.
If a previous public APK was signed with a different key, Android will block direct upgrades until you either go back to the original key or publish a rotated release with a valid signing lineage.
To recover continuity for a future release, configure the normal release secrets plus these optional secrets:
APK_OLD_KEYSTORE_BASE64APK_OLD_KEYSTORE_PASSWORDAPK_OLD_KEY_ALIASAPK_OLD_KEY_PASSWORDAPK_SIGNING_LINEAGE_BASE64if you already have a lineage file to extendAPK_ROTATION_MIN_SDK_VERSIONif you need to override the default28
This recovery path is only possible while the old private key still exists. If the old key is gone, there is no safe way to make Android accept an in-place upgrade from the mismatched public release.
Every public release should include:
- a one-paragraph summary of what changed
- a short
Tested onnote with device, Android, WebView, and T3 Code versions - a link to the runtime evidence record for that tag
- any known limitations that still matter to new users or contributors
Do not ship if any of these happen:
- the tag does not match
package.json npm testfails- signing falls back to a development keystore
- the release keystore changed unintentionally and would break APK upgrade continuity
- you need signing continuity recovery but do not have access to the previous release key
- runtime evidence is missing for Android- or proxy-affecting changes
- the repo contains tracked secrets or generated release artifacts