mobile-release
Mobile Release
Perform a mobile release from dev, with an explicit release-mode decision before the bump.
The skill must recommend one of these modes, explain why, ask the user to confirm, and then write apps/mobile/release-plan.json before running the bump:
store: normal App Store / Google Play releaseota: OTA-only publish, no store builds
Do not recommend or write any other mode. The current implementation only supports store and ota.
The CI release flow is file-driven:
apps/mobile/release-plan.jsonis the editable plan ondevpnpm bumprunsapps/mobile/scripts/apply-release-config.ts- that script writes
apps/mobile/release.jsonfor the new version and resets the plan back to a safe default - GitHub Actions reads
apps/mobile/release.jsonafter merge to decide which pipelines to trigger
Pre-flight checks
- Confirm the current branch is
dev. If not, abort with a warning. - Run
git pull --rebasein the repo root. - Read:
apps/mobile/package.jsonapps/mobile/release-plan.json.github/workflows/tag.yml.github/workflows/publish-ota.yml
Step 1: Gather changes since last release
- Find the last mobile tag:
git tag --sort=-creatordate | grep -E '^mobile[@/]' | head -1 - If no tag exists, fall back to the last release commit subject:
git log --format="%H %s" | grep -Ei "^[a-f0-9]* release\\(mobile\\): release v" | head -1 | awk '{print $1}' - Collect commits since that point:
git log <last-tag-or-commit>..HEAD --oneline --no-merges - Collect changed files:
git diff --name-only <last-tag-or-commit>..HEAD - Categorize commits into:
Shiny new thingsImprovementsNo longer brokenThanks
Step 2: Recommend a release mode
Recommend store when:
- any native or binary-affecting paths changed, for example:
apps/mobile/ios/**apps/mobile/android/**apps/mobile/native/**apps/mobile/package.jsonapps/mobile/app.config.tsapps/mobile/app.config.base.tsapps/mobile/eas.jsonapps/mobile/ios/Folo/Info.plist.github/workflows/build-ios.yml.github/workflows/build-android.yml
- Expo / React Native / native dependency changes require a new binary
- permissions, entitlements, icons, splash, Firebase config, or build configuration changed
Recommend ota when:
- changes are limited to JS/TS/assets that the current binary can already run
- no native or runtime-affecting paths changed
- the goal is to ship without store review
Determine the target runtime
If recommending ota, derive the target store binary version from recent origin/mobile-main releases and propose it as the runtimeVersion.
If you cannot determine the runtime confidently, stop and ask the user to confirm it.
Confirmation gate
Present:
- the recommended mode
- rationale based on changed files and commits
- for
ota, the proposedruntimeVersion - for
ota, the proposedchannel
Wait for explicit user confirmation before continuing.
Step 3: Write the release plan file
Update apps/mobile/release-plan.json to match the confirmed mode.
Examples:
Store release
{
"mode": "store",
"runtimeVersion": null,
"channel": null
}
OTA release
{
"mode": "ota",
"runtimeVersion": "0.4.1",
"channel": "production"
}
Step 4: Update changelog
- Read
apps/mobile/changelog/next.md. - Present the categorized changes and draft changelog content.
- Wait for user confirmation or edits before writing.
- Write the final content to
apps/mobile/changelog/next.md.
Step 5: Commit pre-bump files before bump
nbump requires a clean working tree.
- Stage:
git add apps/mobile/changelog/next.md apps/mobile/release-plan.json - Commit:
git commit -m "docs(mobile): prepare release metadata" - If nothing changed, continue.
Step 6: Execute bump
- Verify the working tree is clean:
git status --short - Run:
cd apps/mobile && pnpm bump pnpm bumpwill:- apply changelog
- bump
package.json - update
ios/Folo/Info.plist - run
tsx scripts/apply-release-config.ts ${NEW_VERSION} - write
apps/mobile/release.json - reset
apps/mobile/release-plan.jsonback to the safe defaultstore - create the release branch
- push the branch
- open a PR to
mobile-main
Step 7: Verify and report
- Confirm the PR was created successfully.
- Read
apps/mobile/release.jsonon the release branch and report:- new version
- final release mode
- runtimeVersion and channel if present
- PR URL
- Summarize expected post-merge automation:
mode=store
- create mobile tag
- trigger preview Android build
- trigger production Android build
- trigger production iOS build
- no OTA publish
mode=ota
- create mobile tag
- trigger OTA publish only
- no store builds
References
- Bump config:
apps/mobile/bump.config.ts - Release plan:
apps/mobile/release-plan.json - Release config:
apps/mobile/release.json - Apply release config script:
apps/mobile/scripts/apply-release-config.ts - Changelog dir:
apps/mobile/changelog/ - Apply changelog script:
apps/mobile/scripts/apply-changelog.ts - Release config resolver:
.github/scripts/resolve-mobile-release-config.mjs - Tag orchestration:
.github/workflows/tag.yml - OTA publish workflow:
.github/workflows/publish-ota.yml - App config:
apps/mobile/app.config.ts - iOS Info.plist:
apps/mobile/ios/Folo/Info.plist
More from rssnext/folo
installing-mobile-preview-builds
Builds and installs the iOS preview build for apps/mobile using EAS local build and devicectl. Use when the user asks to install a preview/internal iOS build on a connected iPhone for production-like testing.
20update-deps
Update all dependencies across frontend and backend projects. Reads changelogs for breaking changes, checks affected code, runs tests, and provides a summary. Use when updating npm dependencies across the monorepo.
19mobile-self-test
Self-test a mobile feature change or bug fix after implementation in `apps/mobile`. Use this whenever the user asks to verify a mobile change, run simulator acceptance, smoke-test a mobile PR, or provide screenshot proof for a mobile fix. This skill decides between prod vs local API mode, starts the local follow-server when needed, builds a release app, uses Maestro only to bootstrap registration for non-auth work, then switches to screenshot-driven visual validation and returns screenshot evidence.
4desktop-release
Perform a regular desktop release from the dev branch. Gather changes since the last desktop tag, update the changelog, choose the desktop release mode in release-plan.json, bump the version, and prepare the release PR.
3mobile-e2e
Run apps/mobile Maestro end-to-end tests in this repo. Use when an agent needs to validate mobile auth flows on iOS Simulator or Android Emulator. Current maintained coverage is register, sign out, and sign in.
3