Build or update the BlueBubbles external channel plugin for Moltbot (extension package, REST...
npx skills add dam2onkid/solo-dev-skills --skill "expo-dev"
Install specific skill from multi-skill repository
# Description
Build universal native apps (Android, iOS, web) using Expo framework with React Native. Use when creating new Expo projects, configuring Expo Router navigation (tabs, stacks, drawers), using Expo SDK packages (camera, notifications, storage, location), building with EAS Build, deploying to app stores, handling app configuration (app.json/app.config.js), implementing deep linking, or managing development workflows with Expo CLI.
# SKILL.md
name: expo-dev
description: Build universal native apps (Android, iOS, web) using Expo framework with React Native. Use when creating new Expo projects, configuring Expo Router navigation (tabs, stacks, drawers), using Expo SDK packages (camera, notifications, storage, location), building with EAS Build, deploying to app stores, handling app configuration (app.json/app.config.js), implementing deep linking, or managing development workflows with Expo CLI.
Expo Dev
Build universal native apps from a single TypeScript/JavaScript codebase.
Quick Reference
Project Setup
# Create new project
npx create-expo-app@latest my-app
cd my-app
# Start development
npx expo start
# Install SDK packages
npx expo install expo-camera expo-notifications expo-location
Project Structure (Expo Router)
app/
├── _layout.tsx # Root layout (navigation container)
├── index.tsx # Home screen (/)
├── [id].tsx # Dynamic route (/123)
├── (tabs)/ # Tab group
│ ├── _layout.tsx # Tab navigator config
│ ├── index.tsx # First tab
│ └── settings.tsx # Second tab
└── (auth)/ # Route group (no URL segment)
├── _layout.tsx
├── login.tsx
└── register.tsx
Expo Router Navigation
Stack Navigator
import { Stack } from "expo-router";
export default function RootLayout() {
return (
<Stack screenOptions={{ headerStyle: { backgroundColor: "#f4511e" } }}>
<Stack.Screen name="index" options={{ title: "Home" }} />
<Stack.Screen name="details" options={{ title: "Details" }} />
</Stack>
);
}
Tab Navigator
import { Tabs } from "expo-router";
import { MaterialIcons } from "@expo/vector-icons";
export default function TabLayout() {
return (
<Tabs>
<Tabs.Screen
name="index"
options={{
title: "Home",
tabBarIcon: ({ color }) => (
<MaterialIcons name="home" size={28} color={color} />
),
}}
/>
<Tabs.Screen name="settings" options={{ title: "Settings" }} />
</Tabs>
);
}
Navigation Actions
import { router, useLocalSearchParams, Link } from "expo-router";
// Imperative navigation
router.push("/details");
router.push({ pathname: "/user/[id]", params: { id: "123" } });
router.replace("/home");
router.back();
// Get route params
const { id } = useLocalSearchParams<{ id: string }>();
// Declarative navigation
<Link href="/about">About</Link>;
Common SDK Packages
| Package | Purpose | Install |
|---|---|---|
expo-camera |
Camera access | npx expo install expo-camera |
expo-image-picker |
Select images/videos | npx expo install expo-image-picker |
expo-notifications |
Push notifications | npx expo install expo-notifications |
expo-location |
GPS location | npx expo install expo-location |
expo-secure-store |
Encrypted storage | npx expo install expo-secure-store |
expo-file-system |
File operations | npx expo install expo-file-system |
expo-image |
Optimized images | npx expo install expo-image |
expo-font |
Custom fonts | npx expo install expo-font |
expo-splash-screen |
Splash screen | npx expo install expo-splash-screen |
expo-haptics |
Haptic feedback | npx expo install expo-haptics |
EAS Build & Deploy
# Install EAS CLI
npm install -g eas-cli
# Login & configure
eas login
eas build:configure
# Build for platforms
eas build --platform android
eas build --platform ios
eas build --platform all
# Build profiles (eas.json)
eas build --profile development
eas build --profile preview
eas build --profile production
# Submit to stores
eas submit --platform android
eas submit --platform ios
App Configuration
app.json / app.config.js
{
"expo": {
"name": "My App",
"slug": "my-app",
"version": "1.0.0",
"orientation": "portrait",
"icon": "./assets/icon.png",
"splash": { "image": "./assets/splash.png", "backgroundColor": "#ffffff" },
"ios": { "bundleIdentifier": "com.company.myapp", "supportsTablet": true },
"android": {
"package": "com.company.myapp",
"adaptiveIcon": { "foregroundImage": "./assets/adaptive-icon.png" }
},
"plugins": ["expo-camera", "expo-notifications"]
}
}
Resources
| Reference | Description |
|---|---|
references/sdk-packages.md |
Camera, notifications, location, storage APIs |
references/eas-build.md |
Build profiles, submit, CI/CD |
references/routing-guide.md |
Expo Router navigation patterns |
references/data-fetching.md |
React Query setup & patterns |
references/styling-guide.md |
Uniwind (Tailwind) & Unistyles |
references/component-patterns.md |
Compound, polymorphic, HOC patterns |
references/common-patterns.md |
Auth, forms, infinite scroll |
references/file-organization.md |
Project structure conventions |
references/loading-and-error-state.md |
Skeleton, error boundary, empty states |
references/performance.md |
FlatList, memoization, animations |
references/typescript-standards.md |
Types, generics, utilities |
# Supported AI Coding Agents
This skill is compatible with the SKILL.md standard and works with all major AI coding agents:
Learn more about the SKILL.md standard and how to use these skills with your preferred AI coding agent.