From d5875df3f14bb55fec6e084814a92e2522072903 Mon Sep 17 00:00:00 2001 From: DIYgod Date: Tue, 12 May 2026 17:28:05 +0800 Subject: [PATCH 1/5] release(desktop): release v1.8.0 --- apps/desktop/changelog/1.8.0.md | 13 +++++++++++++ apps/desktop/changelog/next.md | 10 ++++------ apps/desktop/package.json | 6 +++--- apps/desktop/release.json | 2 +- 4 files changed, 21 insertions(+), 10 deletions(-) create mode 100644 apps/desktop/changelog/1.8.0.md diff --git a/apps/desktop/changelog/1.8.0.md b/apps/desktop/changelog/1.8.0.md new file mode 100644 index 000000000..210bba08f --- /dev/null +++ b/apps/desktop/changelog/1.8.0.md @@ -0,0 +1,13 @@ +# What's new in v1.8.0 + +## Shiny new things + +- Added an Eagle action to image context menus + +## No longer broken + +- Fixed tray menu refreshes losing the active tray instance +- Fixed desktop auth cookies missing max-age persistence +- Fixed unavailable AI summaries breaking summary state +- Fixed final entries and mark-read footers near the end of entry lists +- Delayed feed error indicators to avoid premature error states diff --git a/apps/desktop/changelog/next.md b/apps/desktop/changelog/next.md index 5e470c50a..8f5eac449 100644 --- a/apps/desktop/changelog/next.md +++ b/apps/desktop/changelog/next.md @@ -2,12 +2,10 @@ ## Shiny new things -- Added an Eagle action to image context menus +## Improvements ## No longer broken -- Fixed tray menu refreshes losing the active tray instance -- Fixed desktop auth cookies missing max-age persistence -- Fixed unavailable AI summaries breaking summary state -- Fixed final entries and mark-read footers near the end of entry lists -- Delayed feed error indicators to avoid premature error states +## Thanks + +Special thanks to volunteer contributors @ for their valuable contributions diff --git a/apps/desktop/package.json b/apps/desktop/package.json index 4aca618c1..64bee6f9e 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -1,7 +1,7 @@ { "name": "Folo", "type": "module", - "version": "1.7.0", + "version": "1.8.0", "private": true, "description": "Follow everything in one place", "author": "Folo Team", @@ -96,7 +96,7 @@ "vite-plugin-route-builder": "0.4.1", "vite-tsconfig-paths": "6.1.1" }, - "runtimeVersion": "1.7.0", + "runtimeVersion": "1.8.0", "productName": "Folo", - "mainHash": "524fdb3b17478aa5705bc86d0a1550b322c58e1605f1cd28acbf88dbdbb18629" + "mainHash": "a8b359bbef0d2c49abfae0524d5f13ac5aee26a4b60d0691cca9e9ccc3caddcf" } diff --git a/apps/desktop/release.json b/apps/desktop/release.json index f758894c7..baaa57b92 100644 --- a/apps/desktop/release.json +++ b/apps/desktop/release.json @@ -1,5 +1,5 @@ { - "version": "1.7.0", + "version": "1.8.0", "mode": "build", "runtimeVersion": null, "channel": null From a577dee7dce4ca290ad6b47743d9060e11639b17 Mon Sep 17 00:00:00 2001 From: DIYgod Date: Wed, 13 May 2026 11:27:23 +0800 Subject: [PATCH 2/5] fix(ota): include Expo config in manifests --- apps/ota/src/__tests__/manifest.test.ts | 35 ++++++++++ apps/ota/src/lib/manifest.ts | 92 ++++++++++++++++++++++++- 2 files changed, 124 insertions(+), 3 deletions(-) diff --git a/apps/ota/src/__tests__/manifest.test.ts b/apps/ota/src/__tests__/manifest.test.ts index 2653162f3..e6307c958 100644 --- a/apps/ota/src/__tests__/manifest.test.ts +++ b/apps/ota/src/__tests__/manifest.test.ts @@ -85,6 +85,41 @@ describe("buildManifest", () => { expect(first.id).toBe(second.id) }) + + it("includes the embedded Expo config needed by expo-constants after an OTA launch", () => { + const manifest = buildManifest(createRelease(), { + origin: "https://ota.folo.is", + platform: "ios", + }) + + expect(manifest.extra).toMatchObject({ + expoClient: { + name: "Folo", + slug: "follow", + owner: "follow", + scheme: ["follow", "folo"], + version: "0.4.2", + runtimeVersion: "0.4.1", + updates: { + url: "https://ota.folo.is/manifest", + requestHeaders: { + "expo-channel-name": "production", + }, + }, + ios: { + bundleIdentifier: "is.follow", + }, + android: { + package: "is.follow", + }, + extra: { + eas: { + projectId: "a6335b14-fb84-45aa-ba80-6f6ab8926920", + }, + }, + }, + }) + }) }) describe("/manifest", () => { diff --git a/apps/ota/src/lib/manifest.ts b/apps/ota/src/lib/manifest.ts index 866201017..1b47972d7 100644 --- a/apps/ota/src/lib/manifest.ts +++ b/apps/ota/src/lib/manifest.ts @@ -5,6 +5,43 @@ import type { OtaPlatform, OtaPlatformPayload, OtaProjectedPlatforms, OtaRelease type PlatformPayload = OtaPlatformPayload type PlatformAsset = PlatformPayload["launchAsset"] | PlatformPayload["assets"][number] +type MobileExpoClientConfig = { + name: string + slug: string + owner: string + version: string + runtimeVersion: string + orientation: "portrait" + scheme: string[] + userInterfaceStyle: "automatic" + updates: { + url: string + requestHeaders: { + "expo-channel-name": string + } + codeSigningMetadata: { + keyid: string + alg: string + } + checkAutomatically: "NEVER" + } + ios: { + bundleIdentifier: string + supportsTablet: boolean + usesAppleSignIn: boolean + } + android: { + package: string + } + extra: { + eas: { + projectId: string + } + } +} + +const MOBILE_UPDATE_URL = "https://ota.folo.is/manifest" +const MOBILE_EAS_PROJECT_ID = "a6335b14-fb84-45aa-ba80-6f6ab8926920" export interface ManifestAsset { key: string @@ -26,6 +63,7 @@ export interface OtaManifest { } extra: { product: OtaRelease["product"] + expoClient?: MobileExpoClientConfig } } @@ -62,9 +100,7 @@ export function buildManifest( channel: release.channel, releaseVersion: release.releaseVersion, }, - extra: { - product: release.product, - }, + extra: buildManifestExtra(release), } } @@ -142,6 +178,56 @@ function toExpoAssetIdentity(path: string, contentType: string) { } } +function buildManifestExtra(release: OtaRelease): OtaManifest["extra"] { + const extra: OtaManifest["extra"] = { + product: release.product, + } + + if (release.product === "mobile") { + // Expo Updates hydrates Constants.expoConfig from extra.expoClient after an OTA launch. + extra.expoClient = buildMobileExpoClientConfig(release) + } + + return extra +} + +function buildMobileExpoClientConfig(release: Extract) { + return { + name: "Folo", + slug: "follow", + owner: "follow", + version: release.releaseVersion, + runtimeVersion: release.runtimeVersion, + orientation: "portrait", + scheme: ["follow", "folo"], + userInterfaceStyle: "automatic", + updates: { + url: MOBILE_UPDATE_URL, + requestHeaders: { + "expo-channel-name": release.channel, + }, + codeSigningMetadata: { + keyid: "main", + alg: "rsa-v1_5-sha256", + }, + checkAutomatically: "NEVER", + }, + ios: { + bundleIdentifier: "is.follow", + supportsTablet: true, + usesAppleSignIn: true, + }, + android: { + package: "is.follow", + }, + extra: { + eas: { + projectId: MOBILE_EAS_PROJECT_ID, + }, + }, + } satisfies MobileExpoClientConfig +} + function inferExtensionFromContentType(contentType: string) { switch (contentType) { case "application/javascript": { From be3d4c58db2a23a692c1134197c8c2ebeba7774a Mon Sep 17 00:00:00 2001 From: DIYgod Date: Wed, 13 May 2026 12:01:36 +0800 Subject: [PATCH 3/5] docs(mobile): prepare release metadata --- apps/mobile/release-plan.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/mobile/release-plan.json b/apps/mobile/release-plan.json index 0a4e0fb6f..74637e871 100644 --- a/apps/mobile/release-plan.json +++ b/apps/mobile/release-plan.json @@ -1,5 +1,5 @@ { - "mode": "store", - "runtimeVersion": null, - "channel": null + "mode": "ota", + "runtimeVersion": "0.5.0", + "channel": "production" } From 79d2684cf867c54abf548dcc8a83ce82b3251419 Mon Sep 17 00:00:00 2001 From: DIYgod Date: Wed, 13 May 2026 12:02:11 +0800 Subject: [PATCH 4/5] release(mobile): release v0.5.3 --- apps/mobile/changelog/0.5.3.md | 11 +++++++++++ apps/mobile/ios/Folo/Info.plist | 4 ++-- apps/mobile/package.json | 2 +- apps/mobile/release-plan.json | 6 +++--- apps/mobile/release.json | 2 +- 5 files changed, 18 insertions(+), 7 deletions(-) create mode 100644 apps/mobile/changelog/0.5.3.md diff --git a/apps/mobile/changelog/0.5.3.md b/apps/mobile/changelog/0.5.3.md new file mode 100644 index 000000000..c8e24f30d --- /dev/null +++ b/apps/mobile/changelog/0.5.3.md @@ -0,0 +1,11 @@ +# What's New in v0.5.3 + +## Shiny new things + +## Improvements + +## No longer broken + +## Thanks + +Special thanks to volunteer contributors @ for their valuable contributions diff --git a/apps/mobile/ios/Folo/Info.plist b/apps/mobile/ios/Folo/Info.plist index f2d0c36e9..9c849eaa5 100644 --- a/apps/mobile/ios/Folo/Info.plist +++ b/apps/mobile/ios/Folo/Info.plist @@ -33,7 +33,7 @@ CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString - 0.5.2 + 0.5.3 CFBundleSignature ???? CFBundleURLTypes @@ -54,7 +54,7 @@ CFBundleVersion - 5 + 6 ITSAppUsesNonExemptEncryption LSApplicationCategoryType diff --git a/apps/mobile/package.json b/apps/mobile/package.json index d3a3aac83..d439ab9e3 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -1,6 +1,6 @@ { "name": "@follow/mobile", - "version": "0.5.2", + "version": "0.5.3", "private": true, "main": "src/main.tsx", "scripts": { diff --git a/apps/mobile/release-plan.json b/apps/mobile/release-plan.json index 74637e871..0a4e0fb6f 100644 --- a/apps/mobile/release-plan.json +++ b/apps/mobile/release-plan.json @@ -1,5 +1,5 @@ { - "mode": "ota", - "runtimeVersion": "0.5.0", - "channel": "production" + "mode": "store", + "runtimeVersion": null, + "channel": null } diff --git a/apps/mobile/release.json b/apps/mobile/release.json index 2e6f3e8e2..60ae1b255 100644 --- a/apps/mobile/release.json +++ b/apps/mobile/release.json @@ -1,5 +1,5 @@ { - "version": "0.5.2", + "version": "0.5.3", "mode": "ota", "runtimeVersion": "0.5.0", "channel": "production" From 0d0fd9fd4943bb5610215cdf39932b298d138478 Mon Sep 17 00:00:00 2001 From: DIYgod Date: Wed, 13 May 2026 12:05:03 +0800 Subject: [PATCH 5/5] chore(mobile): keep release pr mobile-only --- apps/desktop/changelog/1.8.0.md | 13 ------------- apps/desktop/package.json | 6 +++--- apps/desktop/release.json | 2 +- 3 files changed, 4 insertions(+), 17 deletions(-) delete mode 100644 apps/desktop/changelog/1.8.0.md diff --git a/apps/desktop/changelog/1.8.0.md b/apps/desktop/changelog/1.8.0.md deleted file mode 100644 index 210bba08f..000000000 --- a/apps/desktop/changelog/1.8.0.md +++ /dev/null @@ -1,13 +0,0 @@ -# What's new in v1.8.0 - -## Shiny new things - -- Added an Eagle action to image context menus - -## No longer broken - -- Fixed tray menu refreshes losing the active tray instance -- Fixed desktop auth cookies missing max-age persistence -- Fixed unavailable AI summaries breaking summary state -- Fixed final entries and mark-read footers near the end of entry lists -- Delayed feed error indicators to avoid premature error states diff --git a/apps/desktop/package.json b/apps/desktop/package.json index 64bee6f9e..4aca618c1 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -1,7 +1,7 @@ { "name": "Folo", "type": "module", - "version": "1.8.0", + "version": "1.7.0", "private": true, "description": "Follow everything in one place", "author": "Folo Team", @@ -96,7 +96,7 @@ "vite-plugin-route-builder": "0.4.1", "vite-tsconfig-paths": "6.1.1" }, - "runtimeVersion": "1.8.0", + "runtimeVersion": "1.7.0", "productName": "Folo", - "mainHash": "a8b359bbef0d2c49abfae0524d5f13ac5aee26a4b60d0691cca9e9ccc3caddcf" + "mainHash": "524fdb3b17478aa5705bc86d0a1550b322c58e1605f1cd28acbf88dbdbb18629" } diff --git a/apps/desktop/release.json b/apps/desktop/release.json index baaa57b92..f758894c7 100644 --- a/apps/desktop/release.json +++ b/apps/desktop/release.json @@ -1,5 +1,5 @@ { - "version": "1.8.0", + "version": "1.7.0", "mode": "build", "runtimeVersion": null, "channel": null