apps/ios/VERSIONING.md
OpenClaw iOS uses a pinned CalVer release version instead of reading the current gateway version automatically on every build.
CFBundleVersion during normal TestFlight iterationThe pinned iOS release version lives in apps/ios/version.json.
Supported pinned format:
YYYY.M.DExamples:
2026.4.62026.4.10The root gateway version in package.json may still be one of:
YYYY.M.DYYYY.M.D-beta.NYYYY.M.D-NWhen you pin iOS from the gateway version, the iOS tooling strips the gateway suffix and keeps only the base CalVer.
Examples:
2026.4.10 -> iOS 2026.4.102026.4.10-beta.3 -> iOS 2026.4.102026.4.10-2 -> iOS 2026.4.10Pinned iOS version 2026.4.10 maps to:
CFBundleShortVersionString = 2026.4.10CFBundleVersion = numeric build number onlyCFBundleShortVersionString stays fixed for a TestFlight train until you intentionally pin a newer iOS release version.
apps/ios/version.json
apps/ios/CHANGELOG.md
apps/ios/VERSIONING.md
apps/ios/Config/Version.xcconfig
apps/ios/version.jsonapps/ios/fastlane/metadata/en-US/release_notes.txt
apps/ios/CHANGELOG.mdapps/ios/build/Version.xcconfig
scripts/lib/ios-version.ts
scripts/ios-version.ts
scripts/ios-sync-versioning.ts
scripts/ios-pin-version.ts
scripts/ios-write-version-xcconfig.sh
apps/ios/build/Version.xcconfigscripts/ios-beta-prepare.sh
apps/ios/fastlane/Fastfile
When generating apps/ios/fastlane/metadata/en-US/release_notes.txt, the tooling reads the first available changelog section in this order:
## 2026.4.10## UnreleasedRecommended workflow:
## Unreleased## <pinned version> and run sync againpnpm ios:version
pnpm ios:version:check
pnpm ios:version:sync
pnpm ios:version:pin -- --from-gateway
pnpm ios:version:pin -- --version 2026.4.10
apps/ios/version.json pinned to the current TestFlight train versionapps/ios/CHANGELOG.md under ## Unreleased while iteratingCFBundleVersionThis keeps the TestFlight version stable while review is in flight.
When you want the next production iOS release to align with the current gateway release:
pnpm ios:version:pin -- --from-gateway
apps/ios/version.jsonapps/ios/Config/Version.xcconfigapps/ios/fastlane/metadata/en-US/release_notes.txtapps/ios/CHANGELOG.md for the new release if neededpnpm ios:version:sync again if the changelog changedFastlane and Xcode should consume only the pinned iOS version from apps/ios/version.json.
Changing package.json.version alone must not change the iOS app version until a maintainer explicitly runs the pin step.