Part of #460. Depends on all of #461–#464 landing (or at least the flavors + foss impls).
Goal
Build both flavors in CI, publish the foss APK on GitHub Releases, and get the app into F-Droid.
How F-Droid actually works (so the plan is right)
- You don't upload an APK to F-Droid. You submit a metadata recipe to
fdroiddata; F-Droid's buildserver builds the foss flavor from a tagged source commit and signs it with F-Droid's key. The recipe specifies the flavor and scrubs any non-FOSS traces.
- Better path — reproducible builds: publish our own signed
foss APK on GitHub Releases and add the Binaries: + AllowedAPKSigningKeys directives. F-Droid builds from source, compares byte-for-byte against our published APK, and if they match ships our APK with our signature. Same signature means users can move between the GitHub APK and the F-Droid APK with no uninstall. This requires deterministic builds (extra work) but is the gold standard. (F-Droid reproducible builds)
Work
- Extend the release workflow (
.github/workflows/release.yml) to build both flavors on tag: a signed google APK (current distribution) and a signed foss APK, both as GitHub Release assets. The release notes should distinguish the two.
- Author the
fdroiddata metadata recipe: Builds block targeting the foss flavor, correct versionName/versionCode, scanner-clean (no bundled binaries / non-FOSS deps).
- Pursue the reproducible-builds path: make the
foss release build deterministic, add Binaries: + AllowedAPKSigningKeys, and verify with diffoscope against our published APK.
- Document the dual-distribution story in
docs/ (which flavor ships where, how a user picks, signature implications).
Acceptance
- Tagging a release produces both a
google AAB and a signed foss APK as artifacts.
- A documented, scanner-clean
fdroiddata recipe builds the foss flavor from source.
- Reproducible-build verification passes (or a tracked list of the remaining non-determinism blockers if it doesn't on first attempt).
Note
This ticket is mostly CI + packaging + external-metadata authoring; the actual F-Droid submission/merge into fdroiddata is a manual step the user performs (separate repo).
Part of #460. Depends on all of #461–#464 landing (or at least the flavors + foss impls).
Goal
Build both flavors in CI, publish the
fossAPK on GitHub Releases, and get the app into F-Droid.How F-Droid actually works (so the plan is right)
fdroiddata; F-Droid's buildserver builds thefossflavor from a tagged source commit and signs it with F-Droid's key. The recipe specifies the flavor and scrubs any non-FOSS traces.fossAPK on GitHub Releases and add theBinaries:+AllowedAPKSigningKeysdirectives. F-Droid builds from source, compares byte-for-byte against our published APK, and if they match ships our APK with our signature. Same signature means users can move between the GitHub APK and the F-Droid APK with no uninstall. This requires deterministic builds (extra work) but is the gold standard. (F-Droid reproducible builds)Work
.github/workflows/release.yml) to build both flavors on tag: a signedgoogleAPK (current distribution) and a signedfossAPK, both as GitHub Release assets. The release notes should distinguish the two.fdroiddatametadata recipe:Buildsblock targeting thefossflavor, correctversionName/versionCode, scanner-clean (no bundled binaries / non-FOSS deps).fossrelease build deterministic, addBinaries:+AllowedAPKSigningKeys, and verify withdiffoscopeagainst our published APK.docs/(which flavor ships where, how a user picks, signature implications).Acceptance
googleAAB and a signedfossAPK as artifacts.fdroiddatarecipe builds thefossflavor from source.Note
This ticket is mostly CI + packaging + external-metadata authoring; the actual F-Droid submission/merge into
fdroiddatais a manual step the user performs (separate repo).