Skip to content
OTFotf
All posts

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

D
DaveAuthor
8 min read
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.

Expo SDK 58 beta changelog — captured 2026-09-17 from https://expo.dev/changelog/sdk-58-beta

Decision: open an SDK 58 beta gate branch or keep production on SDK 57

The decision: beta branch vs production pin

SignalStay on SDK 57 for productionOpen an SDK 58 beta branch now
Need iOS 27 / scene life cycle behavior in TestFlight this monthNo — wait for images + stable if you canYes — beta is how you get ahead of App Store pressure
Heavy custom AppDelegate / URL / user-activity overridesStill fine on 57Mandatory: migrate against the scene guide on a branch first
Agents already run Expo Go / EAS blindlyKeep 57 pins in agent docsAdd @expo/agent-cli to the branch and teach agents status before dev
CI still on Xcode 26.6 images onlyKeep shipping 57Open the branch, but do not claim iOS 27 CI green until 58 images exist
You only wanted "newest SDK" for blog opticsStayDo 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.

See the live demo

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 main

Initialize a fresh probe app only if you need a clean room:

npx create-expo-app@latest --template default@next

Upgrade an existing production fork on the branch:

npx expo install expo@next --fix

Then prebuild clean when you are validating native templates:

npx expo prebuild --clean

If 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.

Upgrade checklist: scene lifecycle, agent-cli status, and build image pins

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:setup

Then prefer agent-cli over raw Expo CLI in agent runbooks for:

  • status — Expo Go compatibility without starting the app
  • dev — start with a clearer "when to build" path
  • smokedev plus screenshot plus stop
  • skills:sync — co-locate agent skills from node_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 balanced preset. 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-navigation imports 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 .env files. Inherited NODE_ENV=test during expo start may 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 (AppMetrics deprecated). 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

  1. Do not merge SDK 58 beta to the production release branch because a feed posted iOS 27.
  2. Do not assume EAS latest equals Xcode 27 until Expo updates the beta post.
  3. Do not leave agent docs saying "always use Expo Go" when native modules need a development build — teach agent-cli status first.
  4. Do not treat RN 0.88 RC silence as App Store stability.
  5. Do not open parallel beta branches with different expo@next resolutions. 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).
react-nativeagentsarchitecture
OTF Fitness Kit

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