Skip to content

■ SKILLS // SKILL SPECS

expo-app-design

Build robust, productivity apps with Expo.

■ [!] ON THIS PAGE ▼
■ INSTALL // npx @self.md/cli install expo-app-design
AuthorEvan Bacon
Namespace@expo/expo-plugins
Category#general
Version1.0.0
Stars★ 784
Downloads↓ 2
Verification[ ✓ ] self.md verified

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

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 builds
  • autoIncrement: true - Automatically increments build numbers
  • appVersionSource: "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:

  1. Build the development client in the cloud
  2. Automatically submit to App Store Connect
  3. Send y

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 [email protected] [email protected] @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)