A production-ready React Native boilerplate that just works. Built with Expo Router, TypeScript, and offline-first architecture.
NovaRN is the ultimate React Native boilerplate that eliminates the friction of starting a new project. It's designed for developers who want to build production-ready apps without the boilerplate headaches.
✨ Zero Configuration - Get started in seconds, not hours
🔒 Production-Ready Security - Secure token handling built-in
📡 Offline-First Architecture - Works even when the internet doesn't
🎨 Modern Styling - NativeWind (Tailwind CSS) for beautiful UIs
⚡ Performance Optimized - Lightweight stack with best practices
📚 Well Documented - Comprehensive examples and guides
🛠 Developer Experience - TypeScript, ESLint, and more
# Create a new NovaRN app
npx create-nova-rn MyApp
# Navigate to your project
cd MyApp
# Install dependencies
npm install
# Start the development server
npx expo startThat's it! You now have a fully functional React Native app with authentication, offline support, and a rich component library.
- Zustand for in-memory auth state (user, accessToken)
- expo-secure-store for refresh tokens only
- TanStack Query for automatic 401 handling and silent refresh
Built-in optimistic updates and cache persistence with MMKV. Your app works even when the internet doesn't.
Style your components with familiar Tailwind classes:
<View className="flex-1 justify-center items-center bg-gray-100 dark:bg-gray-900 p-4">
<Text className="text-2xl font-bold text-blue-600 dark:text-blue-400">
Beautiful UI with NativeWind
</Text>
</View>- File-based routing with Expo Router
- Feature-based organization for scalable codebase
- Global error boundaries for crash recovery
- Theme management with light/dark/system mode
| Feature | NovaRN | Ignite | Expo Template |
|---|---|---|---|
| Philosophy | Expo-first, zero native code | Bare React Native | Basic Expo setup |
| Language | TypeScript only | TypeScript + JavaScript | JavaScript/TypeScript |
| Routing | Expo Router (file-based) | React Navigation (manual) | Basic navigation |
| Auth | Complete 401 handling | Manual setup | None |
| Offline | MMKV + Optimistic Updates | Manual setup | None |
| Styling | NativeWind (Tailwind) | StyleSheet | StyleSheet |
| Bundle Size | Lighter, focused stack | Heavier, more opinions | Minimal |
| Learning Curve | Gentle, follows Expo conventions | Steeper, custom patterns | Basic |
| Best For | Fast MVPs, indie devs, startups | Teams needing full native control | Learning Expo |
- Expo SDK 54+ (Expo Go + EAS Build)
- Expo Router (file-based routing)
- TypeScript (strictly typed)
- Zustand (state management)
- TanStack Query + Axios (data fetching with 401 silent refresh)
- expo-secure-store (refresh tokens only)
- MMKV (cache persistence)
- NativeWind (Tailwind CSS for React Native)
- React Native Reanimated (smooth animations)
NovaRNTemplate/
├── app/ # 🗂️ Expo Router (file-based routing)
│ ├── (auth)/ # Auth group (login, signup)
│ │ ├── _layout.tsx # Auth layout wrapper
│ │ └── login.tsx # Login screen
│ ├── (app)/ # App group (protected routes)
│ │ ├── (tabs)/ # Tab navigator
│ │ │ ├── _layout.tsx # Tabs layout
│ │ │ ├── home.tsx # Home screen
│ │ │ └── tasks.tsx # Tasks screen (offline demo)
│ │ └── _layout.tsx # App layout wrapper
│ ├── _layout.tsx # Root layout (auth boundary)
│ └── index.tsx # Entry point
│
├── src/ # 📦 Source code
│ ├── features/ # Feature-based modules
│ │ ├── auth/ # Authentication feature
│ │ │ ├── hooks/
│ │ │ │ └── useAuth.ts # Auth controller
│ │ │ ├── store/
│ │ │ │ └── useAuthStore.ts # Auth state (memory-only)
│ │ │ └── components/
│ │ │ └── LoginForm.tsx # Login form
│ │ └── tasks/ # Tasks feature
│ │ ├── hooks/
│ │ │ └── useTasks.ts # Task management
│ │ └── components/
│ │ └── TaskItem.tsx # Task item
│ ├── shared/ # Shared functionality
│ │ ├── hooks/
│ │ │ ├── useAuthBoundary.ts # Route protection
│ │ │ ├── useForm.ts # Form handling
│ │ │ ├── useErrorHandler.ts # Error handling
│ │ │ └── use-app-theme.ts # Theme management
│ │ ├── store/
│ │ │ └── useThemeStore.ts # Theme state (persisted)
│ │ ├── theme/
│ │ │ ├── colors.ts # Color palette
│ │ │ ├── space.ts # Spacing tokens
│ │ │ └── typography.ts # Typography tokens
│ │ ├── api/
│ │ │ ├── client.ts # Axios with 401 handling
│ │ │ └── queryClient.ts # TanStack Query + MMKV
│ │ ├── providers/
│ │ │ └── QueryProvider.tsx # Query provider
│ │ ├── components/
│ │ │ ├── ErrorBoundary.tsx # Global error boundary
│ │ │ ├── Form.tsx # Form components
│ │ │ └── ThemeToggle.tsx # Theme switcher
│ │ ├── utils/
│ │ │ ├── formUtils.ts # Form utilities
│ │ │ ├── auth.ts # Auth utilities
│ │ │ ├── authUtils.ts # Additional auth utilities
│ │ │ ├── storage.ts # Storage utilities
│ │ │ └── responsive.ts # Responsive helpers
│ │ └── ui/ # UI components
│ │ ├── button.tsx # Button component
│ │ ├── card.tsx # Card component
│ │ ├── input.tsx # Input component
│ │ ├── alert.tsx # Alert component
│ │ ├── loading.tsx # Loading component
│ │ ├── modal.tsx # Modal component
│ │ ├── checkbox.tsx # Checkbox component
│ │ └── collapsible.tsx # Collapsible component
│ └── README.md # Source code documentation
│
├── cli/ # 🧰 CLI Tool
│ ├── index.js # CLI entry point
│ └── package.json # CLI package configuration
│
├── .vscode/ # VS Code settings
├── eas.json # EAS Build configuration
└── package.json # Dependencies
- File-based routing with Expo Router
- Authentication flow with proper token handling
- State management with Zustand
- Data fetching with TanStack Query and Axios
- Secure storage for refresh tokens
- Cache persistence with MMKV
- TypeScript strict mode
- Path aliases configured (@/*)
- Feature-based organization for scalable codebase
- Theme management with light/dark/system mode
- Form handling with validation utilities
- Global error boundaries for crash recovery
- Rich UI component library for rapid development
- Dependency verification script for maintenance
- NativeWind (Tailwind CSS for React Native)
- NEVER persist access tokens — only refresh tokens in SecureStore
- Auth state (user, accessToken) lives in memory (Zustand, no persist)
- All screens live in
app/using Expo Router file-based conventions - Every new file includes a brief JSDoc comment explaining its purpose
- Always prefer explicit over magic — devs must understand every line
- Node.js 18+
- npm or yarn
- Expo Go app on your device (for development)
# Create a new NovaRN app
npx create-nova-rn MyApp
# Navigate to your project
cd MyApp
# Install dependencies
npm install
# Start the development server
npx expo start# iOS Simulator
npx expo start --ios
# Android Emulator
npx expo start --android
# Web Browser
npx expo start --web
# Physical Device
# Scan the QR code with the Expo Go appNovaRN includes a comprehensive testing setup with Jest and React Native Testing Library:
# Run all tests
npm test
# Run tests in watch mode
npm test -- --watch
# Run tests with coverage
npm test -- --coverage# Install EAS CLI
npm install -g eas-cli
# Configure your project
eas build:configure
# Build for iOS
eas build --platform ios
# Build for Android
eas build --platform androidFollow the Expo deployment guides for detailed instructions.
We love contributions! NovaRN is built by developers for developers.
- Fork the repo
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
Found a friction point? That's a bug.
NovaRN is designed to be frictionless. If you hit a snag, open an issue. We treat developer experience bugs as seriously as code bugs.
MIT © NovaRN
Built with ❤️ for the React Native community.
If you like NovaRN, please consider starring the repo! ⭐
