mirror of
https://github.com/jjbrunton/Sauci.git
synced 2026-10-31 10:19:43 +00:00
105 lines
4.0 KiB
Markdown
105 lines
4.0 KiB
Markdown
# CLAUDE.md
|
|
|
|
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
|
|
|
## Project Overview
|
|
|
|
Sauci is a couples intimacy app featuring swipeable question packs with partner matching. Users swipe on questions (yes/no/maybe), and when both partners answer positively, a "match" is created that unlocks a chat thread for that question.
|
|
|
|
## Commands
|
|
|
|
```bash
|
|
# Install dependencies (from root)
|
|
npm install
|
|
|
|
# Start all apps in development
|
|
npm run dev
|
|
|
|
# Run specific apps
|
|
cd apps/mobile && npm run dev # Expo mobile app
|
|
cd apps/admin && npm run dev # React Admin dashboard
|
|
|
|
# Type checking
|
|
npm run typecheck
|
|
|
|
# Linting
|
|
npm run lint
|
|
|
|
# Build all
|
|
npm run build
|
|
```
|
|
|
|
### Mobile-specific commands
|
|
```bash
|
|
cd apps/mobile
|
|
npm run ios # Run on iOS simulator
|
|
npm run android # Run on Android emulator
|
|
npm run web # Run in browser
|
|
```
|
|
|
|
### Supabase commands
|
|
```bash
|
|
supabase start # Start local Supabase
|
|
supabase db reset # Reset DB and run all migrations
|
|
supabase functions serve # Run edge functions locally
|
|
supabase migration new <name> # Create new migration
|
|
```
|
|
|
|
### Supabase Environments
|
|
|
|
There are two Supabase projects configured via MCP servers:
|
|
|
|
| Environment | Project Ref | URL | MCP Server |
|
|
|-------------|-------------|-----|------------|
|
|
| **Production** | `ckjcrkjpmhqhiucifukx` | https://ckjcrkjpmhqhiucifukx.supabase.co | `sauci-prod` |
|
|
| **Non-Production** | `itbzhrvlgvdmzbnhzhyx` | https://itbzhrvlgvdmzbnhzhyx.supabase.co | `sauci-non-prod` |
|
|
|
|
When using Claude Code with MCP tools:
|
|
- Use `mcp__sauci-prod__*` tools for production database operations
|
|
- Use `mcp__sauci-non-prod__*` tools for development/staging database operations
|
|
- **Always verify which environment you're targeting before running migrations or destructive operations**
|
|
|
|
## Architecture
|
|
|
|
### Monorepo Structure (Turborepo)
|
|
- `apps/mobile` - Expo React Native app (expo-router for navigation)
|
|
- `apps/admin` - React Admin dashboard for content management
|
|
- `apps/supabase` - Database migrations and edge functions
|
|
- `packages/shared` - Shared TypeScript types (`@sauci/shared`)
|
|
|
|
### Mobile App Architecture
|
|
- **Routing**: Expo Router with file-based routing (`app/` directory)
|
|
- `(auth)/` - Authentication screens
|
|
- `(app)/` - Main app screens (protected)
|
|
- **State Management**: Zustand stores in `src/store/index.ts`
|
|
- `useAuthStore` - User, couple, partner state
|
|
- `useMatchStore` - Matches and notifications
|
|
- `usePacksStore` - Question packs and enabled packs per couple
|
|
- `useMessageStore` - Chat messages and unread counts
|
|
- `useSubscriptionStore` - RevenueCat subscription state
|
|
- **Backend**: Supabase client in `src/lib/supabase.ts`
|
|
- **UI Components**: Glass-morphism themed components in `src/components/ui/`
|
|
|
|
### Data Model (Core Entities)
|
|
- **Profile** - User profile extending Supabase auth (has `couple_id`)
|
|
- **Couple** - Two users linked via invite code
|
|
- **QuestionPack** - Collection of questions (can be premium)
|
|
- **Question** - Individual question with intensity level (1-5)
|
|
- **Response** - User's answer (yes/no/maybe) to a question
|
|
- **Match** - Created when both partners answer positively (yes_yes, yes_maybe, maybe_maybe)
|
|
|
|
### Edge Functions
|
|
Edge functions in `apps/supabase/functions/` handle complex operations:
|
|
- `submit-response` - Saves response, checks for matches, triggers notifications
|
|
- `manage-couple` - Join/leave couple operations
|
|
- `send-notification` - Push notifications for matches
|
|
- `revenuecat-webhook` - Subscription webhook handler
|
|
- `sync-subscription` - Syncs RevenueCat subscription status
|
|
|
|
### Key Patterns
|
|
- Responses use UPSERT with `onConflict: "user_id,question_id"`
|
|
- Match detection happens in `submit-response` edge function after each response
|
|
- Real-time subscriptions used for chat messages
|
|
- RevenueCat handles in-app purchases and subscription management
|
|
- RLS policies enforce couple-level data isolation
|