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

LayerWhat we use
AppExpo 57, React Native 0.86, React 19, TypeScript, Expo Router
UIHeroUI Native, Uniwind, Tailwind CSS v4, Reanimated v4
Auth & dataReact Native Firebase (v26): Auth, Firestore, Functions, App Check
PaymentsRevenueCat (v10): purchases + paywalls
PushOneSignal (v5)
AnalyticsMixpanel (v3), Firebase Analytics, Crashlytics
AttributionAirbridge (v4)
AdsGoogle 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

  1. Onboarding slides (optional, FEATURES.onboarding)
  2. Personalization survey (optional, FEATURES.personalization)
  3. Auth (email, Google, Apple, guest), or skip it with autoGuestMode
  4. 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.

On this page