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://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/queries.md
EAS Observe CLI
EAS Observe collects app performance telemetry and custom events from Expo apps and exposes them through the eas observe:* commands. The CLI changes between releases, so treat --help as the source of truth: run eas observe --help to list the commands the installed CLI has, and eas observe:<command> --help for a command's current flags.
Source: https://docs.expo.dev/eas/observe/eas-cli/ — the canonical CLI page. This reference adds table layouts, JSON output shapes, and pagination details that the docs page does not cover.
Commands Overview
| Command | Purpose |
|---|---|
eas observe:metrics-summary | Per-version statistical aggregates for startup and navigation metrics (median, p90, etc.) |
eas observe:metrics | Individual metric samples ordered by value or timestamp (paginated) |
eas observe:routes | Per-route statistical aggregates for navigation metrics (Nav Cold TTR, Nav Warm TTR, Nav TTI) |
eas observe:events | Custom events emitted by the app via logEvent — name summary, all events, or filtered by event name (paginated) |
eas observe:session | Full timeline of metric and log events for one session |
eas observe:versions | App version hierarchy with build numbers, OTA update IDs, and event counts |
eas observe:errors | Error groups by fingerprint; --fingerprint <id> lists one group's occurrences with stack traces |
eas observe:event | One metric, log, or error event by its ID, taken from the --json output of observe:session, observe:metrics, or observe:events, or from the occurrences listed by observe:errors --fingerprint |
All commands take these flags:
--project-id <id>— run against a specific project without needing a project directory. When passed, the command will not try to create a new EAS project where one is unneeded.--json— machine-readable output (implies--non-interactive)--non-interactive— fail instead of prompting
All commands except observe:event also take these flags:
--start <ISO date>and--end <ISO date>— explicit time range--days <N>— show data from the last N days (mutually exclusive with--start/--end, minimum 1)--environment <name>— filter by environment, for exampleproductionordevelopment
--platform <android|ios|ipados|macos|tvos|apple> (default: all) is on every command except observe:session and observe:event, which are scoped to one session or one event already. apple covers iOS, iPadOS, tvOS, and macOS.
Default time range is the last 60 days when none of --days, --start, --end is given.
Plan gating. Observe is a paid feature, and the server rejects queries the account's plan does not include (EAS_OBSERVE_PLAN_UPGRADE_REQUIRED or EAS_OBSERVE_FEATURE_NOT_AVAILABLE_IN_FREE_TIER). The CLI surfaces the server's upgrade message, which links to the account's billing page. Session timelines in particular are checked before the interactive picker runs. A plan-gate failure is not a bug in the command or its flags.
Expo MCP Server tools
The Expo MCP Server has read-only tools that return the same data as the CLI. When the observe_* tools are available, use them instead of the CLI: they use the Expo account that the MCP client signed in with, so they need no EAS CLI install and no access token. The queries, metric names, and workflows in this file apply to both.
| Tool | CLI equivalent |
|---|---|
observe_versions | eas observe:versions |
observe_metrics_summary | eas observe:metrics-summary |
observe_metrics | eas observe:metrics |
observe_routes | eas observe:routes |
observe_event_names | eas observe:events (name summary) |
observe_events | eas observe:events <name>, or --all-events without eventName |
observe_session | eas observe:session |
Differences from the CLI:
No error-group tools. For error groups and stack traces, use
eas observe:errorsandeas observe:event.observe_sessionincludes the errors of one session. An empty result from the other MCP tools does not mean that the app has no errors.Project: pass
appIdorappFullName(such as@owner/my-app). In a project directory, read the project ID from the app config.Platform:
platformtakesANDROID,IOS,IPADOS,MACOS, orTVOS. There is noapplevalue. As in the CLI,observe_versions,observe_metrics_summary, andobserve_routesreturn separate Android and iOS results withoutplatform, andobserve_metrics,observe_event_names, andobserve_eventsreturn results from all platforms.Environment: only
observe_event_namesandobserve_eventstakeenvironment.observe_versions,observe_metrics_summary,observe_metrics, andobserve_routeshave no environment input, unlike the CLI's--environmentflag.Time range:
days(up to 365), orstartandend. The default is the last 60 days.startandendmust be ISO 8601 date-times with a timezone, such as2026-10-01T00:00:00Z. A date-only value fails. Unlike the CLI,enddoes not needstart.observe_sessiontakes no time range.Pagination: pass
pageInfo.endCursorfrom a response back asnextCursor. Forobserve_metrics,observe_events, andobserve_routes, also pass the returnedstartTimeandendTimeasstartandend, and keep the other inputs the same. Routes paginate per platform. Session timelines paginate metrics and logs separately.Plan gating and usage: plan limits are the same as for the CLI. Each tool call counts toward the account's Expo MCP Server usage.
Defaults and limits:
observe_metricssortsnewestfirst by default. The CLI's--sortdefaults tooldest.observe_routestakes alimitof up to 100, and the CLI takes up to 200.observe_eventstakessort, and the CLI'sobserve:eventshas no--sort.
Supported Metrics
App-startup metrics
| Alias | Full name | Display |
|---|---|---|
tti | expo.app_startup.tti | Startup TTI (time to interactive) |
ttr | expo.app_startup.ttr | Startup TTR (time to render) |
cold_launch | expo.app_startup.cold_launch_time | Cold Launch |
warm_launch | expo.app_startup.warm_launch_time | Warm Launch |
bundle_load | expo.app_startup.bundle_load_time | Bundle Load |
update_download | expo.updates.download_time | Update Download |
Navigation metrics
Emitted only when a navigation integration is enabled (SDK 56+). Measured per route name.
| Alias | Full name | Display |
|---|---|---|
nav_cold_ttr | expo.navigation.cold_ttr | Nav Cold TTR |
nav_warm_ttr | expo.navigation.warm_ttr | Nav Warm TTR |
nav_tti | expo.navigation.tti | Nav TTI |
Which command takes which alias. observe:metrics (positional argument) and observe:metrics-summary --metric accept all nine aliases — startup and navigation. observe:routes --metric accepts only the three navigation aliases. Use the nav_ prefix everywhere; there are no bare cold_ttr / warm_ttr aliases.
observe:metrics also accepts a full metric name in place of an alias, for example eas observe:metrics expo.app_startup.tti. observe:routes accepts full navigation names the same way. The --metric flags on metrics-summary and routes are strict oclif options, so they take aliases only.
eas observe:metrics-summary
Shows per-version statistical aggregates for one or more metrics, with separate tables per platform.
# All default metrics, last 60 days, both platforms
eas observe:metrics-summary
# Single metric
eas observe:metrics-summary --metric tti
# Multiple metrics — each renders as its own table
eas observe:metrics-summary --metric tti --metric cold_launch
# Navigation metrics aggregate per version here, per route in observe:routes
eas observe:metrics-summary --metric nav_tti
# Choose which statistics to display
eas observe:metrics-summary --metric tti --stat median --stat p90 --stat eventCount
# Narrow time range and platform
eas observe:metrics-summary --metric tti --days 14 --platform iosStat flags: exactly min, median, max, average, p80, p90, p99, eventCount. This command takes no aliases — med, avg, and count are rejected here (they work only on observe:routes).
Default stats: median + eventCount in the table; all eight in JSON.
This command has no --limit, --after, --app-version, --build-number, or --update-id. It always aggregates every version in the time range.
Table layout:
One table per metric (with merged value + event count cells, e.g.
0.45s (150))Each table shows iOS and Android in separate sections
App Version column includes build numbers in parentheses (e.g.
1.2.0 (42))Footer row per platform shows total events per metric
Update IDs are omitted from the table to keep output readable when a version has many updates; they are included in the JSON output as an array per version
JSON output shape:
{
"versions": [
{
"appVersion": "1.2.0",
"platform": "IOS",
"buildNumbers": ["42"],
"updateIds": ["abc-def-...", "..."],
"metrics": {
"expo.app_startup.tti": { "median": 0.45, "p90": 0.9, "...": "..." }
}
}
],
"totalEventCounts": {
"expo.app_startup.tti": { "IOS": 1234, "ANDROID": 890 }
}
}eas observe:metrics
Shows individual performance metric samples, paginated. The metric is a positional argument, not a flag. If omitted and running interactively, prompts for selection; in non-interactive mode it throws an error.
# Interactive: prompts for metric
eas observe:metrics
# Specify metric as positional arg
eas observe:metrics tti
# Navigation metrics work here too
eas observe:metrics nav_tti --sort slowest
# Filter by version or update, sort by slowest
eas observe:metrics tti --app-version 1.2.0 --sort slowest --limit 20
# Pagination — pass the endCursor from the previous run
eas observe:metrics tti --after <cursor>Sample-specific flags:
--sort <oldest|newest|slowest|fastest>— defaults tooldest--limit <N>— samples per page (default 10, max 100)--after <cursor>— pagination cursor from the previous run--app-version <version>— filter by app version string--build-number <number>— filter by app build number--update-id <id>— filter by EAS update ID
Table layout:
Summary header shows the metric name, time range, and total sample count across all versions (e.g.
TTI samples for the last 60 days — 1,234 total events)Columns: Value, App Version (with build number), Update (only when any sample has one), Platform, Device, Country, Timestamp
When
hasNextPageis true, printsNext page: --after <endCursor>hint below the tableJSON output also includes
sessionId,easClientId, and acustomParamsobject per sample
eas observe:routes
Shows per-route statistical aggregates for navigation metrics (Cold TTR, Warm TTR, Nav TTI), grouped by route name with separate sections per platform.
# All three navigation metrics, default stats, last 60 days, both platforms
eas observe:routes
# Single metric, last 7 days, iOS only
eas observe:routes --metric nav_tti --days 7 --platform ios
# Multiple metrics and stats
eas observe:routes --metric nav_cold_ttr --metric nav_warm_ttr --stat median --stat p90 --stat count
# Filter to a single build
eas observe:routes --app-version 1.2.0 --build-number 42
# Narrow to specific routes (repeat the flag for multiple routes)
eas observe:routes --route-name /new --route-name /settings
# Pagination — each platform has its own cursor; pass the relevant endCursor
eas observe:routes --after <cursor>Routes-specific flags:
--metric <nav_cold_ttr|nav_warm_ttr|nav_tti>— navigation metric(s) to display, can be repeated. Defaults to all three.--stat <median|p90|count>— statistic(s) per metric. Aliases:med→median,event_count/eventCount→count.--limit <N>— routes per page (default 50, max 200, different frommetrics/eventswhich default to 10).--after <cursor>— pagination cursor from the previous run.--app-version <version>— filter by app version string.--build-number <number>— filter by app build number.--route-name <name>— filter by route name. Repeatable; only the listed routes are returned across both platforms. Duplicates are de-duplicated; omitting the flag returns all routes.--update-id <id>— filter by EAS update ID.
Default stats: median + count in the table; median, p90, count in JSON.
Table layout:
Summary header with the chosen stats and time range, e.g.
Med, P90 values (navigation count) for the last 7 days.Separate iOS and Android sections.
First column is Route, followed by one column per metric/stat. With both display stats and
count, cells are merged like0.32s (1240).Each platform has its own pagination hint:
Next page (iOS): --after <endCursor>.
JSON output shape:
{
"routes": [
{
"routeName": "(tabs)/home",
"platform": "IOS",
"metrics": {
"expo.navigation.cold_ttr": { "median": 0.32, "p90": 0.85, "count": 1240 },
"expo.navigation.tti": { "median": 0.55, "p90": 1.10, "count": 1240 }
}
}
],
"pageInfoByPlatform": {
"IOS": { "hasNextPage": true, "endCursor": "..." },
"ANDROID": { "hasNextPage": false, "endCursor": null }
}
}eas observe:events
Shows custom events emitted by the app via the logEvent API in expo-observe. Behavior depends on what is passed:
| Invocation | Result |
|---|---|
observe:events | Summary table of available event names with counts |
observe:events --all-events | Full list of events across all event names |
observe:events <event-name> | Full list of events filtered by that event name |
# List the available custom event names and their counts (last 60 days)
eas observe:events
# All events across all names, last 7 days, iOS only
eas observe:events --all-events --days 7 --platform ios
# Only events with the given name
eas observe:events login_failed --limit 50
# Drill into a single session
eas observe:events --all-events --session-id <session-id>
# Pagination
eas observe:events login_failed --after <cursor>Events-specific flags:
--all-events— when no event name argument is given, list all events instead of the name summary. Cannot be combined with an event name argument.--session-id <id>— filter to events from a single session (events-only). With no event name argument, this lists the session's events instead of the event-name summary. For the full timeline — metrics as well as log events — useobserve:session.--app-version <version>— filter by app version string--build-number <number>— filter by app build number--update-id <id>— filter by EAS update ID--limit <N>— events per page (default 10, max 100)--after <cursor>— pagination cursor
Table layout (event listings):
Summary header:
<event-name> events <time range>orCustom events <time range>for--all-events, with a total event count when availableColumns: Timestamp, Event (only when listing across multiple names), Severity (only when at least one event in the page has a severity), App Version (with build number), Platform, Device, Country
Next page: --after <endCursor>hint below the table when there is a next page
Empty-result helper: if a specific event name is queried and returns no events, the command prints a yellow No events found matching "<name>" warning followed by the available event names + counts in the same time range — useful for fixing typos.
Truncation note: the event-names summary may flag Result is truncated; not all event names are shown. when there are more names than the server returns in a single response.
JSON output shape (event listing):
{
"events": [
{
"id": "...",
"eventName": "login_failed",
"timestamp": "2026-...",
"sessionId": "...",
"severityNumber": 13,
"severityText": "WARN",
"properties": [{ "key": "reason", "value": "bad_password", "type": "string" }],
"appVersion": "1.2.0",
"appBuildNumber": "42",
"appUpdateId": null,
"appEasBuildId": null,
"deviceModel": "...",
"deviceOs": "iOS",
"deviceOsVersion": "17.4",
"countryCode": "US",
"environment": "production",
"easClientId": "..."
}
],
"pageInfo": { "hasNextPage": true, "endCursor": "..." }
}The name-summary mode returns { "names": [{ "eventName": "...", "count": 123 }], "isTruncated": false }.
eas observe:session
Shows the full timeline of metric and log events for a single session — the CLI equivalent of the dashboard's session view. Use it after observe:metrics surfaces a slow sample: take that sample's sessionId (present in --json output) and replay everything that session recorded.
# Interactive: pick a metric, then pick a session from the candidate list
eas observe:session
# Inspect a known session
eas observe:session <session-id>
# Pick a session from the slowest TTI events in the last 7 days
eas observe:session --event-name tti --sort slowest --days 7Session-specific flags:
[SESSIONID]— positional. Omit it in interactive mode to choose from a list. Required in non-interactive mode, including under--json.--event-name <name>— metric or log event used to build the candidate session list (for exampletti,cold_launch,login_pressed). Prompts when omitted in interactive mode.--sort <slowest|fastest|newest|oldest>— orders the candidate events. Prompts when omitted in interactive mode. No default, unlikeobserve:metrics.
The picker flags and the session ID are mutually exclusive. --event-name, --sort, --days, --start, and --end describe how to find a session, so passing any of them together with a session ID throws. Query a known session with the ID alone.
This command has no --platform, --limit, or --after flag. It takes the shared time-range, --environment, --project-id, --json, and --non-interactive flags.
JSON output shape:
{
"sessionId": "...",
"metadata": { "...": "..." },
"entries": [{ "...": "..." }],
"hasMoreMetricEvents": false,
"hasMoreLogEvents": false
}entries interleaves metric and log events for the session. The two hasMore* flags report truncation per event kind; there is no cursor to page with.
eas observe:errors
Shows error and exception groups, grouped by fingerprint, with event, user, and session counts for each group. The fingerprint is in the first column. Pass --fingerprint to list the occurrences of one group, with stack traces, instead of the grouped summary. Error reporting setup is in ./setup.md.
# Error groups, last 7 days
eas observe:errors --days 7
# Only fatal errors on Android
eas observe:errors --severity fatal --platform android
# Occurrences of one group, with stack traces
eas observe:errors --fingerprint <fingerprint>Errors-specific flags:
--fingerprint <value>— show the occurrences of this error group instead of the grouped summary--severity <fatal|error>— filter by severity (ignored when--fingerprintis set)--app-version <version>,--build-number <number>,--update-id <id>— filter by version, build, or EAS update--limit <N>— occurrences per page (default 10, max 100). Requires--fingerprint.--after <cursor>— pagination cursor. Requires--fingerprint.
--limit or --after without --fingerprint fails with an error. The grouped summary has no pagination.
eas observe:event
Shows one metric, log, or error event by its ID. Event IDs are in the --json output of observe:metrics, observe:events, and observe:session, and in the occurrences from observe:errors --fingerprint.
eas observe:event <event-id>
eas observe:event <event-id> --jsonID is a required positional argument. The command takes only --project-id, --json, and --non-interactive.
eas observe:versions
Shows app version hierarchy with build numbers, OTA update IDs, and event counts per version.
# Both platforms, last 60 days
eas observe:versions
# iOS only, last 14 days
eas observe:versions --days 14 --platform iosNo metric-related flags. Output shows separate iOS and Android tables with columns: App Version, First Seen, Events, Users, Builds (count), Updates (count).
JSON output returns the full nested hierarchy with buildNumbers[].easBuilds[] and updates[].easBuilds[], including firstSeenAt, eventCount, and uniqueUserCount at every level.
Common Workflows
"What are my app's startup times right now?"
eas observe:metrics-summary --days 7 --stat median --stat p90"Which TTI samples were slowest this week?"
eas observe:metrics tti --sort slowest --days 7 --limit 20"How fast are over-the-air updates downloading in the field?"
eas observe:metrics-summary --metric update_download --days 7"Which screens are slowest to navigate to?"
eas observe:routes --metric nav_tti --stat median --stat p90 --days 7"What happened during that one slow session?"
eas observe:metrics tti --sort slowest --days 7 --json # read sessionId from a sample
eas observe:session <session-id>"How does navigation perform on just the routes I care about?"
eas observe:routes --route-name /home --route-name /checkout --days 7"What custom events is my app emitting?"
eas observe:events --days 7"Show me every error event from one user's session."
eas observe:events --all-events --session-id <session-id>"What versions of my app are in the field?"
eas observe:versions"Show me metrics for a specific project without needing to be in the repo"
eas observe:metrics-summary --project-id <uuid> --metric tti"Get JSON for scripting"
eas observe:metrics-summary --metric tti --json --non-interactiveNotes
Requires the user to be logged in (
eas login).When
--project-idis provided, the command does not require running inside an EAS project directory; otherwise the project ID is read from the localapp.config/app.json. If using this option, ensure that you are logged in as a user that has access to the specified project.observe:metrics-summarydoes not print update IDs in the table but still returns them in JSON for scripting or piping into other commands.
Requirements 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 or Expo.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download eas-observe.zip