TypeScript-first Expo + Expo Router + Uniwind + HeroUI Native starter focused on speed, clarity, and good defaults. Ships with multi-theme support, an opinionated project structure, utility helpers, and ready-made screens.
Branches: The
defaultbranch is Expo Go-compatible. Themainbranch includes additional batteries — auth with Clerk(coming soon), backend with Convex(coming soon), and more.
| Category | Tool |
|---|---|
| Framework | Expo (SDK 55) + React Native 0.83 |
| Routing | Expo Router (file-based, typed routes) |
| UI Components | HeroUI Native |
| Styling | Uniwind (Tailwind CSS v4) + Tailwind Variants |
| State | Zustand with persist middleware |
| Keyboard | react-native-keyboard-controller |
| Bottom Sheets | @gorhom/bottom-sheet |
| Fonts | Poppins + Inter via expo-font |
| Tabs | Native Tabs (expo-router/unstable-native-tabs) with web fallback |
| Storage | expo-sqlite/kv-store (native) / localStorage (web) |
- Multi-theme system — Base light/dark plus color themes (lavender, mint, sky) with light/dark variants each, all using OKLCH color tokens
- HeroUI Native components — Pre-configured provider with toast support and keyboard avoidance
- Native tab bar — Platform-native tabs on iOS/Android with SF Symbols and Material icons, web fallback
- Theme switching —
useAppTheme()hook withsetTheme()andtoggleTheme()viaUniwind.setTheme() - Unified storage — Single adapter for Zustand persistence across native and web
- Bottom sheets —
@gorhom/bottom-sheetwith blur backdrop support (expo-blur) cn()utility — Tailwind class merging viaclsx+tailwind-merge- Custom
AppText— Drop-in text component with Poppins font family - React Compiler — Enabled via
reactCompiler: trueexperiment - Typed routes — Full type safety for navigation
src/
app/ Route pages & layouts (theme/ has its own Stack layout)
components/ UI components (shared/, ui/, icons/, examples/)
constants/ Theme colors, fonts, spacing, tab config
context/ React contexts (AppThemeContext for multi-theme)
providers/ Provider composition (RootProvider)
hooks/ Custom hooks (color scheme, large header options)
helpers/ Helper functions & hooks (accessibility, OTA updates, strings)
lib/ Utilities (cn(), unified storage adapter)
store/ Zustand store (auth, theme, profile, preferences)
services/ API & integrations
themes/ CSS theme files (lavender, mint, sky, alpha)
interfaces/ TypeScript interfaces by domain
types/ Type definitions
global.css Tailwind/Uniwind/HeroUI Native theme config
-
Clone the repo
git clone https://github.com/s-kvng/expo-forge-starter.git cd expo-forge-starter -
Install dependencies
bun install # or: npm install / yarn / pnpm -
Start the dev server
bun expo start
From there you can open the app in:
- Expo Go (default branch)
- iOS Simulator
- Android Emulator
- Development build
-
Start editing — Routes live in
src/app/. The project uses file-based routing.
| Command | Description |
|---|---|
bun expo start |
Start the dev server |
bun expo start --ios |
Start on iOS simulator |
bun expo start --android |
Start on Android emulator |
bun expo start --web |
Start on web |
bun expo lint |
Run ESLint |
bun run reset-project |
Reset to a blank project |
- Expo docs — Fundamentals and advanced guides
- Expo Router docs — File-based routing
- HeroUI Native docs — React Native component library
- Uniwind docs — Tailwind CSS v4 for React Native
- Zustand docs — Lightweight state management
- Learn Expo tutorial — Step-by-step walkthrough
This starter was built on the shoulders of:
- HeroUI Native Example — Reference app for HeroUI Native components and theming patterns
- Sonny's Expo Starter — Project structure and developer experience inspiration
- Expo Default Template — The official Expo template that serves as the foundation