Skip to content

React Native Expo Boilerplate

A production-ready starter for React Native and Expo. One command gives you a real app with routing, state, data fetching, forms, encrypted storage, i18n, three environments and EAS builds, using only the libraries you pick.
Terminal window
npx create-expo-boilerplate@latest my-app

Answer a few questions, or press Enter to take the defaults. The CLI writes an app with only the stack you chose, installs dependencies and makes the first git commit.

Choice Options (default first)
Navigation Expo Router (typed routes) · React Navigation
State management Zustand · Redux Toolkit with Thunk or Saga
Styling Unistyles 3 · React Native StyleSheet · Tailwind (Uniwind)
Language TypeScript · JavaScript
Tooling ESLint and Husky, each on or off
Package manager yarn · npm · pnpm · bun

That’s 144 combinations. A test script generates each one and checks that it type-checks, lints, passes its tests and has no leftover code from the options you didn’t pick, and CI runs it on every change.

Latest Expo

Expo SDK 58, React Native 0.88 and React 19.3, with the React Compiler and the New Architecture.

Data fetching

TanStack Query v5, Axios and react-query-kit, with a shared client that adds auth tokens, checks connectivity, handles 401s and shows error toasts.

Forms

React Hook Form with Zod v4 schemas and a ControlledTextField ready to use.

Encrypted storage

MMKV encrypted with AES, using a random key kept in the iOS Keychain or Android Keystore.

i18n with RTL

i18next with English, Spanish and Arabic, typed translation keys, and automatic right-to-left layout.

Three environments

Development, staging and production, each with its own app name and Zod-validated env vars.

EAS ready

Build profiles, fast “repack” builds that skip native compiles, and an approval-gated release workflow.

Quality built in

Jest with React Native Testing Library, ESLint 9, Prettier, Husky and Commitlint.

Code is organised by feature (src/features/auth, src/features/posts, …). Each feature exposes a small public API, and screens talk to state only through hooks like useLogin() and useIsLoggedIn(). That’s why the CLI can swap Zustand for Redux, or Expo Router for React Navigation, without touching a single screen.