Overview
What the Starter Kit is, the stack it ships with, and how the project is laid out.
The Starter Kit is a complete Expo app, not a UI gallery. Auth, paywalls, push, analytics, and onboarding are already wired. You rename it, plug in your keys, and ship.
Stack
| Layer | What we use |
|---|---|
| App | Expo 57, React Native 0.86, React 19, TypeScript, Expo Router |
| UI | HeroUI Native, Uniwind, Tailwind CSS v4, Reanimated v4 |
| Auth & data | React Native Firebase (v26): Auth, Firestore, Functions, App Check |
| Payments | RevenueCat (v10): purchases + paywalls |
| Push | OneSignal (v5) |
| Analytics | Mixpanel (v3), Firebase Analytics, Crashlytics |
| Attribution | Airbridge (v4) |
| Ads | Google AdMob (v16, off by default) |
Native config lives in app.json. This is an Expo project. Prefer app.json / plugins over editing ios/ and android/ by hand.
Version policy. We only bump dependency versions after we verify they work together end-to-end. New releases are not adopted the day they ship. Stability for every Starter Kit user comes first. Within that constraint, we keep modules on the newest versions that have proven reliable in this stack.
Project layout
src/
├── app/ # Expo Router screens
│ ├── (auth)/ # login, signup, forgot password
│ ├── (tabs)/ # home, ask-ai, profile
│ ├── index.tsx # onboarding → personalization → auth gate
│ └── _layout.tsx # providers
├── components/
├── config/ # features.ts, firebase.ts, personalization.ts
├── contexts/ # auth, theme, language, subscription, onboarding
├── i18n/
│ ├── locales/ # in-app UI strings
│ └── native/ # iOS/Android display name and permission text
├── lib/ # RevenueCat, OneSignal, Mixpanel, Airbridge, AdMob
└── hooks/First-launch flow
- Onboarding slides (optional,
FEATURES.onboarding) - Personalization survey (optional,
FEATURES.personalization) - Auth (email, Google, Apple, guest), or skip it with
autoGuestMode - Main tabs
Every product surface is gated from src/config/features.ts. Turn a flag off and the related UI and SDK init are skipped.