A React Native dating app for digital nomads, built with Expo.
Detour helps digital nomads connect with like-minded travelers. Features include:
- Profile discovery based on location
- Real-time messaging
- Match notifications
- Subscription-based premium features
| Layer | Technology |
|---|---|
| Mobile | React Native + Expo SDK 54 |
| Routing | Expo Router (file-based) |
| Backend | Convex (DB + functions + file storage) |
| Auth | Clerk (phone, Google, Apple) |
| Payments | RevenueCat (subscriptions) |
| Notifications | Expo Notifications |
| Styling | NativeWind (Tailwind CSS) |
┌─────────────────────────────────────────────────────────────┐
│ Mobile App (Expo) │
├─────────────────────────────────────────────────────────────┤
│ Screens (app/) │ Contexts │ Hooks │ Components │
└────────┬─────────┴─────┬──────┴────┬────┴────────┬─────────┘
│ │ │ │
▼ ▼ ▼ ▼
┌─────────┐ ┌─────────┐ ┌─────────┐ ┌──────────┐
│ Clerk │ │ Convex │ │RevenueCat│ │Expo Push │
│ (Auth) │ │(Backend)│ │(Payments)│ │(Notifs) │
└─────────┘ └─────────┘ └─────────┘ └──────────┘
Data Flow:
- User authenticates via Clerk → JWT token issued
- Token validated by Convex → User data loaded
- User actions (swipe, message) → Convex mutations
- Matches/messages → Trigger push notifications
- Subscription status → RevenueCat entitlements
See docs/architecture.md for detailed diagrams.
- Node.js 18+
- npm 9+
- Xcode (iOS) or Android Studio (Android)
- Physical device for push notifications
-
Install dependencies
npm install
-
Create environment file
cp .env.example .env.local
-
Configure environment variables (see below)
-
Start Convex backend
npx convex dev
-
Start Expo
npx expo start
Create .env.local with:
# Convex
CONVEX_DEPLOYMENT=dev:your-project
EXPO_PUBLIC_CONVEX_URL=https://your-project.convex.cloud
# Clerk
EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY=pk_test_xxx
# RevenueCat
EXPO_PUBLIC_REVENUECAT_IOS_API_KEY=appl_xxx
EXPO_PUBLIC_REVENUECAT_ANDROID_API_KEY=goog_xxx
# App
EXPO_PUBLIC_APP_ENV=developmentdetour/
├── app/ # Expo Router screens
│ ├── (tabs)/ # Main app tabs
│ ├── onboarding/ # Onboarding flow
│ ├── chat/ # Chat screens
│ └── _layout.tsx # Root layout
├── convex/ # Backend
│ ├── schema.ts # Database schema
│ ├── users.ts # User functions
│ ├── matches.ts # Match functions
│ ├── messages.ts # Message functions
│ ├── swipes.ts # Swipe + match creation
│ ├── files.ts # File storage
│ └── notifications.ts # Push notifications
├── components/ # UI components
├── context/ # React contexts
├── hooks/ # Custom hooks
├── lib/ # Utilities
└── docs/ # Documentation
| Command | Description |
|---|---|
npm start |
Start Expo dev server |
npm run ios |
Run on iOS simulator |
npm run android |
Run on Android emulator |
npm run lint |
Lint code |
npm run typecheck |
Type check |
npm run test |
Run tests |
| Document | Description |
|---|---|
| Architecture | System design & data flow |
| API Reference | Convex function documentation |
| Deployment | Build & release guide |
| Setup Guides | |
| Clerk Setup | Authentication configuration |
| Convex Setup | Backend configuration |
| RevenueCat Setup | Payments configuration |
| Push Notifications | Notification setup |
| Troubleshooting | Common issues & solutions |
- Phone (SMS verification)
- Google OAuth
- Apple Sign-In
- Secure token storage
- Location-based profiles
- Swipe to like/pass
- Automatic match detection
- Real-time chat
- Read receipts
- Message previews
- Match alerts
- Message notifications
- Deep linking to chat
- Free trial support
- Monthly/yearly plans
- Restore purchases
RevenueCat requires a development build for purchase testing:
eas build --profile development --platform iosUse sandbox/test accounts for purchases.
Push notifications require:
- Physical device (not simulator)
- EAS project configured
- APNs key (iOS) / FCM (Android) for production
Test with Expo Push Tool.
See CONTRIBUTING.md for guidelines.
Proprietary - All rights reserved.