From e2e9d3b1556351cad8e425bce746befca5593334 Mon Sep 17 00:00:00 2001 From: Cameron Date: Fri, 9 Oct 2026 19:08:00 +0000 Subject: [PATCH 1/2] fix(mobile): show build numbers beside app versions --- .github/fork-features.yml | 3 ++- apps/mobile/package.json | 1 + .../settings/SettingsAboutRouteScreen.tsx | 24 +++++++++++-------- pnpm-lock.yaml | 3 +++ 4 files changed, 20 insertions(+), 11 deletions(-) diff --git a/.github/fork-features.yml b/.github/fork-features.yml index df73ee194968..bdaa50cc8c04 100644 --- a/.github/fork-features.yml +++ b/.github/fork-features.yml @@ -1145,7 +1145,8 @@ features: - Linux desktop entries, SnapShot D-Bus names, the GNOME Shell extension, and the KDE and Hyprland capture helpers use styal identities (`build.styal.Styal`, `snap-shot@styal.build`, `styal-*-snap-shot`) so they cannot collide with an upstream T3 Code install. - Mobile production and preview profiles retain styal identity and fork Expo configuration; Android distribution uses installable APKs without store submission, while iOS submits to TestFlight. - Each finished production Android APK is published as a GitHub release tagged `android--`, created without claiming Latest from a stable `v` release, and only when its signing certificate matches the pinned production key; release notes contain installation guidance and APK checksums are attached as `SHA256SUMS`. - - Production Android installs offer the newest GitHub release once per release, and keep it in About styal, only when its runtime version differs from the installed binary's, because over-the-air updates cannot reach that install. + - Production Android installs offer the newest GitHub release once per release, and keep its download directly above Version in About styal, only when its runtime version differs from the installed binary's, because over-the-air updates cannot reach that install. + - Mobile About styal identifies the installed binary by its native version and build number on Android and iOS, retaining non-production variant labels. implementation_paths: - .github/scripts/publish-android-release.sh - .github/workflows/desktop-macos-preview.yml diff --git a/apps/mobile/package.json b/apps/mobile/package.json index d484862290c9..bab37d99a823 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -74,6 +74,7 @@ "diff": "8.0.3", "effect": "catalog:", "expo": "~57.0.18", + "expo-application": "~57.0.3", "expo-asset": "~57.0.15", "expo-audio": "57.0.4", "expo-auth-session": "~57.0.10", diff --git a/apps/mobile/src/features/settings/SettingsAboutRouteScreen.tsx b/apps/mobile/src/features/settings/SettingsAboutRouteScreen.tsx index d5bdae7825b2..1e906d8b75bb 100644 --- a/apps/mobile/src/features/settings/SettingsAboutRouteScreen.tsx +++ b/apps/mobile/src/features/settings/SettingsAboutRouteScreen.tsx @@ -1,4 +1,5 @@ import { ScreenScrollView as ScrollView } from "../../components/ScreenScrollView"; +import * as Application from "expo-application"; import Constants from "expo-constants"; import { useCallback, useEffect, useRef, useState } from "react"; import { Alert, Pressable, View } from "react-native"; @@ -45,12 +46,15 @@ function AppSettingsSection() { const hiddenUpdateTapCount = useRef(0); const nativeUpdate = useAvailableNativeAppUpdate(); - const version = Constants.expoConfig?.version ?? "0.0.0"; + const version = Application.nativeApplicationVersion ?? Constants.expoConfig?.version ?? "0.0.0"; + // EAS assigns build numbers remotely; read the installed binary rather than app.config. + const build = Application.nativeBuildVersion; + const versionWithBuild = build ? `${version} (${build})` : version; // Fall back to "production" to match resolveAppVariant in app.config.ts, so a // missing variant never mislabels a production build as development. const variant = (Constants.expoConfig?.extra?.appVariant as string | undefined) ?? "production"; const variantLabel = variant === "production" ? "" : capitalize(variant); - const versionLabel = variantLabel ? `${version} · ${variantLabel}` : version; + const versionLabel = variantLabel ? `${versionWithBuild} · ${variantLabel}` : versionWithBuild; const updateCheckAvailable = isAppUpdateCheckAvailable(); const busy = updateState === "checking" || updateState === "downloading" || updateState === "restarting"; @@ -126,14 +130,6 @@ function AppSettingsSection() { return ( - {nativeUpdate ? ( - void openNativeAppUpdateDownload(nativeUpdate)} - /> - ) : null} + {nativeUpdate ? ( + void openNativeAppUpdateDownload(nativeUpdate)} + /> + ) : null} {updateCheckAvailable ? ( Date: Fri, 9 Oct 2026 19:21:01 +0000 Subject: [PATCH 2/2] fix(mobile): place APK updates below the installed version --- .github/fork-features.yml | 2 +- .../settings/SettingsAboutRouteScreen.tsx | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/fork-features.yml b/.github/fork-features.yml index bdaa50cc8c04..ca9cee818412 100644 --- a/.github/fork-features.yml +++ b/.github/fork-features.yml @@ -1145,7 +1145,7 @@ features: - Linux desktop entries, SnapShot D-Bus names, the GNOME Shell extension, and the KDE and Hyprland capture helpers use styal identities (`build.styal.Styal`, `snap-shot@styal.build`, `styal-*-snap-shot`) so they cannot collide with an upstream T3 Code install. - Mobile production and preview profiles retain styal identity and fork Expo configuration; Android distribution uses installable APKs without store submission, while iOS submits to TestFlight. - Each finished production Android APK is published as a GitHub release tagged `android--`, created without claiming Latest from a stable `v` release, and only when its signing certificate matches the pinned production key; release notes contain installation guidance and APK checksums are attached as `SHA256SUMS`. - - Production Android installs offer the newest GitHub release once per release, and keep its download directly above Version in About styal, only when its runtime version differs from the installed binary's, because over-the-air updates cannot reach that install. + - Production Android installs offer the newest GitHub release once per release, and keep its download directly below Version in About styal, only when its runtime version differs from the installed binary's, because over-the-air updates cannot reach that install. - Mobile About styal identifies the installed binary by its native version and build number on Android and iOS, retaining non-production variant labels. implementation_paths: - .github/scripts/publish-android-release.sh diff --git a/apps/mobile/src/features/settings/SettingsAboutRouteScreen.tsx b/apps/mobile/src/features/settings/SettingsAboutRouteScreen.tsx index 1e906d8b75bb..4816663d2e6b 100644 --- a/apps/mobile/src/features/settings/SettingsAboutRouteScreen.tsx +++ b/apps/mobile/src/features/settings/SettingsAboutRouteScreen.tsx @@ -138,14 +138,6 @@ function AppSettingsSection() { target="SettingsOpenSourceLicenses" /> - {nativeUpdate ? ( - void openNativeAppUpdateDownload(nativeUpdate)} - /> - ) : null} {updateCheckAvailable ? ( void openNativeAppUpdateDownload(nativeUpdate)} + /> + ) : null} ); }