A React Native / Expo monorepo template by Ackee — clone it to bootstrap a new mobile project with shared packages, tooling, and CI already wired up.
- App: React Native + Expo 55, React 19, React Navigation v7
- Monorepo: pnpm workspaces + Turbo
- Forms: React Hook Form + Zod
- i18n: expo-localization + react-intl +
@workspace/localization - Error tracking: Sentry (
@sentry/react-native) - Animations: Reanimated 4
- React Compiler enabled
This is a pnpm workspaces monorepo, so start a new project by copying it with degit — not with create-expo-app --template, which strips the template's dotfiles (.madgerc, .env.template.local, .nvmrc, …) and produces a broken project.
# Copy the template WITHOUT its git history, then start your own repo
npx degit AckeeCZ/expo-app-template my-app
cd my-app
git init
# …or clone if you don't mind inheriting the template's git history
git clone https://github.com/AckeeCZ/expo-app-template my-appThen follow the steps below.
This project uses pnpm via Corepack:
corepack enable
pnpm installCopy the template and fill in the required values:
cp apps/mobile/.env.template.local apps/mobile/.env.localKey variables:
| Variable | Description |
|---|---|
EXPO_PUBLIC_BUILD_ENV |
development | stage | production |
EXPO_PUBLIC_SENTRY_DSN |
Sentry DSN (optional in development) |
EXPO_PUBLIC_DEV_SENTRY_DISABLED |
Set "true" to disable Sentry locally |
SENTRY_AUTH_TOKEN |
Required for EAS source map uploads |
# Start Expo dev server
pnpm start
# Or launch directly on a simulator/emulator
pnpm ios
pnpm androidapps/
mobile/ # React Native / Expo app
packages/
api/ # API client (React Query)
common/ # Shared utilities
env/ # Environment validation
errors/ # Error types
localization/ # i18n messages
logger/ # Logger (Sentry-backed)
tooling/
eslint/ # Shared ESLint flat config
prettier/ # Shared Prettier config
typescript/ # Shared TypeScript configs
pnpm start # start the mobile dev server (expo start)
pnpm lint # lint all workspaces
pnpm lint:fix # lint + auto-fix
pnpm format # prettier all workspaces
pnpm cir-dep # circular dependency check
pnpm build # validation gate (lint, format, cir-dep, types-check)pnpm start # expo start
pnpm ios # run on iOS simulator
pnpm android # run on Android emulator
pnpm types-check # tsc --noEmit
pnpm lint # expo lint
pnpm test:unit # jest --watchAll
pnpm test:unit:ci # jest --coverage
pnpm test:e2e # maestro test .maestro/
pnpm build:ios # EAS build for iOS (preview)
pnpm build:android # EAS build for Android (preview)Translations live in packages/localization. The @workspace/localization package is consumed by the mobile app via react-intl.
To add or update translations, edit the message files directly in packages/localization/translations/.
The versioning follows:
major— production releasesminor— stage releasespatch— hotfixes / minor fixes
Builds are created via EAS:
# From apps/mobile
pnpm build:ios
pnpm build:android