Overview
Wire Android uses a fully automated release notes pipeline that:- Stores version-specific release note files alongside source code.
- Validates and prepares them during CI/CD before each Play Store deployment.
- Displays them to users inside the app via the What’s New screen.
File Structure
Release notes live inapp/src/main/play/release-notes/, organized by BCP 47 language tag:
Version-specific files
Each release gets its own file named<version>.txt, for example 4.19.0.txt. The version string must exactly match the versionName constant in build-logic/plugins/src/main/kotlin/AndroidCoordinates.kt.
Example content of app/src/main/play/release-notes/en-US/4.19.0.txt:
Play Store enforces a 500 character limit on release notes. The CI script validates this and blocks deployment if any language file exceeds the limit.
Localized release notes
Currently, two languages are actively managed by the automated pipeline:en-US— English (United States)de-DE— German (Germany)
listings/ directory (used for the full Play Store store listing, not release notes) additionally includes ru-RU. To add a new language to the release notes pipeline, create the language directory under release-notes/ and update the LANGUAGES array in scripts/prepare-release-notes.sh.
Release Notes Preparation Script
scripts/prepare-release-notes.sh is the core automation script. It runs as part of every deployment CI workflow.
What it does
Extract version
Reads the
versionName constant from build-logic/plugins/src/main/kotlin/AndroidCoordinates.kt using a grep/sed pipeline. Fails immediately if the file is missing or the version cannot be parsed.Locate version-specific files
For each language in
["en-US", "de-DE"], looks for app/src/main/play/release-notes/<lang>/<version>.txt. Warns (does not fail) if the language directory is missing. Fails with an error if neither the version-specific file nor a default.txt fallback exists.Copy to default.txt
Copies
<version>.txt to default.txt in the same directory. This is the filename that the Google Play deployment tooling reads.Validate character count
Uses Python 3 to count the exact character length of each
default.txt. Exits with a non-zero code if any file exceeds 500 characters, blocking deployment.Running locally
echo flag behavior) and is safe to run locally before committing new release notes.
Example output
Play Store Changelog Generator
scripts/generate_whatsnew_notes.py is a Python script used to generate per-language What’s New files in the format expected by certain deployment tools (e.g. Fastlane Supply’s whatsnew-<lang> convention).
How it works
- Walks the
app/src/main/play/release-notes/directory tree. - For each language subdirectory, identifies all files matching
X.Y.Z.txt. - Sorts them using semantic version ordering (
1.12.5>1.9.0). - Copies the highest-versioned file to
build/whatsnew/whatsnew-<lang>.
Running the script
GITHUB_WORKSPACE environment variable is respected for CI use; it defaults to the repository root.
CI/CD Integration
The release notes preparation script is integrated into the following deployment workflows:| Workflow | When it runs |
|---|---|
build-production.yml | On GitHub Release published (full prod + F-Droid deployment) |
build-main-push.yml | On push to main (beta deployment) |
build-develop-push.yml | On push to develop (internal deployment) |
deploy.yml | General deployment workflow called by others |
Creating Release Notes for a New Version
Determine the version string
Check
build-logic/plugins/src/main/kotlin/AndroidCoordinates.kt for the versionName value. For example: 4.20.0.What’s New In-App Screen
Users can read release notes directly inside the app via the What’s New screen, accessible from the home navigation. The screen is implemented inapp/src/main/kotlin/com/wire/android/ui/home/whatsnew/.
Architecture
| File | Role |
|---|---|
WhatsNewViewModel.kt | Fetches and parses the RSS feed at the URL defined by R.string.url_android_release_notes_feed |
WhatsNewState.kt | UI state holder (loading flag + list of ReleaseNotesItem) |
WhatsNewItem.kt | Sealed class defining the three item types: WelcomeToNewAndroidApp, AllAndroidReleaseNotes, and AndroidReleaseNotes |
WhatsNewScreen.kt | Composable screen that renders the item list |
How it works
TheWhatsNewViewModel fetches an RSS feed URL from string resources using RssParser. Each feed item is mapped to a ReleaseNotesItem containing:
id— the item’s GUID from the RSS feedtitle— release version or headlinelink— URL to the full release notes web pagepublishDate— formatted display date
AndroidReleaseNotesDestination within the app.
Feature flag
The release notes section is gated by theSHOULD_DISPLAY_RELEASE_NOTES build config flag. This is set per flavor in default.json (the top-level should_display_release_notes key defaults to true):
Navigation items
Welcome to new Android app
A static item (always shown when
SHOULD_DISPLAY_RELEASE_NOTES = true) that links to an onboarding screen highlighting the current app’s features compared to the legacy Wire Android app.Android Release Notes (RSS)
Dynamic items loaded from the RSS feed. Each entry links to the full release notes for that version. A permanent “All Android Release Notes” entry at the bottom links to the full release history.