Performance Monitoring and Profiling
EAS Observe, Hermes profiling, memory management, ANR, and crash tracking.
Key takeaways
- EAS Observe is Expo's official monitoring service, in Open Beta as of 2026-06, collecting Cold/Warm Launch, TTI, TTR, and Bundle Load Time from production builds.
- Wrap the root with
ObserveRoot.wrapand callmarkInteractive()where the app is truly usable; only the first call records the metric. - Compare P50/P75/P95 by OTA group and build ID, and stop a rollout when TTI P95 is 10% or more worse.
- Hermes V1 is the SDK 56 default, so re-validate JSI boundaries such as Reanimated, MMKV, and Skia on devices.
- Track OTA payload size and bundle load time together because bytecode diffing is enabled by default; aim for a JS thread frame drop rate of 5% or lower.
EAS Observe Open Beta
EAS Observe is Expo's official production performance monitoring service. As of 2026-06, it is in Open Beta and collects startup metrics from Android and iOS production builds.
| Metric | Description |
|---|---|
| Cold Launch | first app start |
| Warm Launch | return from background |
| TTI | Time to Interactive |
| TTR | Time to First Render |
| Bundle Load Time | JS bundle load duration |
SDK 56 Setup Pattern
import { Stack } from 'expo-router';
import { ObserveRoot, useObserve } from 'expo-observe';
import * as SplashScreen from 'expo-splash-screen';
import { useEffect, useState } from 'react';
SplashScreen.preventAutoHideAsync();
function RootLayout() {
const [ready, setReady] = useState(false);
const { markInteractive } = useObserve();
useEffect(() => {
bootstrap().finally(() => setReady(true));
}, []);
useEffect(() => {
if (ready) {
SplashScreen.hide();
markInteractive();
}
}, [ready, markInteractive]);
return ready ? <Stack /> : null;
}
export default ObserveRoot.wrap(RootLayout);markInteractive() can be called from multiple entry screens. Only the first call records the metric,
so deep links, login, and onboarding should each mark the point where the app is actually usable.
Operational Queries
eas observe:versions
eas observe:metrics-summary --platform ios
eas observe:metrics --limit 50
eas observe:events| Use case | Recommended practice |
|---|---|
| release comparison | compare P50/P75/P95 by OTA group and build ID |
| session investigation | segment by device class, OS, and update group |
| rollout gate | stop rollout if TTI P95 is 10%+ worse |
| privacy | do not put PII in custom events |
Hermes V1
SDK 56 uses Hermes V1 by default through React Native 0.85.
- Validate actual startup and memory behavior per app.
- Test JSI boundaries such as worklets, Reanimated, MMKV, and Skia on devices.
- Track OTA payload size and bundle load time together because bytecode diffing is enabled by default.
Tooling
| Tool | Role |
|---|---|
| React Native DevTools | development runtime debugging |
| Expo Atlas | bundle composition and size analysis |
| EAS Observe | production startup metrics |
| Sentry/BugSnag | crash reporting while EAS Observe crash coverage remains separate |