π Production-Ready Expo Starter Kit - Mobile app template with 20+ pre-built UI components, TypeScript, NativeWind (Tailwind CSS), and platform-specific behaviors for iOS/Android.
Stop building UI components from scratch! This Expo starter template comes with:
- β 20+ Pre-built Components - Buttons, Cards, Dialogs, Bottom Sheets, and more
- β Platform-Specific UI - Automatic iOS/Android adaptations
- β Dark Mode Ready - System-aware theme switching
- β Permission Management - Unified API for all device permissions
- β TypeScript First - Full type safety out of the box
- β Production Ready - Best practices and scalable architecture
- π± Mobile App MVPs - Launch faster with pre-built components
- π’ Enterprise Apps - Scalable architecture and TypeScript safety
- π¨ Design Systems - Consistent UI across iOS and Android
- π Startups - Focus on your business logic, not UI implementation
- π¨ Complete UI Component Library - 20+ pre-built components with iOS/Android platform-specific behaviors
- π― TypeScript - Full type safety and IntelliSense support
- π¨ NativeWind - Tailwind CSS for React Native with dark mode support
- π Expo Router - File-based routing with typed navigation
- π Permission Management - Unified permission handling for camera, location, notifications, etc.
- π± Platform-Specific Components - Automatic iOS/Android adaptations
- π Dark Mode - Built-in theme support with automatic system detection
- βΏ Accessibility - WCAG compliant components with proper ARIA labels
- Layout: SafeAreaView, ScrollView, KeyboardAvoidingView
- Typography: Text with variants (h1-h6, p, lead, muted, code)
- Buttons: Multiple variants (primary, secondary, destructive, outline, ghost, link)
- Forms: Input, Label, Switch, Checkbox
- Feedback: Dialog, Sheet (Bottom Sheet), Drawer
- Display: Card, Badge
- Navigation: Hamburger Menu, Tab Navigation
- Utilities: Permission Requester, Theme Provider
- UI Showcase (
/app/(tabs)/index.tsx) - Interactive component gallery - Menu Demo (
/app/(tabs)/menu-demo.tsx) - Hamburger menu implementation - Permissions Demo (
/app/(tabs)/permissions-demo.tsx) - Permission management UI
βββ app/ # π± Expo Router screens
β βββ (tabs)/ # π Tab navigation
β β βββ index.tsx # Component showcase
β β βββ menu-demo.tsx # Menu examples
β β βββ permissions-demo.tsx # Permission examples
β βββ _layout.tsx # π¨ Root layout
βββ components/
β βββ ui/ # π¨ UI component library (20+ components)
β βββ error-boundary/ # Error handling components
βββ hooks/ # πͺ Custom React hooks
βββ constants/ # π App constants & colors
βββ config/ # βοΈ App configuration
βββ assets/ # πΌοΈ Images, fonts, etc.
Some features require a development build instead of Expo Go:
- Push Notifications - Requires development build (SDK 53+)
- Camera - May have limited functionality
- Other native modules - Some features work better in dev builds
To create a development build:
npx eas build --profile development --platform ios
npx eas build --profile development --platform android- Node.js 18+ and npm/yarn
- iOS Simulator (Mac only) or Android Studio
- Expo Go app on your physical device (optional)
-
Clone the template
git clone https://github.com/yourusername/expo-starter-template.git my-app cd my-app -
Install dependencies
npm install # or yarn install -
Start the development server
npx expo start
-
Run on your device
- Press
ifor iOS simulator - Press
afor Android emulator - Scan QR code with Expo Go app
- Press
expo-nativewind-template/
βββ app/ # App routes (Expo Router)
β βββ (tabs)/ # Tab navigation screens
β β βββ _layout.tsx # Tab layout configuration
β β βββ index.tsx # UI component showcase
β β βββ menu-demo.tsx # Hamburger menu demo
β β βββ permissions-demo.tsx # Permissions demo
β βββ _layout.tsx # Root layout with providers
β βββ +not-found.tsx # 404 screen
βββ components/
β βββ ui/ # UI component library
β βββ button.tsx
β βββ card.tsx
β βββ dialog.tsx
β βββ sheet.tsx
β βββ theme.tsx # Theme provider
β βββ ... # Other components
βββ assets/ # Images, fonts, etc.
βββ hooks/ # Custom React hooks
βββ constants/ # App constants
βββ package.json
import { Button, Text, Card, SafeAreaView } from '@/components/ui';
export default function MyScreen() {
return (
<SafeAreaView className="flex-1 p-4">
<Card>
<Text variant="h2">Welcome!</Text>
<Button onPress={() => console.log('Pressed')}>
<Text>Get Started</Text>
</Button>
</Card>
</SafeAreaView>
);
}Components automatically adapt to the platform:
// Button uses TouchableOpacity on iOS, Pressable with ripple on Android
<Button onPress={handlePress}>
<Text>Platform Adaptive Button</Text>
</Button>
// Dialog animations differ by platform
<Dialog open={open} onOpenChange={setOpen}>
<DialogContent>
{/* iOS: slide animation, Android: fade animation */}
</DialogContent>
</Dialog>import { PermissionRequester, useCameraPermissions } from '@/components/ui';
// Using the component
<PermissionRequester permission="location">
{({ status, requestPermission }) => (
<Button onPress={requestPermission}>
<Text>{status === 'granted' ? 'Access Granted' : 'Request Access'}</Text>
</Button>
)}
</PermissionRequester>
// Using the hook for camera (special case)
const [permission, requestPermission] = useCameraPermissions();This template uses NativeWind (Tailwind for React Native):
// Using className for styling
<View className="flex-1 bg-background p-4">
<Text className="text-lg font-bold text-primary">Hello World</Text>
<Button className="mt-4" variant="secondary">
<Text>Click me</Text>
</Button>
</View>
// Dark mode is automatic
<Text className="text-foreground">Adapts to dark/light mode</Text>Edit global.css to customize your theme:
@layer base {
:root {
--background: 0 0% 100%;
--foreground: 222.2 84% 4.9%;
--primary: 221.2 83.2% 53.3%;
/* ... other colors */
}
.dark {
--background: 222.2 84% 4.9%;
--foreground: 210 40% 98%;
/* ... dark mode colors */
}
}- Create component in
/components/ui/ - Export from
/components/ui/index.ts - Follow existing patterns for platform-specific behavior
For platform-specific implementations:
components/ui/
βββ button.tsx # Shared logic
βββ button.ios.tsx # iOS specific (optional)
βββ button.android.tsx # Android specific (optional)
# iOS
eas build --platform ios --profile development
# Android
eas build --platform android --profile development# iOS
eas build --platform ios --profile production
# Android
eas build --platform android --profile production| Library | Version | Description | Documentation |
|---|---|---|---|
| Expo SDK | ~53.0.0 | React Native framework | Docs |
| React Native | 0.74.5 | Mobile framework | Docs |
| TypeScript | ^5.3.3 | Type safety | Docs |
| Expo Router | ~3.5.23 | File-based routing | Docs |
| NativeWind | ^4.0.0 | Tailwind for RN | Docs |
| Library | Purpose | Documentation |
|---|---|---|
| @gorhom/bottom-sheet | Bottom sheets | Docs |
| react-native-gesture-handler | Gesture handling | Docs |
| react-native-reanimated | Animations | Docs |
| lucide-react-native | Icon library | Icons |
| class-variance-authority | Component variants | Docs |
| Library | Purpose | Documentation |
|---|---|---|
| expo-camera | Camera access | API |
| expo-location | Location services | API |
| expo-media-library | Photo library | API |
| expo-notifications | Push notifications | API |
| expo-contacts | Contacts access | API |
expo starter template, expo ui components, react native starter kit, expo typescript template, react native ui kit, expo tailwind template, nativewind starter, expo component library, react native boilerplate, expo production template, mobile app starter, cross-platform ui components
Can I use this template for commercial projects?
Yes! This template is MIT licensed, meaning you can use it for commercial projects, modify it, and distribute it.
How do I add custom colors to the theme?
Edit the global.css file and add your custom colors to the :root and .dark selectors. NativeWind will automatically generate the utility classes.
Do the components support iPad/tablets?
Yes, the components are responsive and work on tablets. You may want to adjust some layouts for larger screens using responsive utilities.
Can I use this with React Native CLI instead of Expo?
While this template is optimized for Expo, most components will work with React Native CLI. You'll need to replace Expo-specific packages with their React Native equivalents.
If this template helps you build your app faster, please consider:
- β Starring the repository
- π¦ Sharing it on Twitter
- π¬ Leaving feedback in Issues
- π€ Contributing improvements
Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.
- Fork the repository
- Create your feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
Current version: 0.1.0 - See CHANGELOG.md for version history.
- Expo Team for the amazing framework
- NativeWind Team for bringing Tailwind to React Native
- Gorhom for the bottom sheet library
- Software Mansion for gesture handler and reanimated
- All contributors who help improve this template
Built with β€οΈ for the React Native community
If you found this helpful, please β the repository!
