Expo SDK 58 beta: test iOS 27 scenes and agent CLI before leaving 57

Expo published the SDK 58 beta on 15 September 2026. The beta runs three to four weeks — enough to learn whether iOS 27 scene lifecycle, React Native 0.88 RC, fingerprint defaults, and the new agent-facing CLI break your AppDelegate customizations, config plugins, and agent runbooks.
Do not treat @next as a silent production pin. Keep one branch, one checklist, one owner, and a hard rule that coding agents may not bump production to SDK 58 beta without that gate passing.
What the beta actually changes for shippers
The changelog is long. Production builders only need the load-bearing facts.
Platform baseline. SDK 58 is built for iOS 27. Apps get the UIKit scene-based life cycle and resizable iPhone behavior from the iOS 27 SDK. Expo packages stop reading geometry from UIScreen.main and move to scene-aware helpers. If you customize AppDelegate.swift, you must read the scene life cycle migration guide before you call the upgrade done.
React Native line. The beta ships React Native 0.88 as a release candidate. Stable SDK 58 waits on stable 0.88. That means your beta branch is also an RN RC branch. Treat regressions as expected until Expo cuts stable.
Expo Go path. SDK 58 Expo Go is available today through Expo CLI (Android devices/emulators and iOS simulators) and through eas go for physical iOS devices. Store Expo Go updates after stable. Do not force every tester onto a store client that still expects SDK 57.
EAS Build images. Xcode 27 and SDK 58 toolchain images are "coming soon" on the beta post. Until they land, latest still ships Xcode 26.6. If your gate requires a true iOS 27 native build, wait for those images or run local Xcode 27 — do not invent a green CI from the wrong image.
Agent surface. @expo/agent-cli is a new experimental CLI designed for coding agents. It sits on top of Expo CLI, EAS CLI, and expo-doctor, with commands like status, dev, smoke, and skills:sync. Agents used to learn Expo the hard way (Expo Go runtime errors on unsupported native modules, wrong CLI choice). This package is the explicit fix for that failure mode.
Those five bullets are the upgrade gate. Everything else is secondary until those pass on a branch that mirrors production.


The decision: beta branch vs production pin
| Signal | Stay on SDK 57 for production | Open an SDK 58 beta branch now |
|---|---|---|
| Need iOS 27 / scene life cycle behavior in TestFlight this month | No — wait for images + stable if you can | Yes — beta is how you get ahead of App Store pressure |
Heavy custom AppDelegate / URL / user-activity overrides | Still fine on 57 | Mandatory: migrate against the scene guide on a branch first |
| Agents already run Expo Go / EAS blindly | Keep 57 pins in agent docs | Add @expo/agent-cli to the branch and teach agents status before dev |
| CI still on Xcode 26.6 images only | Keep shipping 57 | Open the branch, but do not claim iOS 27 CI green until 58 images exist |
| You only wanted "newest SDK" for blog optics | Stay | Do not open the branch |
The wrong move is letting Cursor or Claude Code "helpfully" run npx expo install expo@next --fix on main because a changelog looked interesting. The right move is a named branch, a written gate, and agent instructions that point at the gate file.
For a sibling pattern on version pins that change platform support, see /blog/gluestack-v5-no-nextjs-yet. Same class of decision: read the install matrix before you unify majors.
One codebase. iOS, Android, and web.
The Fitness Kit ships with auth, a database, and a backend already connected — no setup. Live demo at fitness-preview.otf-kit.dev.
Upgrade gate checklist (copy into the repo)
Put this in something agents can find — docs/upgrade-sdk-58-beta.md or your project memory file — not only in Slack.
# SDK 58 beta gate (branch: sdk-58-beta)
## Non-negotiables
- [ ] Created from current production release tag
- [ ] `npx expo install expo@next --fix` on the branch only
- [ ] Read scene life cycle migration if AppDelegate is customized
- [ ] Local or EAS build path documented (Xcode 27 image status noted)
- [ ] Expo Go path documented (CLI / eas go — not store client assumption)
- [ ] Agent docs updated: use @expo/agent-cli status before blind Expo Go
- [ ] Smoke: launch, auth, push, OTA channel, crash reporting still green
- [ ] Owner sign-off before any merge to release/* or mainInitialize a fresh probe app only if you need a clean room:
npx create-expo-app@latest --template default@nextUpgrade an existing production fork on the branch:
npx expo install expo@next --fixThen prebuild clean when you are validating native templates:
npx expo prebuild --cleanIf your team already uses Claude Code for Expo upgrades, Expo's own note points at an expo-upgrade skill during the beta. That is fine on the branch. It is not a substitute for the checklist above.
Scene life cycle: the AppDelegate tax
iOS 27 requires the UIScene life cycle. Prebuild now generates SceneDelegate.swift and a UIApplicationSceneManifest entry. The UIWindow is created by the scene delegate instead of only in didFinishLaunchingWithOptions.
Expo forwards URL, user activity, Handoff, life cycle, and quick action events to ExpoAppDelegate overrides and subscribers so many config plugins keep working. That does not mean hand-edited AppDelegate code is automatic. Bare apps, checked-in ios/ trees, and direct overrides need the migration guide before you trust a production cutover.
Also watch orientation: on iOS 27, requireFullScreen no longer opts you out of resizing the same way, and ScreenOrientation.lockAsync may have no effect while the app is resizable. If your product depends on locked orientation, put that on the gate as an explicit device test — not a TypeScript compile.

Agent CLI: stop teaching Expo through runtime failures
@expo/agent-cli exists because agents keep choosing the wrong path: start Expo Go, hit a native module Expo Go does not ship, then thrash. The new CLI is experimental and still moving, but the production consequence is clear: put it in the beta branch agent instructions.
Useful starting commands from the changelog:
npx @expo/agent-cli@latest agents:setupThen prefer agent-cli over raw Expo CLI in agent runbooks for:
status— Expo Go compatibility without starting the appdev— start with a clearer "when to build" pathsmoke—devplus screenshot plus stopskills:sync— co-locate agent skills fromnode_modules
Alias expo-agent-cli exists for a shorter binary name. Pin a version in the branch lockfile and re-read the changelog before promoting those instructions to main.
Extend existing agent repository conventions rather than inventing a second memory store — see /blog/production-repo-conventions-for-ai-coding-agents. If Claude is already connected to Expo operations, keep that connector on the path you actually ship — see /blog/expo-mcp-connector-claude.
Secondary beta changes worth a line on the gate
Put these on the checklist only if they touch your app — not as separate panic threads.
- Fingerprint default moves to the
balancedpreset. Re-read presets if EAS Update identity depends on fingerprint strictness. - Expo Router marks data loaders, SSR, middleware, and native tabs stable; custom navigators and
expo-router/react-navigationimports need the migration guide. - Strict TypeScript API is default. Deep
react-native/Libraries/*imports become type errors. The legacy opt-out disappears after 0.88 — migrate during the SDK 58 cycle. - NODE_ENV loading is normalized before
.envfiles. InheritedNODE_ENV=testduringexpo startmay not do what old scripts assumed. - Android release minify enables R8 by default. Reflection-heavy libraries may need keep rules.
- Observe remains the production metrics path (
AppMetricsdeprecated). Keep the contract when you move — see /blog/expo-observe-production. - PostHog connect via EAS CLI works across SDKs; it is not an SDK 58-only upgrade reason.
- App Intents and Android widgets are separate product gates — do not conflate them with the core SDK cutover.
What not to do this week
- Do not merge SDK 58 beta to the production release branch because a feed posted iOS 27.
- Do not assume EAS
latestequals Xcode 27 until Expo updates the beta post. - Do not leave agent docs saying "always use Expo Go" when native modules need a development build — teach
agent-cli statusfirst. - Do not treat RN 0.88 RC silence as App Store stability.
- Do not open parallel beta branches with different
expo@nextresolutions. One gate branch, one lockfile, one owner.
Owned kits and the same gate
If you ship from an owned product kit, the kit's agent docs and pin files are part of the gate. The beta changes the native and tooling floor; it does not invent your screens, schema, auth, billing, or deploy spine. Keep upgrade instructions in-repo so the next agent does not discover scene-lifecycle breakage on a Friday release.
Browse verified starting points at https://otf-kit.dev/templates when you want a monorepo that already expects agent-readable upgrade notes. The SDK 58 beta still has to pass on your branch; a kit only makes the gate easier to find.
Sources
- Expo SDK 58 beta changelog — primary source for beta window, iOS 27 / scene life cycle, RN 0.88 RC, Expo Go paths, EAS image status,
@expo/agent-cli, fingerprint default, Router stability, Strict TypeScript API, and related breaking changes (verified 2026-09-17).
Stop wiring. Start shipping.
- Login, database, and backend already connected — nothing to set up
- iOS + Android + web from one codebase
- AI configs pre-tuned + 40+ tested prompts included