expo

SKILL.md

Expo

Managed React Native development platform.

When to Use

  • Rapid mobile prototyping
  • React Native without native code
  • Over-the-air updates
  • Cross-platform from single codebase

Quick Start

# Create new project
npx create-expo-app my-app
cd my-app
npx expo start
import { Text, View } from "react-native";

export default function App() {
  return (
    <View style={{ flex: 1, justifyContent: "center", alignItems: "center" }}>
      <Text>Hello Expo!</Text>
    </View>
  );
}

Core Concepts

Expo Router

// app/_layout.tsx
import { Stack } from "expo-router";

export default function Layout() {
  return (
    <Stack>
      <Stack.Screen name="index" options={{ title: "Home" }} />
      <Stack.Screen name="[id]" options={{ title: "Details" }} />
    </Stack>
  );
}

// app/index.tsx
import { Link } from "expo-router";

export default function Home() {
  return (
    <View>
      <Link href="/user/123">Go to User</Link>
    </View>
  );
}

// app/user/[id].tsx
import { useLocalSearchParams } from "expo-router";

export default function User() {
  const { id } = useLocalSearchParams();
  return <Text>User: {id}</Text>;
}

Expo SDK

import * as ImagePicker from "expo-image-picker";
import * as Location from "expo-location";

async function pickImage() {
  const result = await ImagePicker.launchImageLibraryAsync({
    mediaTypes: ImagePicker.MediaTypeOptions.Images,
    quality: 1,
  });

  if (!result.canceled) {
    return result.assets[0].uri;
  }
}

async function getLocation() {
  const { status } = await Location.requestForegroundPermissionsAsync();
  if (status !== "granted") return null;

  return await Location.getCurrentPositionAsync({});
}

Common Patterns

EAS Build

// eas.json
{
  "build": {
    "development": {
      "developmentClient": true,
      "distribution": "internal"
    },
    "preview": {
      "distribution": "internal"
    },
    "production": {}
  }
}
# Build
eas build --platform all
eas build --profile development

# Submit to stores
eas submit --platform ios
eas submit --platform android

Environment Variables

# .env
EXPO_PUBLIC_API_URL=https://api.example.com
const apiUrl = process.env.EXPO_PUBLIC_API_URL;

Best Practices

Do:

  • Use Expo Router for navigation
  • Leverage EAS for builds
  • Use EXPOPUBLIC for env vars
  • Test on real devices

Don't:

  • Eject unnecessarily
  • Ignore SDK versions
  • Skip OTA update testing
  • Use incompatible libraries

Troubleshooting

Issue Cause Solution
Module not found SDK version mismatch Check compatibility
Build failed Native dependency Use dev client
Metro error Cache issue Clear cache

References

Weekly Installs
2
GitHub Stars
7
First Seen
Feb 10, 2026
Installed on
mcpjam2
claude-code2
replit2
junie2
windsurf2
zencoder2