AI-powered recipe management app built with React Native, Expo, Supabase, SuperWall, and RevenueCat.
- React Native - Cross-platform mobile framework
- Expo - Development platform for React Native
- TypeScript - Type-safe JavaScript
- Supabase - Backend as a Service (Auth, Database, Storage)
- RevenueCat - In-app purchase and subscription management
- SuperWall - Paywall and monetization platform
- React Navigation - Routing and navigation
Culinara/
βββ src/
β βββ components/ # Reusable UI components
β βββ screens/ # App screens
β βββ services/ # API and business logic
β βββ hooks/ # Custom React hooks
β βββ utils/ # Utility functions
β βββ types/ # TypeScript type definitions
β βββ config/ # Configuration files (Supabase, RevenueCat, SuperWall)
β βββ navigation/ # Navigation setup
βββ assets/ # Images, fonts, etc.
βββ swift-reference/ # Original Swift/SwiftUI implementation (for reference)
βββ docs/ # Documentation
βββ App.tsx # Root component
βββ app.json # Expo configuration
βββ package.json # Dependencies
- Node.js 18+ and npm
- Expo CLI:
npm install -g expo-cli - iOS Simulator (Mac) or Android Studio (for Android development)
- Expo Go app on your phone (for quick testing)
- Clone and install dependencies:
npm install- Set up environment variables:
Create a .env file in the root directory:
cp .env.example .envThen fill in your credentials:
# Supabase Configuration
EXPO_PUBLIC_SUPABASE_URL=your_supabase_project_url
EXPO_PUBLIC_SUPABASE_ANON_KEY=your_supabase_anon_key
# RevenueCat Configuration
EXPO_PUBLIC_REVENUECAT_API_KEY=your_revenuecat_api_key
# SuperWall Configuration
EXPO_PUBLIC_SUPERWALL_API_KEY=your_superwall_api_key- Go to supabase.com
- Create a new project
- Go to Settings β API
- Copy the Project URL and anon/public key
- Go to revenuecat.com
- Create an account and project
- Go to API keys and copy your public SDK key
- Go to superwall.com
- Create an account and project
- Copy your API key from the dashboard
# Start Expo development server
npm start
# Run on iOS simulator (Mac only)
npm run ios
# Run on Android emulator
npm run android
# Run on web
npm run webYou can also scan the QR code with the Expo Go app on your phone to test on a real device.
expo- Expo frameworkreact-native- React Native frameworktypescript- Type safety
@supabase/supabase-js- Supabase client@react-native-async-storage/async-storage- Persistent storagereact-native-url-polyfill- URL polyfill for React Native
react-native-purchases- RevenueCat SDK@superwall/react-native-superwall- SuperWall SDK
@react-navigation/native- Navigation library@react-navigation/stack- Stack navigatorreact-native-screens- Native screen optimizationreact-native-safe-area-context- Safe area handling
You'll need to set up the following tables in Supabase:
Handled automatically by Supabase Auth.
create table recipes (
id uuid default uuid_generate_v4() primary key,
user_id uuid references auth.users not null,
title text not null,
description text,
image_url text,
cook_time integer not null,
prep_time integer not null,
servings integer not null,
difficulty text check (difficulty in ('easy', 'medium', 'hard')),
cuisine text,
meal_type text check (meal_type in ('breakfast', 'lunch', 'dinner', 'dessert', 'snack')),
source_type text check (source_type in ('original', 'ai_generated', 'imported', 'ocr')),
source_url text,
created_at timestamp with time zone default timezone('utc'::text, now()) not null,
updated_at timestamp with time zone default timezone('utc'::text, now()) not null
);create table ingredients (
id uuid default uuid_generate_v4() primary key,
recipe_id uuid references recipes on delete cascade not null,
item text not null,
quantity decimal,
unit text,
section text,
"order" integer not null,
created_at timestamp with time zone default timezone('utc'::text, now()) not null
);create table instructions (
id uuid default uuid_generate_v4() primary key,
recipe_id uuid references recipes on delete cascade not null,
step_number integer not null,
instruction text not null,
time_minutes integer,
tip text,
created_at timestamp with time zone default timezone('utc'::text, now()) not null
);create table collections (
id uuid default uuid_generate_v4() primary key,
user_id uuid references auth.users not null,
name text not null,
description text,
created_at timestamp with time zone default timezone('utc'::text, now()) not null,
updated_at timestamp with time zone default timezone('utc'::text, now()) not null
);
create table collection_recipes (
collection_id uuid references collections on delete cascade,
recipe_id uuid references recipes on delete cascade,
added_at timestamp with time zone default timezone('utc'::text, now()) not null,
primary key (collection_id, recipe_id)
);Enable RLS on all tables and add policies:
-- Enable RLS
alter table recipes enable row level security;
alter table ingredients enable row level security;
alter table instructions enable row level security;
alter table collections enable row level security;
alter table collection_recipes enable row level security;
-- Recipes policies
create policy "Users can view their own recipes"
on recipes for select
using (auth.uid() = user_id);
create policy "Users can insert their own recipes"
on recipes for insert
with check (auth.uid() = user_id);
create policy "Users can update their own recipes"
on recipes for update
using (auth.uid() = user_id);
create policy "Users can delete their own recipes"
on recipes for delete
using (auth.uid() = user_id);
-- Similar policies for other tables...Based on the Swift implementation, here are the key features to build:
- Authentication (Sign up, Sign in, Password reset)
- Recipe feed with filtering and search
- Recipe detail view with servings scaling
- Recipe creation (Manual entry)
- Collections management
- Settings screen
- AI recipe generation (using Google Gemini or OpenAI)
- Sous Chef chat assistant
- Magic ingredient substitution
- Recipe import from URL
- OCR for cookbook scanning
- Cloud sync across devices
- Social features (share recipes)
- Meal planning calendar
- Shopping list generation
- Nutrition tracking
- Recipe ratings and comments
- Premium subscription with RevenueCat
- Paywall integration with SuperWall
- Premium features gating
- Usage analytics
The original Swift/SwiftUI implementation is preserved in the swift-reference/ folder for reference. You can refer to:
swift-reference/Culinara/Views/- UI screensswift-reference/Culinara/Models/- Data modelsswift-reference/Culinara/Services/- API servicesdocs/PROJECT_STRUCTURE.md- Detailed Swift app documentation
This is a personal project, but feel free to fork and adapt it for your needs!
MIT License
Built with React Native, Expo, Supabase, RevenueCat, and SuperWall. Original Swift implementation migrated to React Native for cross-platform support.