Skip to content

Repository files navigation

React Native Template by Ackee

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.

Stack

  • 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

Using this template

This is a pnpm workspaces monorepo, so start a new project by copying it with degitnot 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-app

Then follow the steps below.

Getting Started

1. Enable package manager & install dependencies

This project uses pnpm via Corepack:

corepack enable
pnpm install

2. Set up environment variables

Copy the template and fill in the required values:

cp apps/mobile/.env.template.local apps/mobile/.env.local

Key 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

3. Start the development server

# Start Expo dev server
pnpm start

# Or launch directly on a simulator/emulator
pnpm ios
pnpm android

Project Structure

apps/
  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

Common Commands

Root (all workspaces via Turbo)

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)

Mobile (apps/mobile)

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)

Localizations

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/.

Release

The versioning follows:

  • major — production releases
  • minor — stage releases
  • patch — hotfixes / minor fixes

Builds are created via EAS:

# From apps/mobile
pnpm build:ios
pnpm build:android

Learn More

About

Monorepo skeleton for Expo mobile apps.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages