Say goodbye to time-consuming setup tasks like restructuring files, installing libraries, and crafting reusable components. Our project boilerplate is your solution to eliminate redundant work when starting from scratch. It includes only the most commonly-used libraries, so you can hit the ground running with a fully configured setup.
- π± File-based routing with Expo Router
- π¨ Light/Dark theme support out of the box
- π Redux Toolkit for state management
- π¦ Environment configuration for dev/prod
- π CI/CD workflows ready to go
- π οΈ Code quality tools (ESLint, Prettier, Jest)
- π Distribution for mobile and web
- Download zip or click "Use this template"
- Install packages with
npm install
oryarn install
- Spin up dev environment with
npm run dev
oryarn run dev
File-based Router
The project uses Expo Router with a pre-configured navigation structure which has updated from react-navigation. The navigation structure is based on file-based routing, making it easier to manage and navigate between screens. The project has a pre-configured navigation structure with a drawer and tab navigation. You can easily add new screens and navigations by following the existing structure:
Root (Drawer)
βββ Home Tab
β βββ Stack
β βββ Home Screen
β βββ Details Screen
βββ Profile Tab
βββ Stack
βββ Profile Screen
βββ Details Screen
Global State Management
This project uses Redux Toolkit for global state management, pre-configured with Redux Hooks for immediate use.
- Explore existing slices in the
/slices
directory - See usage examples in
/app/_layout.tsx
- Copy
/slices/app.slice.ts
- Rename and modify for your needs
- Add your slice to
/utils/store.ts
Redux logger is enabled by default. To disable, remove the logger from /utils/store.ts
.
Theme Management
The project simplifies asset and theme management through a centralized /theme
directory that handles images, icons, fonts, and colors, with built-in asset preloading and SVG support for optimal performance, while also providing a custom useColorScheme
hook (located in /hooks/useColorScheme.ts
) that automatically detects and adapts colors based on the current theme across both mobile and web platforms - making it easy to implement dynamic theming by returning the current color scheme name and flags (isDark, isLight) for conditional styling.
Environment Variables
The project uses dotenvx
to handle environment variables across both Expo CLI and EAS CLI builds. Here's how it works:
.env.dev.example
- Development environment template.env.prod.example
- Production environment template- Configuration in
app.config.ts
andutils/config.ts
- Rename
.env.dev.example
to.env.dev
- Update
owner
inapp.json
with your Expo username - Set your
EXPO_SLUG
andEXPO_PROJECT_ID
in.env.dev
- Add variables to both
.env.dev
and.env.prod
- Include them in
app.config.ts
under theextra
object - Define them in
utils/config.ts
- Check variables in the app's bottom sheet OR...
- Run
npm run dev:config:public
to view loaded variables in console
The project intentionally avoids using EXPO_PUBLIC_
prefix for environment variables, instead utilizing EAS secrets for enhanced security. Here's why:
- Variables are uploaded to EAS servers as
secrets
- Securely accessible only during EAS build and submit processes
- Use
npm run dev:secret:push
to automatically upload variables from.env.dev
and.env.prod
If you prefer direct access via process.env
:
- Use
EXPO_PUBLIC_
prefix for non-sensitive data - Warning: Never store sensitive information with
EXPO_PUBLIC_
prefix as it exposes data to clients - For sensitive data handling, follow React Native's security guidelines for storing sensitive information
Simplified Distribution
The project streamlines deployment with simple commands - use npm run dev:build:mobile
to generate iOS (IPA) and Android (APK) distributions, and npm run dev:deploy:web
to deploy the web version to EAS Hosting.
Development and Build Scripts
npm run dev
- Run on all platformsnpm run dev:ios
- Run iOS onlynpm run dev:android
- Run Android onlynpm run dev:web
- Run web only
npm run dev:build:mobile
- Build mobile appsnpm run dev:build:web
- Build web appnpm run dev:deploy:web
- Deploy web app to EAS Hosting
npm run lint
- Run ESLintnpm run format
- Run Prettiernpm run test
- Run Jest tests
Code formatting, linting and testing on pre-commit
The project maintains code quality through integrated Eslint, Prettier, and Jest configurations - code is automatically scanned and formatted during development (especially with 'Format on Save' enabled), while pre-commit hooks verify, format, and test your code to ensure all commits meet quality standards.
Release preview channel on Pull-Request (only mobile)
- When you've completed your work and need to share a preview with the QA team, our boilerplate automates the distribution process for you. Here's how it works:
- Whenever you create a pull request (PR) or merge, it automatically generates a preview channel in your Expo account.
- You don't need to run 'eas' commands every time you create a PR; the process is streamlined for you.
- The continuous delivery (CD) process is managed through the preview.yml configuration file, which utilizes expo-github-action.
To set up the CD workflow, follow these steps:
- Create an
EXPO_TOKEN
in your Expo account. You can do this by visiting this link. - In your GitHub repository, go to Settings, then navigate to Secrets and variables -> Actions -> Add new repository secret. Make sure to name the secret as
EXPO_TOKEN
. - Update
name
,slug
,owner
,projectId
andurl
in app.json: - Update in
name
,slug
,projectId
,ios
,android
in app.config.ts - After you push changes to the main branch, a new preview will be created automatically.
Expo provides a popular set of vector icons. Please search icons from here
To generate iOS and Android native code, you can run npx expo prebuild
in the project's root directory. For more details and specific instructions, please refer to the Expo documentation page.
This project is available under the MIT license. See the LICENSE file for more info.