Top-Level Layout
recipe-room-monorepo/
├── apps/
│ ├── mobile/ # React Native (Expo) iOS app — ACTIVE, primary product
│ ├── web-interim/ # Interim web app — auth callbacks, deep links, landing page — ACTIVE
│ └── web/ # Full Next.js web client — PHASE 2, scaffolded but not active
├── packages/
│ └── shared/ # Shared types, Zod validation, constants, API utilities
├── supabase/ # Database migrations
├── docs/ # This documentation (Mintlify)
├── pnpm-workspace.yaml # Workspace config
└── package.json # Root scripts
apps/web-interim/ and apps/web/ are completely separate apps with separate package.json, node_modules, and codebases. The web interim is the live web presence today — it handles auth callbacks, deep link verification (AASA/Asset Links), content redirect pages, and the public landing page with waitlist. The full web client (apps/web) is scaffolded with API routes and component library but is not part of the current phase — it will be built out in Phase 2.
Web Interim (apps/web-interim/) — Active
A lightweight Next.js 14 app that supports the mobile app:
src/
├── app/
│ ├── page.tsx # Landing page with waitlist
│ ├── confirmation-success/ # Email verified success
│ ├── reset-password/ # Password reset form
│ ├── email-change-pending/ # Email change waiting
│ ├── change-email/ # Email change success
│ ├── auth/auth-error/ # Auth link expired/invalid
│ ├── recipes/[id]/ # Deep link redirect → app
│ ├── posts/[id]/ # Deep link redirect → app
│ ├── collections/[id]/ # Deep link redirect → app
│ ├── .well-known/
│ │ ├── apple-app-site-association/ # AASA for iOS universal links
│ │ └── assetlinks.json/ # Android Asset Links
│ └── api/waitlist/ # Loops.so waitlist signup
├── components/ # AuthCallbackHandler, AppOnlyContent, etc.
└── lib/ # Supabase browser client
No dependency on @recipe-room/shared. No content CRUD. No API routes for data mutations. See Web Interim journey for full details.
Web App (apps/web/) — Phase 2
Scaffolded Next.js 14 app with App Router, shadcn/ui component library, and full API route scaffolding. Not the current focus — none of it is serving production traffic today. It will become the full web client when Phase 2 begins. The developer is free to refactor or restructure it as needed.
Mobile App (apps/mobile/) — Active, Primary Product
The iOS app is the main product. Connects directly to Supabase for all data operations — no web API layer in between.
app/ # expo-router file-based routing
├── (tabs)/ # Tab navigation
│ ├── index.tsx # Home feed
│ ├── discover.tsx # Discover page
│ ├── search.tsx # Search
│ ├── saved.tsx # Saved items
│ └── profile.tsx # Current user profile
├── create.tsx # Create modal
├── saved-items.tsx # Uncategorized saved items
├── notifications.tsx # Notification inbox
├── profile/[username].tsx # Other user's profile
├── connections/[username].tsx # Followers/following tab view
├── followers/[username].tsx # Follower list
├── following/[username].tsx # Following list
├── recipe/[id].tsx # Recipe detail
│ └── edit.tsx # Recipe edit
├── post/[id].tsx # Post detail
│ └── edit.tsx # Post edit
├── collection/[id].tsx # Collection detail
│ └── edit.tsx # Collection edit
├── recipe/new.tsx # New recipe
├── post/new.tsx # New post
├── collection/new.tsx # New collection
├── login.tsx # Login
├── forgot-password.tsx # Password reset request
├── register.tsx # Register
├── register-success.tsx # Registration confirmation
├── settings.tsx # Settings
└── _layout.tsx # Root providers + modal config
src/
├── components/ # UI components
├── constants/ # Layout, routes, configuration constants
├── context/ # Context providers for profile/save/search/upload flows
├── hooks/ # Custom hooks
├── lib/ # Supabase client
├── providers/ # Auth, Query providers
└── utils/ # Utilities
Shared Package (packages/shared/)
src/
├── types/ # Database, API, form types
├── validation/ # Zod schemas for all forms/inputs
├── constants/ # Routes, theme tokens, Fujifilm settings
├── api/ # API client, query keys, Supabase utils
└── utils/ # Tag suggestions, type conversions
Import in either app:
import { recipeSchema, type RecipeFormValues } from '@recipe-room/shared';
Component Conventions
Each component follows this pattern:
ComponentName/
├── ComponentName.tsx # Main component
├── index.ts # Barrel export
└── ComponentName.test.ts # Tests (optional)
Import from barrel exports:
import { RecipeCard } from '@/components/features/recipe';
import { Button } from '@/componentlibrary/button';