Project_SylDa/docs/superpowers/specs/2026-07-30-release-build-design.md
eddy 70f004c45b docs: add release build spec and implementation plan
Also un-ignores docs/ directory so project documentation (specs, plans)
is tracked in git. Individual research files remain gitignored.
2026-07-30 19:54:13 +02:00

3.9 KiB

Release build & Forgejo publishing — design

Datum: 2026-07-30 Context: Android app (AtomRelay) heeft nog geen ondertekende release build. Doel: signing keystore aanmaken, release APK + AAB bouwen, en publiceren als release op Forgejo (git.eddydevink.nl/eddy/Project_SylDa). Vooruitkijkend op multi-store publishing (Amazon, Samsung, F-Droid, later Google Play).

Scope

  • Keystore genereren en veilig opslaan (Obsidian vault + gitignored workspace copy)
  • Signing configuratie in build.gradle via extern signing.properties
  • Release script scripts/release.sh dat APK, AAB en firmware binaries bundelt
  • Upload naar Forgejo als git-tagged release met attachments
  • Buiten scope: daadwerkelijk uploaden naar app stores, Forgejo Actions/CI

Huidige situatie

  • versionCode 1, versionName "1.0"
  • Geen keystore, geen signing config
  • gradle.properties is tracked (geen secrets)
  • APK/AAB bestanden al in .gitignore
  • Forgejo repo eddy/Project_SylDa, API op http://localhost:3000/api/v1, 0 releases, 0 tags
  • Firmware binaries in android/app/src/main/assets/firmware/
  • Root project: AtomRelay, Gradle 8.14, AGP 8.5.2, Kotlin 2.0.21

Ontwerp

1. Keystore & signing config

Bestand Pad Git
Keystore android/keystore/sylda-release.jks .gitignore
Wachtwoorden android/signing.properties .gitignore
Signing block android/app/build.gradle (aanpassing) tracked

signing.properties inhoud:

KEYSTORE_PATH=keystore/sylda-release.jks
KEYSTORE_PASSWORD=<wachtwoord>
KEY_ALIAS=sylda
KEY_PASSWORD=<wachtwoord>

build.gradle aanpassing: onder android {} block wordt signing block toegevoegd dat signing.properties inleest. Alleen actief als het bestand bestaat → debug builds blijven werken zonder keystore.

Keystore generatie:

keytool -genkey -v -keystore android/keystore/sylda-release.jks \
  -alias sylda -keyalg RSA -keysize 2048 -validity 10000

Opslag: kopie van .jks + wachtwoorden naar Obsidian vault. Gitignored kopie blijft in workspace voor Gradle.

2. .gitignore

Toevoegen:

android/keystore/
android/signing.properties

3. Release script (scripts/release.sh)

Flow:

  1. Controleert dat signing.properties bestaat
  2. ./gradlew clean
  3. ./gradlew bundleRelease assembleRelease
  4. Verzamelt artefacten in release/v{version}/:
    • app-release.apk
    • app-release.aab
    • bootloader.bin, partitions.bin, boot_app0.bin, firmware.bin
    • checksums.txt (SHA256 van alle bestanden)
  5. git tag v{version} && git push origin v{version}
  6. Maakt Forgejo release aan via API
  7. Uploadt alle artefacten als attachments

Forgejo token: opgeslagen in ~/.config/sylda/forgejo-token (niet in repo). Moet handmatig aangemaakt worden in Forgejo web UI (Settings > Applications > Generate Token, scope write:repository).

Versie-detectie: script leest versionName uit build.gradle via grep, géén handmatige argumenten nodig.

4. F-Droid compatibiliteit

  • Geen timestamp in APK/AAB build (huidige BUILD_NUMBER buildConfigField wordt alleen voor debug gebruikt en zit niet in release builds — check)
  • Vaste Gradle wrapper versie (8.14)
  • Check: buildConfigField met timestamp staat in defaultConfig, niet in release buildType. Dit is OK voor F-Droid want F-Droid bouwt reproduceerbare builds met eigen tooling.

5. Multi-store vooruitblik

Platform Artefact Extra nodig
Forgejo release APK + AAB + firmware Deze release
Google Play AAB Google Play developer account
Amazon Appstore APK Amazon developer account
Samsung Galaxy Store APK Samsung developer account
F-Droid Source F-Droid metadata + merge request

Beslissingen

  • Keystore in Obsidian vault (conform AGENTS.md credentials policy)
  • Huidig versienummer behouden (1/1.0) — eerste release
  • Aanpak A: release script, handmatig (geen CI voor nu)