Skip to main content

Overview

Wire Android uses a fully automated release notes pipeline that:
  1. Stores version-specific release note files alongside source code.
  2. Validates and prepares them during CI/CD before each Play Store deployment.
  3. Displays them to users inside the app via the What’s New screen.
The system is documented in the project’s Architecture Decision Records and implemented across three components: a directory of text files, a shell preparation script, and a Python helper script.

File Structure

Release notes live in app/src/main/play/release-notes/, organized by BCP 47 language tag:
app/src/main/play/
├── contact-email.txt
├── contact-website.txt
├── listings/
│   ├── en-US/
│   │   ├── title.txt
│   │   ├── short-description.txt
│   │   ├── full-description.txt
│   │   ├── video-url.txt
│   │   └── graphics/
│   └── ru-RU/
│       └── ...
└── release-notes/
    ├── en-US/
    │   ├── 4.16.0.txt    ← version-specific
    │   ├── 4.17.0.txt
    │   ├── 4.17.1.txt
    │   ├── 4.18.0.txt
    │   ├── 4.19.0.txt
    │   └── default.txt   ← auto-generated by CI
    └── de-DE/
        ├── 4.16.0.txt
        ├── 4.17.0.txt
        ├── 4.17.1.txt
        ├── 4.18.0.txt
        ├── 4.19.0.txt
        └── default.txt   ← auto-generated by CI
default.txt files are auto-generated by the prepare-release-notes.sh script during CI. Do not edit them manually — your changes will be overwritten on the next deployment run.

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:
New
- Wire Drive feature:
 • Share multiple files plus text message
 • Let your team collaborate and edit documents
 • Stay organized with folders and tags
 • Find all files in Drive
- Ringtone for incoming calls
- Access debug settings by shaking the phone

Fixes
- Some notifications were not received
- Crash when changing profile color on tablets
- Decryption errors
- Incorrect missed call indicators
- Video appeared rotated in landscape mode
- Speaker button shown as on when rejoining a call
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)
The 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

1

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.
2

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.
3

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.
4

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.
5

Print preview

Prints a colour-coded summary and a full preview of the release notes that will be deployed, providing visibility in CI logs.

Running locally

bash scripts/prepare-release-notes.sh
The script detects macOS vs Linux automatically (different echo flag behavior) and is safe to run locally before committing new release notes.

Example output

=== Wire Android Release Notes Preparation ===

Detected version: 4.19.0

Processing en-US...
✓ Found version-specific release notes: 4.19.0.txt
  Copied 4.19.0.txt to default.txt

Processing de-DE...
✓ Found version-specific release notes: 4.19.0.txt
  Copied 4.19.0.txt to default.txt

=== Validating Character Counts ===
[en-US] Character count: 312/500
✓ PASSED: 188 characters remaining

[de-DE] Character count: 287/500
✓ PASSED: 213 characters remaining

=== Summary ===
✓ Using version-specific release notes for version 4.19.0

Release notes preparation completed successfully!

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

# For each language directory under app/src/main/play/release-notes/,
# find all files matching the semver pattern (e.g. 4.17.0.txt)
# and copy the LATEST one to build/whatsnew/whatsnew-<lang>

SEMVER_PATTERN = re.compile(r'^\d+\.\d+\.\d+\.txt$')
The script:
  1. Walks the app/src/main/play/release-notes/ directory tree.
  2. For each language subdirectory, identifies all files matching X.Y.Z.txt.
  3. Sorts them using semantic version ordering (1.12.5 > 1.9.0).
  4. Copies the highest-versioned file to build/whatsnew/whatsnew-<lang>.

Running the script

python3 scripts/generate_whatsnew_notes.py
# Output: build/whatsnew/whatsnew-en-US, build/whatsnew/whatsnew-de-DE
The 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:
WorkflowWhen it runs
build-production.ymlOn GitHub Release published (full prod + F-Droid deployment)
build-main-push.ymlOn push to main (beta deployment)
build-develop-push.ymlOn push to develop (internal deployment)
deploy.ymlGeneral deployment workflow called by others
In all cases, the script runs before the Google Play upload step. A validation failure exits the workflow with a non-zero code, preventing a release with missing or oversized release notes from reaching the Play Store.

Creating Release Notes for a New Version

1

Determine the version string

Check build-logic/plugins/src/main/kotlin/AndroidCoordinates.kt for the versionName value. For example: 4.20.0.
2

Create version-specific files

Create <version>.txt files for each active language:
touch app/src/main/play/release-notes/en-US/4.20.0.txt
touch app/src/main/play/release-notes/de-DE/4.20.0.txt
3

Write and validate content

Edit each file. Keep content under 500 characters. Validate locally:
bash scripts/prepare-release-notes.sh
4

Commit alongside the version bump

Commit the new .txt files together with the AndroidCoordinates.kt version bump so the file names always match the deployed version.

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 in app/src/main/kotlin/com/wire/android/ui/home/whatsnew/.

Architecture

FileRole
WhatsNewViewModel.ktFetches and parses the RSS feed at the URL defined by R.string.url_android_release_notes_feed
WhatsNewState.ktUI state holder (loading flag + list of ReleaseNotesItem)
WhatsNewItem.ktSealed class defining the three item types: WelcomeToNewAndroidApp, AllAndroidReleaseNotes, and AndroidReleaseNotes
WhatsNewScreen.ktComposable screen that renders the item list

How it works

The WhatsNewViewModel 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 feed
  • title — release version or headline
  • link — URL to the full release notes web page
  • publishDate — formatted display date
Items with blank title, link, or date are filtered out. Tapping an item opens the linked URL in the external browser or navigates to the AndroidReleaseNotesDestination within the app.

Feature flag

The release notes section is gated by the SHOULD_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):
// WhatsNewScreen.kt
if (BuildConfig.SHOULD_DISPLAY_RELEASE_NOTES) {
    // Show WelcomeToNewAndroidApp item and RSS feed items
}
During loading, the screen displays four shimmer placeholder items to avoid layout shift.

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.

Build docs developers (and LLMs) love