Мобильное приложение для пар. iOS первым делом. Тёмный дизайн, русский интерфейс.
| Экран | Статус |
|---|---|
| Онбординг (3 шага: уровень близости, длительность, имя партнёра) | ✅ |
| Главный экран → кнопка «Начать Ritual» | ✅ |
| Ритуал: 5 раундов с таймером (круговой прогресс) | ✅ |
| Раунд 2: рулетка «кто начинает» | ✅ |
| Раунд 3: выбор «кто раздевает» | ✅ |
| Экран завершения ритуала | ✅ |
| Автопауза при сворачивании приложения (iOS background) | ✅ |
| Аналитика ключевых событий (Amplitude) | ✅ |
| Режим Dice (базовый) | ✅ |
| Слой | Инструмент |
|---|---|
| Mobile framework | React Native + Expo (managed workflow) |
| Язык | TypeScript (strict) |
| Навигация | Expo Router (file-based) |
| State | Zustand |
| Server state | TanStack Query v5 |
| Backend | Supabase |
| Платежи | RevenueCat |
| Аналитика | Amplitude |
| Анимации | Reanimated 3 + Moti |
| Аудио | expo-av |
Да, MacBook нужен для запуска на iPhone. Причина:
Приложение использует нативные библиотеки (react-native-purchases / RevenueCat, expo-av), которые не поддерживаются в стандартном Expo Go. Поэтому нужен либо:
Вариант A — MacBook + Xcode (рекомендуется для разработки):
- Установить Xcode из App Store
- Подключить iPhone по USB или использовать симулятор
- Запустить
npx expo run:ios
Вариант B — EAS Build (облачная сборка, без MacBook):
- Нужен Apple Developer аккаунт ($99/год)
- Команды ниже в разделе «EAS Build»
- macOS (любой современный)
- Xcode 15+ (из App Store)
- Node.js 22+
- iPhone с iOS 16+ (или симулятор)
# 1. Клонировать репозиторий
git clone https://github.com/YOUR_USERNAME/ritual-app.git
cd ritual-app
# 2. Установить зависимости
npm install
# 3. Создать .env файл (скопировать пример)
cp .env.example .env
# Заполнить переменные (см. раздел ниже)
# 4. Запустить на симуляторе iOS
npx expo run:ios
# 5. Или запустить на физическом iPhone (подключить по USB)
npx expo run:ios --deviceСоздать .env (этот файл никогда не коммитить):
EXPO_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
EXPO_PUBLIC_SUPABASE_ANON_KEY=your-anon-key
EXPO_PUBLIC_AMPLITUDE_API_KEY=your-amplitude-key
EXPO_PUBLIC_GUIDED_AUDIO_BUCKET=guided-audio
EXPO_PUBLIC_GUIDED_AUDIO_PUBLIC_BASE_URL=https://your-project.supabase.co/storage/v1/object/public/guided-audio
EXPO_PUBLIC_GUIDED_AUDIO_VOICE_PROFILE=marusya-romantic-v1
EXPO_PUBLIC_GUIDED_AUDIO_FUNCTION_NAME=guided-audio-resolver
EXPO_PUBLIC_GUIDED_AUDIO_MANIFEST_PREFIX=guided-manifests
EXPO_PUBLIC_GUIDED_AUDIO_NAME_PREFIX=name-library
EXPO_PUBLIC_GUIDED_AUDIO_PHRASE_PREFIX=guided-phrasesБез Supabase и Amplitude приложение запустится, но аналитика и аутентификация работать не будут. Для тестирования UI это нормально.
Guided Ritual теперь рассчитан на Supabase Storage + Edge Functions:
- На клиенте нужны только
EXPO_PUBLIC_SUPABASE_*иEXPO_PUBLIC_GUIDED_AUDIO_*. SUPABASE_SERVICE_ROLE_KEYнельзя хранить в клиентском.envили Expo bundle.- На сервере / в
Supabase Edge Functionsнужно задать секреты:SUPABASE_URLSUPABASE_SERVICE_ROLE_KEYELEVENLABS_API_KEYELEVENLABS_VOICE_IDELEVENLABS_MODEL_ID(опционально, по умолчаниюeleven_multilingual_v2)
Edge functions в репозитории:
supabase/functions/guided-audio-resolver— проверяет/создаёт missing name clips и возвращает manifest сегментов.supabase/functions/guided-audio-prime— прогревает phrase library заранее.
Полезные локальные команды:
npm run guided:prime -- 20— предгенерирует phrase library батчами черезguided-audio-prime.npm run guided:qa— прогонит smoke-test resolver на cue с именами и без них.
Требует Apple Developer аккаунт и EAS CLI.
# Установить EAS CLI
npm install -g eas-cli
# Войти в Expo аккаунт
eas login
# Сборка для симулятора (бесплатно, без Apple Developer)
eas build --profile development --platform ios
# Сборка для TestFlight / App Store (нужен Apple Developer $99/год)
eas build --profile production --platform ios
# Отправить в App Store
eas submit --profile production --platform iosapp/
(auth)/
onboarding.tsx # 3-шаговый онбординг
(main)/
index.tsx # Главный экран
ritual/
index.tsx # Экран выбора режима
session.tsx # Активный сеанс (5 раундов + таймер)
dice.tsx # Режим Dice
paywall.tsx # Paywall (заглушка)
_layout.tsx # Root layout с навигацией
components/
ritual/
CircularTimer.tsx # Круговой таймер
ui/
Button.tsx
common/
ScreenContainer.tsx
stores/
ritual.store.ts # State machine сеанса (idle → in_round×5 → completed)
auth.store.ts # Профиль + онбординг preferences
subscription.store.ts
constants/
theme.ts # Дизайн-система (цвета, отступы, типографика)
ritual-config.ts # Конфиг раундов (SSOT)
ritual-content.ts # Контент раундов (правила, фразы)
lib/
analytics.ts # Amplitude events
supabase.ts # Supabase client
npm test # Jest тесты
npm run typecheck # TypeScript проверка
npm run lint # ESLint