Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 8 additions & 4 deletions apps/bare-expo/ios/Podfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -2319,7 +2319,7 @@ PODS:
- ReactCommon/turbomodule/core
- ReactNativeDependencies
- Yoga
- react-native-pager-view (6.9.1):
- react-native-pager-view (8.0.2):
- hermes-engine
- RCTRequired
- RCTTypeSafety
Expand All @@ -2340,6 +2340,7 @@ PODS:
- ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core
- ReactNativeDependencies
- SwiftUIIntrospect (~> 1.0)
- Yoga
- react-native-safe-area-context (5.7.0):
- hermes-engine
Expand Down Expand Up @@ -3286,6 +3287,7 @@ PODS:
- SDWebImageWebPCoder (0.14.6):
- libwebp (~> 1.0)
- SDWebImage/Core (~> 5.17)
- SwiftUIIntrospect (1.3.0)
- TestExpoUi (1.0.0):
- ExpoModulesCore
- ExpoUI
Expand Down Expand Up @@ -3472,7 +3474,7 @@ DEPENDENCIES:
- "React-mutationobservernativemodule (from `../../../node_modules/.pnpm/react-native@0.86.0-rc.2_@babel+core@7.29.0_@react-native+jest-preset@0.86.0-rc.2_@babe_15430a234b5f1224b01b5b0cfcd0d009/node_modules/react-native/ReactCommon/react/nativemodule/mutationobserver`)"
- "react-native-keyboard-controller (from `../../../node_modules/.pnpm/react-native-keyboard-controller@1.21.8_patch_hash=0a01a06c301b2ef0c02744515b2380fa632b_5d540240147b1e6a809a2e5dfc7f63ae/node_modules/react-native-keyboard-controller`)"
- "react-native-netinfo (from `../../../node_modules/.pnpm/@react-native-community+netinfo@11.5.2_patch_hash=ced0cb79848978ecc3e780a4d812d94868434_1fde534caf42d9334de0b3d49ccd9bc7/node_modules/@react-native-community/netinfo`)"
- "react-native-pager-view (from `../../../node_modules/.pnpm/react-native-pager-view@6.9.1_react-native@0.86.0-rc.2_@babel+core@7.29.0_@react-native_14432c7732db1b714e78f47c9f489141/node_modules/react-native-pager-view`)"
- "react-native-pager-view (from `../../../node_modules/.pnpm/react-native-pager-view@8.0.2_react-native@0.86.0-rc.2_@babel+core@7.29.0_@react-native_6b4b0fdd3eb0bf5714ad508f011817e1/node_modules/react-native-pager-view`)"
- "react-native-safe-area-context (from `../../../node_modules/.pnpm/react-native-safe-area-context@5.7.0_react-native@0.86.0-rc.2_@babel+core@7.29.0_@react_6cf9b087dcc8c4e0435d8137de00cfae/node_modules/react-native-safe-area-context`)"
- "react-native-segmented-control (from `../../../node_modules/.pnpm/@react-native-segmented-control+segmented-control@2.5.7_react-native@0.86.0-rc.2_@babel_413547125b3ab0390f55e29d9f9caef9/node_modules/@react-native-segmented-control/segmented-control`)"
- "react-native-skia (from `../../../node_modules/.pnpm/@shopify+react-native-skia@2.4.18_react-native-reanimated@4.3.1_patch_hash=1e34e4238541_ebf101251c5227b8ebfcfaf0e464ed4b/node_modules/@shopify/react-native-skia`)"
Expand Down Expand Up @@ -3543,6 +3545,7 @@ SPEC REPOS:
- SDWebImageAVIFCoder
- SDWebImageSVGCoder
- SDWebImageWebPCoder
- SwiftUIIntrospect
- ZXingObjC

EXTERNAL SOURCES:
Expand Down Expand Up @@ -3886,7 +3889,7 @@ EXTERNAL SOURCES:
react-native-netinfo:
:path: "../../../node_modules/.pnpm/@react-native-community+netinfo@11.5.2_patch_hash=ced0cb79848978ecc3e780a4d812d94868434_1fde534caf42d9334de0b3d49ccd9bc7/node_modules/@react-native-community/netinfo"
react-native-pager-view:
:path: "../../../node_modules/.pnpm/react-native-pager-view@6.9.1_react-native@0.86.0-rc.2_@babel+core@7.29.0_@react-native_14432c7732db1b714e78f47c9f489141/node_modules/react-native-pager-view"
:path: "../../../node_modules/.pnpm/react-native-pager-view@8.0.2_react-native@0.86.0-rc.2_@babel+core@7.29.0_@react-native_6b4b0fdd3eb0bf5714ad508f011817e1/node_modules/react-native-pager-view"
react-native-safe-area-context:
:path: "../../../node_modules/.pnpm/react-native-safe-area-context@5.7.0_react-native@0.86.0-rc.2_@babel+core@7.29.0_@react_6cf9b087dcc8c4e0435d8137de00cfae/node_modules/react-native-safe-area-context"
react-native-segmented-control:
Expand Down Expand Up @@ -4136,7 +4139,7 @@ SPEC CHECKSUMS:
React-mutationobservernativemodule: f8d819437fb342b8ffe815acbb8eadd099eb22c6
react-native-keyboard-controller: b54dc0d54c67c3c62b7463a5600c1acadaff997a
react-native-netinfo: 4319d381f35bc11b53dafebd5cd99c04c66a9fb4
react-native-pager-view: a3cb9627d41fa2f31ad2b312af6e3f10f831f26d
react-native-pager-view: c9f0c94cc64041ac70f28f79527ea2ac664cf25c
react-native-safe-area-context: 6b4966397ada0f7dd481e4486a2ef936834861a1
react-native-segmented-control: bf6e0032726727498e18dd437ae88afcdbc18e99
react-native-skia: 93613a9428b7f33530e5e085e95a89f023548320
Expand Down Expand Up @@ -4191,6 +4194,7 @@ SPEC CHECKSUMS:
SDWebImageAVIFCoder: afe194a084e851f70228e4be35ef651df0fc5c57
SDWebImageSVGCoder: 15a300a97ec1c8ac958f009c02220ac0402e936c
SDWebImageWebPCoder: e38c0a70396191361d60c092933e22c20d5b1380
SwiftUIIntrospect: fee9aa07293ee280373a591e1824e8ddc869ba5d
TestExpoUi: e376582270047f880c7e44afc7f912c97b14da54
UMAppLoader: b7d22886a244871c20b5a8f2fcea13c18534e677
WorkletsTester: 15a12097d67f73fd107ab7dc8236cab805e472b0
Expand Down
2 changes: 1 addition & 1 deletion apps/bare-expo/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@
"react-native": "0.86.0-rc.2",
"react-native-gesture-handler": "~2.31.2",
"react-native-keyboard-controller": "^1.21.8",
"react-native-pager-view": "6.9.1",
"react-native-pager-view": "8.0.2",
"react-native-reanimated": "4.3.1",
"react-native-safe-area-context": "5.7.0",
"react-native-screens": "4.25.2",
Expand Down
8 changes: 4 additions & 4 deletions apps/expo-go/ios/Podfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -2668,7 +2668,7 @@ PODS:
- ReactCommon/turbomodule/core
- SocketRocket
- Yoga
- react-native-pager-view (8.0.1):
- react-native-pager-view (8.0.2):
- boost
- DoubleConversion
- fast_float
Expand Down Expand Up @@ -4242,7 +4242,7 @@ DEPENDENCIES:
- "react-native-keyboard-controller (from `../../../node_modules/.pnpm/react-native-keyboard-controller@1.21.8_patch_hash=0a01a06c301b2ef0c02744515b2380fa632b_5d540240147b1e6a809a2e5dfc7f63ae/node_modules/react-native-keyboard-controller`)"
- "react-native-maps/Maps (from `../../../node_modules/.pnpm/react-native-maps@1.27.2_react-native-web@0.21.2_encoding@0.1.13_react-dom@19.2.3_react_5667e236c2c50f6a54d303a871dda30a/node_modules/react-native-maps`)"
- "react-native-netinfo (from `../../../node_modules/.pnpm/@react-native-community+netinfo@12.0.1_patch_hash=ced0cb79848978ecc3e780a4d812d94868434_cc13d8903dabe0c21fe8763c1ffd52a0/node_modules/@react-native-community/netinfo`)"
- "react-native-pager-view (from `../../../node_modules/.pnpm/react-native-pager-view@8.0.1_react-native@0.86.0-rc.2_@babel+core@7.29.0_@react-native_b05071ae89ad750c1f450711bb192a72/node_modules/react-native-pager-view`)"
- "react-native-pager-view (from `../../../node_modules/.pnpm/react-native-pager-view@8.0.2_react-native@0.86.0-rc.2_@babel+core@7.29.0_@react-native_6b4b0fdd3eb0bf5714ad508f011817e1/node_modules/react-native-pager-view`)"
- "react-native-safe-area-context (from `../../../node_modules/.pnpm/react-native-safe-area-context@5.7.0_react-native@0.86.0-rc.2_@babel+core@7.29.0_@react_6cf9b087dcc8c4e0435d8137de00cfae/node_modules/react-native-safe-area-context`)"
- "react-native-segmented-control (from `../../../node_modules/.pnpm/@react-native-segmented-control+segmented-control@2.5.7_react-native@0.86.0-rc.2_@babel_413547125b3ab0390f55e29d9f9caef9/node_modules/@react-native-segmented-control/segmented-control`)"
- "react-native-skia (from `../../../node_modules/.pnpm/@shopify+react-native-skia@2.6.2_patch_hash=ba884424a75156115606f768b005e5af9a39e9836f1_17eda521ffc25cf5b86744e3438118bc/node_modules/@shopify/react-native-skia`)"
Expand Down Expand Up @@ -4579,7 +4579,7 @@ EXTERNAL SOURCES:
react-native-netinfo:
:path: "../../../node_modules/.pnpm/@react-native-community+netinfo@12.0.1_patch_hash=ced0cb79848978ecc3e780a4d812d94868434_cc13d8903dabe0c21fe8763c1ffd52a0/node_modules/@react-native-community/netinfo"
react-native-pager-view:
:path: "../../../node_modules/.pnpm/react-native-pager-view@8.0.1_react-native@0.86.0-rc.2_@babel+core@7.29.0_@react-native_b05071ae89ad750c1f450711bb192a72/node_modules/react-native-pager-view"
:path: "../../../node_modules/.pnpm/react-native-pager-view@8.0.2_react-native@0.86.0-rc.2_@babel+core@7.29.0_@react-native_6b4b0fdd3eb0bf5714ad508f011817e1/node_modules/react-native-pager-view"
react-native-safe-area-context:
:path: "../../../node_modules/.pnpm/react-native-safe-area-context@5.7.0_react-native@0.86.0-rc.2_@babel+core@7.29.0_@react_6cf9b087dcc8c4e0435d8137de00cfae/node_modules/react-native-safe-area-context"
react-native-segmented-control:
Expand Down Expand Up @@ -4827,7 +4827,7 @@ SPEC CHECKSUMS:
react-native-keyboard-controller: d543b2ca3fd062e794b4087a3fe0340159545503
react-native-maps: b5af575a371e57847c6d8490e726c08036f7c80f
react-native-netinfo: a0be8c77f8420a60ddf07eb87be1a36f02a1bd65
react-native-pager-view: 899d0774fc9602b6a46eb2ac08febc09f470534d
react-native-pager-view: 2694b7efa49588b1cc3aecb5f513871135f499cc
react-native-safe-area-context: befb5404eb8a16fdc07fa2bebab3568ecabcbb8a
react-native-segmented-control: bf6e0032726727498e18dd437ae88afcdbc18e99
react-native-skia: fc73e9bdc46ebb420a98c9c2be29fee80f565e79
Expand Down
2 changes: 1 addition & 1 deletion apps/expo-go/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@
"react-native-gesture-handler": "~2.31.2",
"react-native-keyboard-controller": "^1.21.8",
"react-native-maps": "1.27.2",
"react-native-pager-view": "8.0.1",
"react-native-pager-view": "8.0.2",
"react-native-reanimated": "4.3.1",
"react-native-safe-area-context": "5.7.0",
"react-native-screens": "4.25.2",
Expand Down
2 changes: 1 addition & 1 deletion apps/native-component-list/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@
"react-native-gesture-handler": "~2.31.2",
"react-native-keyboard-controller": "^1.21.8",
"react-native-maps": "1.27.2",
"react-native-pager-view": "8.0.0",
"react-native-pager-view": "8.0.2",
"react-native-paper": "^5.12.5",
"react-native-reanimated": "4.3.1",
"react-native-safe-area-context": "5.7.0",
Expand Down
8 changes: 3 additions & 5 deletions docs/pages/eas/ai/mcp.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,6 @@ import { Terminal } from '~/ui/components/Snippet';
import { Step } from '~/ui/components/Step';
import { VideoBoxLink } from '~/ui/components/VideoBoxLink';

> **info** Expo MCP Server requires an [EAS paid plan](https://expo.dev/pricing).

[Model Context Protocol (MCP)](https://modelcontextprotocol.io/) is a standard protocol that allows AI models to integrate with external data sources, providing enhanced context for more precise responses. It enables AI-assisted tools like agents to understand your development environment more deeply, allowing them to provide better assistance with your codebase.

Expo MCP Server is a remote MCP server hosted by Expo that integrates with popular AI-assisted tools such as Claude Code, Cursor, VS Code, and others, enabling them to interact directly with your Expo projects.
Expand Down Expand Up @@ -62,8 +60,8 @@ Your AI-assisted tools can autonomously write the code, capture screenshots to v
The complete table of [MCP capabilities](#available-mcp-capabilities) documents the tools and prompts Expo MCP Server provides to AI-assisted tools.

<Prerequisites>
<Requirement title="Expo account with an EAS paid plan">
An [EAS paid plan](https://expo.dev/pricing) is required to use Expo MCP Server.
<Requirement title="Expo account">
An Expo account is required to use Expo MCP Server.
</Requirement>
<Requirement title="An Expo project on the latest SDK">
Create a project with `npx create-expo-app@latest --template default@sdk-56`, or ensure your
Expand Down Expand Up @@ -187,7 +185,7 @@ Expo MCP Server provides two types of capabilities depending on your setup:

### Server capabilities

Server capabilities are available with just the remote MCP server connection, without needing to set up a local development server. The **search_documentation** tool is an example of a server capability.
Server capabilities are available with just the remote MCP server connection, without needing to set up a local development server.

### Local capabilities

Expand Down
34 changes: 17 additions & 17 deletions docs/pages/eas/observe/get-started.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -51,32 +51,32 @@ Wrap your root layout with `AppMetricsRoot` (SDK 55) or `ObserveRoot` (SDK 56 an

<Tabs>

<Tab label="SDK 55">
<Tab label="SDK 56 and later">

```tsx app/_layout.tsx
import { Stack } from 'expo-router';
import { AppMetricsRoot } from 'expo-observe';
import { ObserveRoot } from 'expo-observe';

function RootLayout() {
return <Stack />;
}

export default AppMetricsRoot.wrap(RootLayout);
export default ObserveRoot.wrap(RootLayout);
```

</Tab>

<Tab label="SDK 56 and later">
<Tab label="SDK 55">

```tsx app/_layout.tsx
import { Stack } from 'expo-router';
import { ObserveRoot } from 'expo-observe';
import { AppMetricsRoot } from 'expo-observe';

function RootLayout() {
return <Stack />;
}

export default ObserveRoot.wrap(RootLayout);
export default AppMetricsRoot.wrap(RootLayout);
```

</Tab>
Expand All @@ -98,19 +98,20 @@ Call `markInteractive()` when your app is fully ready for user interaction. This

<Tabs>

<Tab label="SDK 55">
<Tab label="SDK 56">

```tsx app/_layout.tsx
import { Stack } from 'expo-router';
import * as SplashScreen from 'expo-splash-screen';
import { AppMetrics, AppMetricsRoot } from 'expo-observe';
import { ObserveRoot, useObserve } from 'expo-observe';
import { useEffect, useState } from 'react';

// Keep the splash screen visible while we fetch resources
SplashScreen.preventAutoHideAsync();

function RootLayout() {
const [isReady, setIsReady] = useState(false);
const { markInteractive } = useObserve();

useEffect(() => {
async function prepare() {
Expand All @@ -130,9 +131,9 @@ function RootLayout() {
useEffect(() => {
if (isReady) {
SplashScreen.hide();
AppMetrics.markInteractive();
markInteractive();
}
}, [isReady]);
}, [isReady, markInteractive]);

if (!isReady) {
return null;
Expand All @@ -141,25 +142,24 @@ function RootLayout() {
return <Stack />;
}

export default AppMetricsRoot.wrap(RootLayout);
export default ObserveRoot.wrap(RootLayout);
```

</Tab>

<Tab label="SDK 56">
<Tab label="SDK 55">

```tsx app/_layout.tsx
import { Stack } from 'expo-router';
import * as SplashScreen from 'expo-splash-screen';
import { ObserveRoot, useObserve } from 'expo-observe';
import { AppMetrics, AppMetricsRoot } from 'expo-observe';
import { useEffect, useState } from 'react';

// Keep the splash screen visible while we fetch resources
SplashScreen.preventAutoHideAsync();

function RootLayout() {
const [isReady, setIsReady] = useState(false);
const { markInteractive } = useObserve();

useEffect(() => {
async function prepare() {
Expand All @@ -179,9 +179,9 @@ function RootLayout() {
useEffect(() => {
if (isReady) {
SplashScreen.hide();
markInteractive();
AppMetrics.markInteractive();
}
}, [isReady, markInteractive]);
}, [isReady]);

if (!isReady) {
return null;
Expand All @@ -190,7 +190,7 @@ function RootLayout() {
return <Stack />;
}

export default ObserveRoot.wrap(RootLayout);
export default AppMetricsRoot.wrap(RootLayout);
```

</Tab>
Expand Down
40 changes: 20 additions & 20 deletions docs/pages/eas/observe/reference/metrics.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -102,15 +102,15 @@ This metric is not reported automatically. To start measuring it, call `markInte

<Tabs>

<Tab label="SDK 55">
<Tab label="SDK 56 and later">

Call `AppMetrics.markInteractive()` from anywhere in your app.
Call `markInteractive()` from the `useObserve()` hook inside a component.

</Tab>

<Tab label="SDK 56 and later">
<Tab label="SDK 55">

Call `markInteractive()` from the `useObserve()` hook inside a component.
Call `AppMetrics.markInteractive()` from anywhere in your app.

</Tab>

Expand Down Expand Up @@ -163,12 +163,14 @@ You can attach your own params to the TTI event by passing them to `markInteract

<Tabs>

<Tab label="SDK 55">
<Tab label="SDK 56 and later">

```tsx
import { AppMetrics } from 'expo-observe';
import { useObserve } from 'expo-observe';

AppMetrics.markInteractive({
const { markInteractive } = useObserve();

markInteractive({
params: {
tenant: 'acme',
cohort: 'beta',
Expand All @@ -179,14 +181,12 @@ AppMetrics.markInteractive({

</Tab>

<Tab label="SDK 56 and later">
<Tab label="SDK 55">

```tsx
import { useObserve } from 'expo-observe';

const { markInteractive } = useObserve();
import { AppMetrics } from 'expo-observe';

markInteractive({
AppMetrics.markInteractive({
params: {
tenant: 'acme',
cohort: 'beta',
Expand All @@ -203,27 +203,27 @@ You can also override the route name attached to the event, which is otherwise p

<Tabs>

<Tab label="SDK 55">
<Tab label="SDK 56 and later">

```tsx
import { AppMetrics } from 'expo-observe';
import { useObserve } from 'expo-observe';

AppMetrics.markInteractive({
const { markInteractive } = useObserve();

markInteractive({
routeName: '/feed',
params: { cacheHit: true },
});
```

</Tab>

<Tab label="SDK 56 and later">
<Tab label="SDK 55">

```tsx
import { useObserve } from 'expo-observe';

const { markInteractive } = useObserve();
import { AppMetrics } from 'expo-observe';

markInteractive({
AppMetrics.markInteractive({
routeName: '/feed',
params: { cacheHit: true },
});
Expand Down
Loading
Loading