Course contents
Capstone: ship your app to TestFlight and Google Play internal testing
Take the app you built in this course from a clean repo to installable builds on testers' phones, on both platforms, with Codex doing the work and you holding the checklist.
This is where the course comes together. You have an Expo SDK 58 app with navigation, Supabase auth, push, purchases and native features. Now you'll put it in the hands of real testers on both platforms. Pick the track for the platform you can reach first; the other platform comes at the end of each track. Expect waiting: builds queue, Apple processes uploads, and Google's closed test, if your account needs one, takes two weeks.
Costs as of November 2026: Apple's Developer Program is 99 USD a year, Google Play registration is a one-time US$25, and Expo's Free plan includes 15 iOS and 15 Android builds a month.
Brief Codex for the release
Start a fresh Codex session in Ask for approval mode with the Expo plugin installed, and give it the whole release as one goal with checkpoints. The $eas-app-stores skill covers eas.json, signing, versions and submissions, and the Expo MCP tools let Codex read build logs and TestFlight feedback instead of asking you to paste them.
Use $eas-app-stores. Goal: get Tipjar onto TestFlight internal testing and Google Play internal testing.
Stop and ask me before every eas build and eas submit, and before anything that costs money.
1. Run npx tsc --noEmit, npm test and npx expo-doctor; fix what fails.
2. Check app.json: name, version, ios.bundleIdentifier, android.package, permission strings.
3. Check eas.json production profiles and submit profiles.
4. Then follow my track's steps. After each build, read its logs with the Expo MCP tools and summarize.Freeze and check the release commit
Have Codex run the checks and fix failures, then commit and tag the release.
bashnpx tsc --noEmit && npm test && npx expo-doctorVerifyAll three pass, andgit statusis clean on a tagged commit.Lock the app's identity
Set
ios.bundleIdentifier(for examplecom.yourname.tipjar) andversionin app.json. Let EAS manage build numbers so every upload is unique.json{ "expo": { "version": "1.0.0", "ios": { "bundleIdentifier": "com.yourname.tipjar" } } }Verifynpx expo config --type publicshows the bundle identifier you intend to keep forever.Build and submit to TestFlight
One command creates credentials, builds on Expo Build and submits for internal testing. Approve it when Codex asks.
bashnpx testflightVerifyApp Store Connect › TestFlight shows the build as ready to test after processing.Install and run your test plan
Add yourself and a teammate to an internal group, install from the TestFlight app, and walk the plan: sign up, send a tip, receive a push, buy Pro in the sandbox, restore, go offline, delete the account.
basheas submit --platform ios --groups "Internal" --what-to-test "Sign up, send a tip, buy Pro, restore, go offline, delete account"VerifyEvery item in the test plan passes on a physical iPhone, or has an issue filed.Triage feedback with Codex
Ask Codex to pull TestFlight crashes and screenshot feedback with the Expo MCP tools, group them, and propose fixes. Ship JavaScript-only fixes with an update and native fixes with a new build.
promptUse the Expo MCP tools to list TestFlight crashes and feedback from the last 48 hours, group duplicates, and propose a fix for each group.VerifyEach piece of feedback is either fixed or tracked as an issue.Add Android internal testing
Create the app in Play Console, upload a Google Service Account key to Expo, then build and submit. The first submission goes to the internal testing track.
basheas credentials --platform android eas build --platform android --profile production eas submit --platform androidVerifyA tester installs Tipjar from the Google Play internal testing opt-in link.
Plain-English definitions from the AI Coding Dictionary.