Expo
Validation and quality enforcement for Expo React Native projects.
Installation
First, install the Han CLI tool:
npm install -g @thebushidocollective/hanThen install the plugin:
han plugin install buki-expoOverview
Validation and quality enforcement for Expo React Native projects.
What This Buki Provides
Validation Hooks
- TypeScript Type Check: Runs TypeScript compiler to validate types in Expo projects
- Fast Validation: Provides quick feedback on type errors before commits
- Expo Project Detection: Validates only directories with app.json files
Skills
This buki provides the following skills:
- expo-config: Configuring Expo apps with app.json, app.config.js/ts, and EAS configuration including plugins, build settings, and environment variables
- expo-router: Implementing file-based routing with Expo Router including layouts, dynamic routes, navigation, and deep linking
- expo-modules: Working with Expo SDK modules for camera, location, notifications, file system, and other device APIs
- expo-updates: Implementing over-the-air (OTA) updates with Expo Updates for deploying changes without app store releases
- expo-build: Building and deploying Expo apps with EAS Build including development builds, production builds, and app store submission
Installation
Install via the Han marketplace:
npx @thebushidocollective/han install
Or install manually:
claude plugin marketplace add thebushidocollective/han
claude plugin install buki-expo@han
Usage
Once installed, this buki automatically validates your Expo code:
- When you finish a conversation with Claude Code
- When Claude Code agents complete their work
- Before commits (when combined with git hooks)
The validation runs tsc --noEmit to check for TypeScript type errors without generating output files.
Requirements
- Expo SDK 50 or higher
- TypeScript 5.0 or higher
- Node.js 18 or higher
Why Expo?
Expo is a framework and platform for React Native that makes mobile development faster and easier:
- Managed Workflow: Build apps without touching native code
- EAS (Expo Application Services): Cloud build, updates, and submission
- Expo Router: File-based routing system
- Rich SDK: 50+ modules for device features (camera, location, etc.)
- OTA Updates: Deploy updates instantly without app store review
- Universal Apps: Share code across iOS, Android, and web
- Developer Experience: Fast refresh, debugging tools, and documentation
Features Covered by Skills
Configuration (app.json/app.config.ts)
- App metadata and settings
- Platform-specific configuration
- Plugin system
- Environment variables
- Build profiles
- Deep linking setup
Expo Router
- File-based routing
- Stack, tab, and drawer navigation
- Dynamic routes with parameters
- Layouts and nested routes
- Route groups
- Authentication flows
- Modal routes
- Type-safe navigation
Expo Modules (SDK)
- Camera and image picker
- Location and maps
- Push notifications
- File system and storage
- Secure storage
- Device information
- Background tasks
- Sharing and permissions
OTA Updates
- Automatic update checking
- Manual update triggers
- Update channels
- Runtime versions
- Silent updates
- Update UI patterns
EAS Build
- Development builds
- Preview and production builds
- Environment configuration
- Secrets management
- Version management
- App store submission
- Build monitoring
Quick Start Examples
Create New Expo App
npx create-expo-app@latest my-app
cd my-app
Basic Expo Router App
// app/_layout.tsx
import { Stack } from 'expo-router';
export default function RootLayout() {
return <Stack />;
}
// app/index.tsx
import { Link } from 'expo-router';
import { View, Text } from 'react-native';
export default function Home() {
return (
<View>
<Text>Home Screen</Text>
<Link href="/details">Go to Details</Link>
</View>
);
}
// app/details.tsx
export default function Details() {
return (
<View>
<Text>Details Screen</Text>
</View>
);
}
Using Expo Modules
import { Camera } from 'expo-camera';
import * as Location from 'expo-location';
import * as Notifications from 'expo-notifications';
// Request permissions and use modules
const [cameraPermission] = Camera.useCameraPermissions();
Configure for Production
// app.config.ts
export default {
name: 'MyApp',
slug: 'my-app',
version: '1.0.0',
extra: {
apiUrl: process.env.API_URL,
},
plugins: [
'expo-router',
'expo-camera',
'expo-location',
],
};
Build with EAS
# Install EAS CLI
npm install -g eas-cli
# Login
eas login
# Configure project
eas build:configure
# Build for iOS
eas build --platform ios --profile production
# Build for Android
eas build --platform android --profile production
Project Structure
Recommended structure for Expo apps with Expo Router:
my-app/
âââ app/ # Routes (file-based routing)
â âââ (tabs)/ # Tab navigation group
â â âââ _layout.tsx
â â âââ index.tsx
â â âââ profile.tsx
â âââ _layout.tsx # Root layout
â âââ index.tsx # Home route
âââ components/ # Reusable components
âââ hooks/ # Custom hooks
âââ utils/ # Utility functions
âââ assets/ # Images, fonts, etc.
âââ app.json # Expo configuration
âââ eas.json # EAS Build configuration
âââ package.json
âââ tsconfig.json
Common Expo Modules
Essential modules for most Expo apps:
- expo-router: File-based navigation
- expo-camera: Camera access
- expo-location: Location services
- expo-notifications: Push notifications
- expo-image-picker: Select images/videos
- expo-file-system: File operations
- expo-secure-store: Encrypted storage
- expo-constants: App and device info
- expo-linking: Deep linking
- expo-updates: OTA updates
Development Workflow
Typical Expo development workflow:
- Development:
npx expo start- Start dev server - Testing: Test on iOS Simulator, Android Emulator, or physical devices
- Preview Build:
eas build --profile preview- Internal testing - Production Build:
eas build --profile production- App store release - OTA Updates:
eas update- Deploy JS updates instantly
Testing
Expo apps can be tested with:
- Jest: Unit testing (included by default)
- Detox: End-to-end testing
- Expo Go: Quick testing without builds
- Development Builds: Test with native code
Expo vs Bare React Native
Expo provides:
- Managed workflow (no native code needed)
- EAS cloud services
- Rich module ecosystem
- Faster development
- OTA updates out of the box
Choose bare React Native when you need:
- Custom native modules not in Expo
- Full control over native code
- Specific third-party native libraries
Contributing
See CONTRIBUTING.md for guidelines.
License
MIT License - See LICENSE for details.
Skills
buki-expo:expo-build
Use when building and deploying Expo apps with EAS Build. Covers build configuration, development builds, production builds, and app store submission.
buki-expo:expo-config
Use when configuring Expo apps with app.json, app.config.js, and EAS configuration. Covers app metadata, plugins, build configuration, and environment variables.
buki-expo:expo-modules
Use when working with Expo SDK modules for camera, location, notifications, file system, and other device APIs. Covers permissions, configurations, and best practices.
buki-expo:expo-router
Use when implementing file-based routing in Expo with Expo Router. Covers app directory structure, navigation, layouts, dynamic routes, and deep linking.
buki-expo:expo-updates
Use when implementing over-the-air (OTA) updates with Expo Updates. Covers update configuration, checking for updates, and update strategies.
Hooks
Stop
Runs when the main Claude Code agent has finished responding.
npx -y @thebushidocollective/han hook run --fail-fast --dirs-with app.json -- npx tsc --noEmitSubagentStop
Runs when a Claude Code subagent (Task tool call) has finished responding.
npx -y @thebushidocollective/han hook run --fail-fast --dirs-with app.json -- npx tsc --noEmit