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-release-prepare.sh
scripts/ios-release-signing.mjs
apps/ios/fastlane/Fastfile
producematchWhen 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 iteratingpnpm ios:release:uploadCFBundleVersionThis 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.
App Review submission must remain manual. Automation may create/update the editable App Store version, upload screenshots, upload release notes, upload the App Review PDF attachment, and upload builds, but it should not upload the App Store Connect Notes field or submit a build for review.