Table of content
Build robust, productivity apps with Expo.
Installation
npx claude-plugins install @expo/expo-plugins/expo-app-design
Contents
Folders: skills
Files: README.md
Documentation
Build robust, productivity apps with Expo. Domain-specific knowledge for building mobile applications using Expo and React Native.
What This Plugin Does
- Provides UI guidelines following Apple Human Interface Guidelines
- Covers Expo Router navigation patterns (stacks, tabs, modals, sheets)
- Explains native iOS controls, SF Symbols, animations, and visual effects
- Guides API route creation with EAS Hosting
- Covers data fetching patterns with React Query and offline support
- Helps set up Tailwind CSS v4 with NativeWind v5
- Explains DOM components for running web code in native apps
When to Use
- Building new Expo apps from scratch
- Adding navigation, styling, or animations
- Setting up API routes or data fetching
- Integrating web libraries via DOM components
- Configuring Tailwind CSS for React Native
Skills Included
- building-ui - UI components, navigation, styling, and native controls
- api-routes - Server-side API routes with EAS Hosting
- data-fetching - Network requests, caching, and offline support
- dev-client - Development builds and TestFlight distribution
- tailwind-setup - Tailwind CSS v4 configuration
- use-dom - Web code integration via DOM components
License
MIT
Included Skills
This plugin includes 5 skill definitions:
building-native-ui
Complete guide for building beautiful apps with Expo Router. Covers fundamentals, styling, components, navigation, animations, patterns, and native tabs.
View skill definition
Expo UI Guidelines
References
Consult these resources as needed:
- ./references/route-structure.md – Route file conventions, dynamic routes, query parameters, groups, and folder organization
- ./references/tabs.md – Native tab bar with NativeTabs, migration from JS tabs, iOS 26 features
- ./references/icons.md – SF Symbols with expo-symbols, common icon names, animations, and weights
- ./references/controls.md – Native iOS controls: Switch, Slider, SegmentedControl, DateTimePicker, Picker
- ./references/visual-effects.md – Blur effects with expo-blur and liquid glass with expo-glass-effect
- ./references/animations.md – Reanimated animations: entering, exiting, layout, scroll-driven, and gestures
- ./references/search.md – Search bar integration with headers, useSearch hook, and filtering patterns
- ./references/gradients.md – CSS gradients using experimental_backgroundImage (New Architecture only)
- ./references/media.md – Media handling for Expo Router including camera, audio, video, and file saving
- ./references/storage.md – Data storage patterns including SQLite, AsyncStorage, and SecureStore
- ./references/webgpu-three.md – 3D graphics, games, and GPU-powered visualizations with WebGPU and Three.js
- ./references/toolbars-and-headers.md – Customizing stack headers and toolbar with buttons, menus, and search bars in expo-router app. Available only on iOS.
Running the App
CRITICAL: Always try Expo Go first before creating custom builds.
Most
…(truncated)
expo-api-routes
Guidelines for creating API routes in Expo Router with EAS Hosting
View skill definition
When to Use API Routes
Use API routes when you need:
- Server-side secrets — API keys, database credentials, or tokens that must never reach the client
- Database operations — Direct database queries that shouldn’t be exposed
- Third-party API proxies — Hide API keys when calling external services (OpenAI, Stripe, etc.)
- Server-side validation — Validate data before database writes
- Webhook endpoints — Receive callbacks from services like Stripe or GitHub
- Rate limiting — Control access at the server level
- Heavy computation — Offload processing that would be slow on mobile
When NOT to Use API Routes
Avoid API routes when:
- Data is already public — Use direct fetch to public APIs instead
- No secrets required — Static data or client-safe operations
- Real-time updates needed — Use WebSockets or services like Supabase Realtime
- Simple CRUD — Consider Firebase, Supabase, or Convex for managed backends
- File uploads — Use direct-to-storage uploads (S3 presigned URLs, Cloudflare R2)
- Authentication only — Use Clerk, Auth0, or Firebase Auth instead
File Structure
API routes live in the app directory with +api.ts suffix:
app/
api/
hello+api.ts → GET /api/hello
users+api.ts → /api/users
users/[id]+api.ts → /api/users/:id
(tabs)/
index.tsx
Basic API Route
// app/api/hello+api.ts
export function GET(request: Request) {
return Response.json({ m
...(truncated)
</details>
### expo-dev-client
> Build and distribute Expo development clients locally or via TestFlight
<details>
<summary>View skill definition</summary>
Use EAS Build to create development clients for testing native code changes on physical devices. Use this for creating custom Expo Go clients for testing branches of your app.
## Important: When Development Clients Are Needed
**Only create development clients when your app requires custom native code.** Most apps work fine in Expo Go.
You need a dev client ONLY when using:
- Local Expo modules (custom native code)
- Apple targets (widgets, app clips, extensions)
- Third-party native modules not in Expo Go
**Try Expo Go first** with `npx expo start`. If everything works, you don't need a dev client.
## EAS Configuration
Ensure `eas.json` has a development profile:
```json
{
"cli": {
"version": ">= 16.0.1",
"appVersionSource": "remote"
},
"build": {
"production": {
"autoIncrement": true
},
"development": {
"autoIncrement": true,
"developmentClient": true
}
},
"submit": {
"production": {},
"development": {}
}
}
Key settings:
developmentClient: true- Bundles expo-dev-client for development buildsautoIncrement: true- Automatically increments build numbersappVersionSource: "remote"- Uses EAS as the source of truth for version numbers
Building for TestFlight
Build iOS dev client and submit to TestFlight in one command:
eas build -p ios --profile development --submit
This will:
- Build the development client in the cloud
- Automatically submit to App Store Connect
- Send y
…(truncated)
expo-tailwind-setup
Set up Tailwind CSS v4 in Expo with react-native-css and NativeWind v5 for universal styling
View skill definition
Tailwind CSS Setup for Expo with react-native-css
This guide covers setting up Tailwind CSS v4 in Expo using react-native-css and NativeWind v5 for universal styling across iOS, Android, and Web.
Overview
This setup uses:
- Tailwind CSS v4 - Modern CSS-first configuration
- react-native-css - CSS runtime for React Native
- NativeWind v5 - Metro transformer for Tailwind in React Native
- @tailwindcss/postcss - PostCSS plugin for Tailwind v4
Installation
# Install dependencies
npx expo install tailwindcss@^4 nativewind@5.0.0-preview.2 react-native-css@0.0.0-nightly.5ce6396 @tailwindcss/postcss tailwind-merge clsx
Add resolutions for lightningcss compatibility:
// package.json
{
"resolutions": {
"lightningcss": "1.30.1"
}
}
- autoprefixer is not needed in Expo because of lightningcss
- postcss is included in expo by default
Configuration Files
Metro Config
Create or update metro.config.js:
// metro.config.js
const { getDefaultConfig } = require("expo/metro-config");
const { withNativewind } = require("nativewind/metro");
/** @type {import('expo/metro-config').MetroConfig} */
const config = getDefaultConfig(__dirname);
module.exports = withNativewind(config, {
// inline variables break PlatformColor in CSS variables
inlineVariables: false,
// We add className support manually
globalClassNamePolyfill: false,
});
PostCSS Config
Create postcss.config.mjs:
// postcss.confi
...(truncated)
</details>
### native-data-fetching
> Use when implementing or debugging ANY network request, API call, or data fetching. Covers fetch API, axios, React Query, SWR, error handling, caching strategies, offline support.
<details>
<summary>View skill definition</summary>
# Expo Networking
**You MUST use this skill for ANY networking work including API requests, data fetching, caching, or network debugging.**
## When to Use
Use this router when:
- Implementing API requests
- Setting up data fetching (React Query, SWR)
- Debugging network failures
- Implementing caching strategies
- Handling offline scenarios
- Authentication/token management
- Configuring API URLs and environment variables
## Preferences
- Avoid axios, prefer expo/fetch
## Common Issues & Solutions
### 1. Basic Fetch Usage
**Simple GET request**:
```tsx
const fetchUser = async (userId: string) => {
const response = await fetch(`https://api.example.com/users/${userId}`);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return response.json();
};
POST request with body:
const createUser = async (userData: UserData) => {
const response = await fetch("https://api.example.com/users", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${token}`,
},
body: JSON.stringify(userData),
});
if (!response.ok) {
const error = await response.json();
throw new Error(error.message);
}
return response.json();
};
2. React Query (TanStack Query)
Setup:
// app/_layout.tsx
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
const queryClient = new QueryClient({
defaultOptions: {
queries: {
...(truncated)
</details>
## Source
[View on GitHub](https://github.com/expo/skills)