AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
EAS Observe is an Expo Application Services tool designed to track application performance, including startup times, navigation metrics, and custom events. It also provides robust error and crash reporting capabilities. By integrating the library into an Expo project, developers can gain visibility into real-world app behavior, helping to identify bottlenecks, diagnose slow startups, and resolve runtime issues. The service includes CLI tools for querying metrics and supports various integrations with core Expo libraries to provide deeper insights into image loading and animation performance.
What it does
- Tracks startup performance metrics like cold and warm launch times.
- Measures time-to-interactive and navigation performance.
- Captures JavaScript errors and native crashes with symbolicated stack traces.
- Supports user-defined events for custom performance tracking.
- Provides CLI commands to query and analyze performance data.
- Integrates with Expo Router, React Navigation, and other libraries for contextual metrics.
When to use it
- When you need to monitor production app performance and startup speed.
- When you want to track and debug runtime errors and native crashes.
- When investigating performance regressions across different devices or network conditions.
- When you need to measure the impact of specific user flows or navigation patterns.
Advantages
- Provides actionable insights into real-world user experience.
- Helps distinguish between code-related slowness and environmental throttling.
- Simplifies error tracking with integrated crash reporting.
- Offers granular control over data sampling and reporting configuration.
Usage examples
- “How do I add EAS Observe to my Expo project?”
- The agent will guide you through installing expo-observe, wrapping your root layout with ObserveRoot, and configuring the necessary integrations.
- “How can I check my app's cold launch performance from the terminal?”
- The agent will provide the appropriate eas observe:metrics-summary command to retrieve and display your application's startup metrics.
- “What does it mean if my app has high TTI but low totalDelay?”
- The agent will explain that this indicates a slow but smooth launch, suggesting you should look into bundle size or data-fetch waterfalls.
- “How do I enable the Reanimated integration for EAS Observe?”
- The agent will show you how to update your Observe.configure call to include the reanimated integration.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/expo/eas-observe/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip eas-observe.zip -d .agents/skills
Documentation by Expo
EAS Observe
EAS service - costs apply. EAS Observe is an Expo Application Services product. The free EAS plan allows up to 10,000 monthly active users, with a limited set of features; higher usage requires a paid subscription. For details, see https://expo.dev/pricing#plan-features.
EAS Observe tracks startup, navigation, and custom-event performance from production Expo apps, and records JavaScript errors and native crashes. It needs a development or production build — the native library is not in Expo Go.
Source of truth: https://docs.expo.dev/eas/observe/ — always consult the canonical docs when API details matter, especially get-started, configuration, integrations, and the metrics reference. EAS Observe is evolving; this skill's references are written to stay accurate but may lag the docs.
Which reference to read
The five reference files in ./references/ cover what people typically need this skill for:
Adding EAS Observe to a project →
./references/setup.md. Install, wrap the root layout (AppMetricsRooton SDK 55,ObserveRooton SDK 56+), mark the app interactive (globalmarkInteractive()on SDK 55, theuseObserve()hook or<ObserveInteractiveMarker />on SDK 56+), optional per-route navigation metrics through the Expo Router / React Navigation integrations, user-defined events viaObserve.logEvent(SDK 56+), error reporting, and runtime configuration (sampling, dispatch, environments, custom endpoint).Querying metrics from the terminal →
./references/queries.md. Theeas observe:*commands —metrics-summary,metrics,routes,events,session,versions,errors,event— with flags, metric aliases, table layouts, JSON shapes, and common workflows. Also the matchingobserve_*tools in the Expo MCP Server, and how their inputs differ from the CLI flags.Reading a dashboard or CLI output →
./references/metrics.md. Target thresholds per metric, what the automatic TTI params mean (frameRate.*,device.*,network.*), and diagnostic patterns for telling slow-but-smooth startup apart from main-thread contention, hard blocks, or throttled devices.Reporting problems from library integrations →
./references/library-integrations.md. The current and future integrations that report problems a library detects as events or errors, with their options, limits, and how to query the reports. Currently:expo-image(expo-image.oversizedevents for images decoded far larger than the screen) andreact-native-reanimated(reanimated.errorerrors and optionalreanimated.warningevents).Shipping an Observe integration in a library →
./references/third-party.md. For package authors only (SDK 57+): optional peer dependency, config declaration merging,Observe.registerIntegration(), and event naming.
Quick links to the docs
Get started: https://docs.expo.dev/eas/observe/get-started/
Dashboard guide: https://docs.expo.dev/eas/observe/dashboard/
Querying with EAS CLI: https://docs.expo.dev/eas/observe/eas-cli/
Querying with the Expo MCP Server: https://docs.expo.dev/eas/observe/mcp/
Metrics reference: https://docs.expo.dev/eas/observe/reference/metrics/
Expo Router integration: https://docs.expo.dev/eas/observe/integrations/expo-router/
React Navigation integration: https://docs.expo.dev/eas/observe/integrations/react-navigation/
Expo Image integration: https://docs.expo.dev/eas/observe/integrations/expo-image/
Reanimated integration: https://docs.expo.dev/eas/observe/integrations/react-native-reanimated/
User-defined events: https://docs.expo.dev/eas/observe/events/
Error reporting: https://docs.expo.dev/eas/observe/errors/
Configuration: https://docs.expo.dev/eas/observe/configuration/
Third-party integrations: https://docs.expo.dev/eas/observe/integrations/third-party/
EAS Update download performance: https://docs.expo.dev/eas/observe/eas-update/
Troubleshooting: https://docs.expo.dev/eas/observe/reference/troubleshooting/
Submitting Feedback
If you encounter errors, misleading or outdated information in this skill, report it so Expo can improve:
npx --yes @expo/agent-cli@latest feedback --category skills --subject "eas-observe" "<actionable feedback>"Only submit when you have something specific and actionable to report. Include as much relevant context as possible.
If an agent repeatedly fails at an Expo task or the user has to step in, submit a brief report of the task, expected result, and what went wrong using --category evals and the relevant Expo package or command as --subject.
Files
- ATTRIBUTION.mdAdded by AutoGineer809 B
- LICENSELicence file added by AutoGineer1.1 KiB
- SKILL.md5.7 KiB
- agents/openai.yaml449 B
- references/library-integrations.md6.8 KiB
- references/metrics.md8.5 KiB
- references/queries.md22.5 KiB
- references/setup.md27.4 KiB
- references/third-party.md4.6 KiB
references/library-integrations.md
Report problems from library integrations
This reference is for app developers who want EAS Observe to report problems that a library detects. These built-in integrations do this:
Expo Image (
'expo-image'): logs anexpo-image.oversizedevent when an image is decoded at a much larger size than the screen can display.Reanimated (
'react-native-reanimated'): reports Reanimated errors asreanimated.errorerrors, and optionally Reanimated warnings asreanimated.warningevents.
These integrations do not record metrics. Their reports are user-defined events and errors, so query them with eas observe:events and eas observe:errors (see ./queries.md). For the per-route navigation metrics from the Expo Router and React Navigation integrations, see ./setup.md. To build an integration inside a library, see ./third-party.md.
Both integrations need expo-observe set up first (see ./setup.md). Enable them in the same Observe.configure() call as any other integration, at module scope, before the app mounts:
// app/_layout.tsx
import { Observe } from 'expo-observe';
Observe.configure({
integrations: {
'expo-router': true,
'expo-image': true,
'react-native-reanimated': true,
},
});configure() replaces the full configuration. Pass every integration that the app uses in each call.
Expo Image
Docs: https://docs.expo.dev/eas/observe/integrations/expo-image/
Requirements: expo-image 57.0.2 or later (SDK 57+). If expo-observe is not installed, the integration does nothing. Only images loaded through expo-image are reported.
On every image load, the integration compares the decoded pixel area with the physical pixel count of the screen. When the area is larger than the screen's pixel count by more than oversizeThreshold, it logs an expo-image.oversized event with warn severity. Each image URL is reported at most once per app session.
Options:
| Option | Type | Default | What it does |
|---|---|---|---|
oversizeThreshold | number | 1.5 | Report an image when its decoded pixel area is larger than the screen's physical pixel count by more than this factor. |
includeUrlParams | boolean | false | Report the query string and fragment of the URL. Leave it false when the URLs can carry tokens or API keys. |
Observe.configure({
integrations: { 'expo-image': { oversizeThreshold: 2 } },
});Event attributes: url (sanitized), urlSanitized (whether sanitization changed the URL), imageWidth and imageHeight (decoded pixels), screenWidth and screenHeight (points), and pixelRatio.
URL sanitization: basic-auth credentials are always removed. The query string and fragment are removed unless includeUrlParams is true. Only http(s), file, and android.resource URLs are reported. Other schemes, such as data: and ph://, are never sent.
Platform differences for the <Image> component:
On Android,
<Image>downscales to the component size at decode time, so a large source in a small component is usually not reported.On iOS, the integration sees the decoded size of the source before downscaling, so a large source in a small component is reported, also with
allowDownscaling.useImageandImage.loadAsyncdecode at the full source size on both platforms, unless themaxWidthandmaxHeightload options are set.
Fix reported images: serve images close to their display size, for example resized variants from an image CDN. With useImage, set maxWidth and maxHeight to downscale at decode time.
eas observe:events expo-image.oversizedReanimated
Docs: https://docs.expo.dev/eas/observe/integrations/react-native-reanimated/
Requirements: react-native-reanimated 4.7.0 or later (SDK 58+), and an expo-observe version that includes the integration. The integration uses the onLog callback of configureReanimatedLogger, which Reanimated 4.7.0 added. With an earlier Reanimated, or without Reanimated, the integration prints a console warning and does nothing. react-native-reanimated is an optional peer dependency of expo-observe, and it is loaded only when the integration is on.
Do not call configureReanimatedLogger in the app. The integration calls it itself:
A call after
Observe.configure()removes the integration's callback, and reporting stops.A call before
Observe.configure()loses itslevelandstrictoptions, because the integration replaces them.
To set those options, pass them to the integration. If the app already calls configureReanimatedLogger, move its options into the integration config and delete the call.
Options:
| Option | Type | Default | What it does |
|---|---|---|---|
level | ReanimatedLogLevel.warn or ReanimatedLogLevel.error | ReanimatedLogLevel.warn | The minimum log level that Reanimated prints and reports. |
strict | boolean | true | Whether Reanimated also prints and reports its strict-mode warnings. |
reportWarnings | boolean | false | Also report Reanimated warnings as reanimated.warning events. |
import { Observe } from 'expo-observe';
import { ReanimatedLogLevel } from 'react-native-reanimated';
Observe.configure({
integrations: {
'react-native-reanimated': {
level: ReanimatedLogLevel.warn,
strict: true,
reportWarnings: true,
},
},
});What it reports:
A Reanimated error becomes a non-fatal error named
reanimated.error. It appears on the Observe > Errors page with the other errors. On the React Native runtime, the stack trace starts in Reanimated's logger and then includes the code that called the logger. On the UI runtime, the error has the message but no stack trace.When
reportWarningsistrue, a Reanimated warning becomes areanimated.warningevent withwarnseverity. Themessageattribute holds the first 500 characters of the warning.Reanimated still prints all errors and warnings to the console.
Limits: some messages, such as measure() warnings, can repeat on every frame. In each 15-minute period, each distinct message is reported at most once, and at most 20 distinct errors and 20 distinct warnings are reported. Errors and warnings have separate limits. Messages are compared by their first 500 characters.
Turn it off: call Observe.configure() again without 'react-native-reanimated'. Reporting stops, and Reanimated's logger keeps its level and strict options. This is different from the navigation integrations, which throw when their flag changes after mount. So a later configure() call must keep the same navigation integration flags.
# Errors, including reanimated.error
eas observe:errors
# Warnings, when reportWarnings is true
eas observe:events reanimated.warningRequirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs an MCP server, Needs Node.js
Security
What our scanner noticed· Low risk
- Instructions that use the network
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Published by
- Expo
- Publisher
- Expo (Official)
- Source
- expo/skills · plugins/expo/skills/eas-observe · commit a9e5bd3
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from plugins/expo/LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Expo.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download eas-observe.zip