Skip to main content

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';