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

> SDK 58 beta brings iOS 27 scene lifecycle, @expo/agent-cli, and RN 0.88 RC. Pin an upgrade gate so agents do not leap your production app early.
> By Dave · 2026-09-17
> Source: https://otf-kit.dev/blog/expo-sdk-58-beta-upgrade-gate

Expo published the [SDK 58 beta](https://expo.dev/changelog/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](https://cdn.otf-kit.dev/blog/expo-sdk-58-beta-upgrade-gate/competitor-expo-sdk-58-beta-20260917.jpg)

![Decision: open an SDK 58 beta gate branch or keep production on SDK 57](https://cdn.otf-kit.dev/blog/expo-sdk-58-beta-upgrade-gate/inbody-01-decision-20260917c.png)

## 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](/blog/gluestack-v5-no-nextjs-yet). Same class of decision: read the install matrix before you unify majors.

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

```markdown
# 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:

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

Upgrade an existing production fork on the branch:

```bash
npx expo install expo@next --fix
```

Then prebuild clean when you are validating native templates:

```bash
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](https://cdn.otf-kit.dev/blog/expo-sdk-58-beta-upgrade-gate/inbody-02-stations-20260917c.png)

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

```bash
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
- `smoke` — `dev` 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](/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](/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](/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](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](https://expo.dev/changelog/sdk-58-beta) — 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).
