# 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: ```properties KEYSTORE_PATH=keystore/sylda-release.jks KEYSTORE_PASSWORD= KEY_ALIAS=sylda KEY_PASSWORD= ``` **`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:** ```bash 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)