A production-ready Expo + React Native + TypeScript starter kit with NativeWind (Tailwind CSS), pre-styled UI components, dark mode support, and Expo Router navigation โ designed for building beautiful cross-platform iOS & Android apps quickly. This template brings together best-in-class tools and patterns, including shadcn-style component archite
๐ฑ Expo NativeWind Template
๐ 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.
20+ Pre-built UI Components โข TypeScript โข NativeWind โข Expo Router โข Dark Mode
๐ฏ Why This Template?
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
๐ Perfect For
- ๐ฑ 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
๐ Core Features
- ๐จ 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
๐ฆ What's Included
UI Components
- 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
Demo Screens
- 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
๐๏ธ Project Structure
โโโ 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.
โ ๏ธ Important Notes
Expo Go Limitations
Some features require a development build instead of Expo Go:- Push Notifications - Requires development build (SDK 56+)
- Camera - May have limited functionality
- Other native modules - Some features work better in dev builds
npx eas build --profile development --platform ios
npx eas build --profile development --platform android
๐ ๏ธ Getting Started
Prerequisites
- Node.js 18+ and npm/yarn
- iOS Simulator (Mac only) or Android Studio
- Expo Go app on your physical device (optional)
Installation
- Clone the template
git clone https://github.com/chvvkrishnakumar/expo-nativewind-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
i for iOS simulator
- Press a for Android emulator
- Scan QR code with Expo Go app
๐ Project Structure
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
๐จ Using Components
Basic Example
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> ); }
Platform-Specific Components
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>
Permission Handling
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();
๐จ Styling with NativeWind
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>
๐ง Customization
Theme Colors
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 /
}
}
Adding New Components
- Create component in
/components/ui/ - Export from
/components/ui/index.ts - Follow existing patterns for platform-specific behavior
๐ฑ Platform-Specific Files
For platform-specific implementations:
components/ui/
โโโ button.tsx # Shared logic
โโโ button.ios.tsx # iOS specific (optional)
โโโ button.android.tsx # Android specific (optional)
๐ Building for Production
Development Build
# iOS
eas build --platform ios --profile development
Android
eas build --platform android --profile development
Production Build
# iOS
eas build --platform ios --profile production
Android
eas build --platform android --profile production
๐ Tech Stack & Resources
Core Libraries
| 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 |
UI Libraries
| 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 |
Permission Libraries
| 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 |
๐ค Frequently Asked Questions
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.
๐ Show Your Support
If this template helps you build your app faster, please consider:
- โญ Starring the repository
- ๐ฆ Sharing it on Twitter
- ๐ฌ Leaving feedback in Issues
- ๐ค Contributing improvements
๐ค Contributing
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.
Contributing Guidelines
- 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
๐ License
This project is licensed under the MIT License - see the LICENSE file for details.
๐ท๏ธ Version
Current version: 0.1.0 - See CHANGELOG.md for version history.
๐ Acknowledgments
- 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!