Dual-profile meal planner that synchronizes conflicting dietary needs into one harmonious grocery list and cooking schedule
Built for: Cohabiting couples where one partner has dietary restrictions (IBS, low FODMAP, low caloric needs) and the other has standard/high caloric requirements
π Live Demo β’ π¦ GitHub β’ π Report Bug β’ π‘ Request Feature
This MVP was autonomously generated by MVP Factory v11 using a free-tier AI API (NVIDIA / Kimi K2.5). Simple logic runs for real. Complex external dependencies are stubbed so the app always works.
| Layer | What it does |
|---|---|
| β Frontend UI | Fully interactive β forms submit, responses render, auth guard works |
| β Input validation | Every API route checks required fields, returns 400 on bad input |
| β Calculations & scoring | Algorithms (risk scores, percentages, rankings, text analysis) run in pure TypeScript |
| β Rule-based logic | Classification, tier detection, flag rules β all real code |
| β Auth flow | Email+password client validation β localStorage token β dashboard guard |
| Feature | Current State | Why it's stubbed | How to fix it |
|---|---|---|---|
| ποΈ Database persistence | In-memory arrays (resets on restart) | No DB provisioned in free tier | See Step 1 below |
| π€ AI/LLM responses | Hardcoded plausible strings | NVIDIA free API has strict rate limits during bulk builds | See Step 2 below |
| π Real authentication | localStorage demo token | No JWT/session infra provisioned | See Step 3 below |
| π§ Email / notifications | Logged + returns {sent: true} |
No email service configured | See Step 4 below |
| π³ Payments | Returns demo status | Stripe not configured | See Step 5 below |
# Option A: Supabase (Postgres, free tier)
npm install @supabase/supabase-js
# In each route: import { createClient } from '@supabase/supabase-js'
# Replace the mock array with: const { data } = await supabase.from('table').select()
# Option B: PlanetScale (MySQL, free tier)
npm install @planetscale/databaseLook for
// TODO: replace with DBcomments insrc/app/api/**/route.ts
// In any API route, replace the hardcoded AI string with:
const res = await fetch('https://integrate.api.nvidia.com/v1/chat/completions', {
method: 'POST',
headers: { 'Authorization': `Bearer ${process.env.NVIDIA_API_KEY}`,
'Content-Type': 'application/json' },
body: JSON.stringify({
model: 'moonshotai/kimi-k2.5',
messages: [{ role: 'user', content: yourPrompt }],
max_tokens: 1024
})
});
const { choices } = await res.json();
return NextResponse.json({ result: choices[0].message.content });Add
NVIDIA_API_KEY=your_keyto.env.local
npm install next-auth
# 1. Create src/app/api/auth/[...nextauth]/route.ts with your provider
# 2. Replace localStorage.setItem("auth_token",...) in auth/page.tsx with signIn()
# 3. Replace localStorage.getItem("auth_token") in dashboard/page.tsx with useSession()npm install resend
# Replace the { sent: true } mock in notification routes with:
# await resend.emails.send({ from: 'you@domain.com', to: email, subject, html })npm install stripe @stripe/stripe-js
# Replace demo payment routes with real Stripe checkout sessionsAll the UI is already wired up. Every form already calls the right API route. You only need to swap the stubbed returns for real implementations.
Couples with vastly different caloric needs (e.g., 1200 cal IBS-friendly vs 2800 cal unrestricted) face daily friction planning, shopping, and cooking meals without waste or resentment
- β Buying separate groceries creates waste and fridge clutter
- β Resentment builds when one partner eats 'diet food' while other eats 'normal food'
- β Decision fatigue from planning two different meals every night
- β Difficulty tracking IBS triggers while cooking shared base ingredients
Dual-profile smart matching algorithm that pairs recipes with overlapping base ingredients but different portion scaling and macro adjustments
Unified grocery list generator with ingredient consolidation logic (e.g., buying 1 chicken breast for partner A, 3 for partner B, cooked together)
Synchronized cooking timeline scheduler that coordinates prep times so both meals finish simultaneously despite different portion sizes
IBS trigger conflict detector that flags shared ingredients problematic for restricted diets and suggests safe alternatives
Leftover optimization engine that converts dinner components into next-day lunches calibrated to each partner's caloric target
Weekly compromise resolver suggesting 'bridge meals' that satisfy both profiles when schedules or preferences clash
Shared pantry tracker with consumption rates per person to prevent over-purchasing bulk items only one partner eats
A step-by-step breakdown of how each feature is built. Use this as your dev roadmap.
π₯ 1. Dual-profile smart matching algorithm that pairs recipes with overlapping base ingredients but different portion scaling and macro adjustments
What it does: Dual-profile smart matching algorithm that pairs recipes with overlapping base ingredients but different portion scaling and macro adjustments
How to implement:
| Step | What to do |
|---|---|
| 1. API Route | Create src/app/api/dual-profile-smart-matching-algorithm-that-pairs-recipes-with-overlapping-base-ingredients-but-different-portion-scaling-and-macro-adjustments/route.ts with a POST handler |
| 2. Input Schema | Accept { userId?, ...featureParams } in the request body |
| 3. Server Logic | Process the request, call external APIs if needed, return JSON |
| 4. UI Component | Create src/components/DualprofilesmartmatchingalgorithmthatpairsrecipeswithoverlappingbaseingredientsbutdifferentportionscalingandmacroadjustmentsSection.tsx |
| 5. Wire up | Call /api/dual-profile-smart-matching-algorithm-that-pairs-recipes-with-overlapping-base-ingredients-but-different-portion-scaling-and-macro-adjustments from the component using fetch on form submit |
Potential enhancements:
- β‘ Cache repeated lookups with
unstable_cacheor Redis - π Add rate limiting to
/api/dual-profile-smart-matching-algorithm-that-pairs-recipes-with-overlapping-base-ingredients-but-different-portion-scaling-and-macro-adjustments(e.g. Upstash Ratelimit) - π± Make the UI section responsive-first (mobile breakpoints)
- π Log feature usage to analytics (Plausible / PostHog)
- π§ͺ Add an integration test for the API route
What it does: Unified grocery list generator with ingredient consolidation logic (e.g., buying 1 chicken breast for partner A, 3 for partner B, cooked together)
How to implement:
| Step | What to do |
|---|---|
| 1. API Route | Create src/app/api/unified-grocery-list-generator-with-ingredient-consolidation-logic/route.ts with a POST handler |
| 2. Input Schema | Accept { userId?, ...featureParams } in the request body |
| 3. Server Logic | Process the request, call external APIs if needed, return JSON |
| 4. UI Component | Create src/components/UnifiedgrocerylistgeneratorwithingredientconsolidationlogicSection.tsx |
| 5. Wire up | Call /api/unified-grocery-list-generator-with-ingredient-consolidation-logic from the component using fetch on form submit |
Potential enhancements:
- β‘ Cache repeated lookups with
unstable_cacheor Redis - π Add rate limiting to
/api/unified-grocery-list-generator-with-ingredient-consolidation-logic(e.g. Upstash Ratelimit) - π± Make the UI section responsive-first (mobile breakpoints)
- π Log feature usage to analytics (Plausible / PostHog)
- π§ͺ Add an integration test for the API route
π¨ 3. Synchronized cooking timeline scheduler that coordinates prep times so both meals finish simultaneously despite different portion sizes
What it does: Synchronized cooking timeline scheduler that coordinates prep times so both meals finish simultaneously despite different portion sizes
How to implement:
| Step | What to do |
|---|---|
| 1. API Route | Create src/app/api/synchronized-cooking-timeline-scheduler-that-coordinates-prep-times-so-both-meals-finish-simultaneously-despite-different-portion-sizes/route.ts with a POST handler |
| 2. Input Schema | Accept { userId?, ...featureParams } in the request body |
| 3. Server Logic | Process the request, call external APIs if needed, return JSON |
| 4. UI Component | Create src/components/SynchronizedcookingtimelineschedulerthatcoordinatespreptimessobothmealsfinishsimultaneouslydespitedifferentportionsizesSection.tsx |
| 5. Wire up | Call /api/synchronized-cooking-timeline-scheduler-that-coordinates-prep-times-so-both-meals-finish-simultaneously-despite-different-portion-sizes from the component using fetch on form submit |
Potential enhancements:
- β‘ Cache repeated lookups with
unstable_cacheor Redis - π Add rate limiting to
/api/synchronized-cooking-timeline-scheduler-that-coordinates-prep-times-so-both-meals-finish-simultaneously-despite-different-portion-sizes(e.g. Upstash Ratelimit) - π± Make the UI section responsive-first (mobile breakpoints)
- π Log feature usage to analytics (Plausible / PostHog)
- π§ͺ Add an integration test for the API route
π 4. IBS trigger conflict detector that flags shared ingredients problematic for restricted diets and suggests safe alternatives
What it does: IBS trigger conflict detector that flags shared ingredients problematic for restricted diets and suggests safe alternatives
How to implement:
| Step | What to do |
|---|---|
| 1. API Route | Create src/app/api/ibs-trigger-conflict-detector-that-flags-shared-ingredients-problematic-for-restricted-diets-and-suggests-safe-alternatives/route.ts with a POST handler |
| 2. Input Schema | Accept { userId?, ...featureParams } in the request body |
| 3. Server Logic | Process the request, call external APIs if needed, return JSON |
| 4. UI Component | Create src/components/IBStriggerconflictdetectorthatflagssharedingredientsproblematicforrestricteddietsandsuggestssafealternativesSection.tsx |
| 5. Wire up | Call /api/ibs-trigger-conflict-detector-that-flags-shared-ingredients-problematic-for-restricted-diets-and-suggests-safe-alternatives from the component using fetch on form submit |
Potential enhancements:
- β‘ Cache repeated lookups with
unstable_cacheor Redis - π Add rate limiting to
/api/ibs-trigger-conflict-detector-that-flags-shared-ingredients-problematic-for-restricted-diets-and-suggests-safe-alternatives(e.g. Upstash Ratelimit) - π± Make the UI section responsive-first (mobile breakpoints)
- π Log feature usage to analytics (Plausible / PostHog)
- π§ͺ Add an integration test for the API route
π 5. Leftover optimization engine that converts dinner components into next-day lunches calibrated to each partner's caloric target
What it does: Leftover optimization engine that converts dinner components into next-day lunches calibrated to each partner's caloric target
How to implement:
| Step | What to do |
|---|---|
| 1. API Route | Create src/app/api/leftover-optimization-engine-that-converts-dinner-components-into-next-day-lunches-calibrated-to-each-partner-s-caloric-target/route.ts with a POST handler |
| 2. Input Schema | Accept { userId?, ...featureParams } in the request body |
| 3. Server Logic | Process the request, call external APIs if needed, return JSON |
| 4. UI Component | Create src/components/LeftoveroptimizationenginethatconvertsdinnercomponentsintonextdaylunchescalibratedtoeachpartnerscalorictargetSection.tsx |
| 5. Wire up | Call /api/leftover-optimization-engine-that-converts-dinner-components-into-next-day-lunches-calibrated-to-each-partner-s-caloric-target from the component using fetch on form submit |
Potential enhancements:
- β‘ Cache repeated lookups with
unstable_cacheor Redis - π Add rate limiting to
/api/leftover-optimization-engine-that-converts-dinner-components-into-next-day-lunches-calibrated-to-each-partner-s-caloric-target(e.g. Upstash Ratelimit) - π± Make the UI section responsive-first (mobile breakpoints)
- π Log feature usage to analytics (Plausible / PostHog)
- π§ͺ Add an integration test for the API route
π€ 6. Weekly compromise resolver suggesting 'bridge meals' that satisfy both profiles when schedules or preferences clash
What it does: Weekly compromise resolver suggesting 'bridge meals' that satisfy both profiles when schedules or preferences clash
How to implement:
| Step | What to do |
|---|---|
| 1. API Route | Create src/app/api/weekly-compromise-resolver-suggesting-bridge-meals-that-satisfy-both-profiles-when-schedules-or-preferences-clash/route.ts with a POST handler |
| 2. Input Schema | Accept { userId?, ...featureParams } in the request body |
| 3. Server Logic | Process the request, call external APIs if needed, return JSON |
| 4. UI Component | Create src/components/WeeklycompromiseresolversuggestingbridgemealsthatsatisfybothprofileswhenschedulesorpreferencesclashSection.tsx |
| 5. Wire up | Call /api/weekly-compromise-resolver-suggesting-bridge-meals-that-satisfy-both-profiles-when-schedules-or-preferences-clash from the component using fetch on form submit |
Potential enhancements:
- β‘ Cache repeated lookups with
unstable_cacheor Redis - π Add rate limiting to
/api/weekly-compromise-resolver-suggesting-bridge-meals-that-satisfy-both-profiles-when-schedules-or-preferences-clash(e.g. Upstash Ratelimit) - π± Make the UI section responsive-first (mobile breakpoints)
- π Log feature usage to analytics (Plausible / PostHog)
- π§ͺ Add an integration test for the API route
π 7. Shared pantry tracker with consumption rates per person to prevent over-purchasing bulk items only one partner eats
What it does: Shared pantry tracker with consumption rates per person to prevent over-purchasing bulk items only one partner eats
How to implement:
| Step | What to do |
|---|---|
| 1. API Route | Create src/app/api/shared-pantry-tracker-with-consumption-rates-per-person-to-prevent-over-purchasing-bulk-items-only-one-partner-eats/route.ts with a POST handler |
| 2. Input Schema | Accept { userId?, ...featureParams } in the request body |
| 3. Server Logic | Process the request, call external APIs if needed, return JSON |
| 4. UI Component | Create src/components/SharedpantrytrackerwithconsumptionratesperpersontopreventoverpurchasingbulkitemsonlyonepartnereatsSection.tsx |
| 5. Wire up | Call /api/shared-pantry-tracker-with-consumption-rates-per-person-to-prevent-over-purchasing-bulk-items-only-one-partner-eats from the component using fetch on form submit |
Potential enhancements:
- β‘ Cache repeated lookups with
unstable_cacheor Redis - π Add rate limiting to
/api/shared-pantry-tracker-with-consumption-rates-per-person-to-prevent-over-purchasing-bulk-items-only-one-partner-eats(e.g. Upstash Ratelimit) - π± Make the UI section responsive-first (mobile breakpoints)
- π Log feature usage to analytics (Plausible / PostHog)
- π§ͺ Add an integration test for the API route
User Request
β
βΌ
Next.js Edge βββΊ API Route βββΊ Business Logic βββΊ Data Store
β β
React UI βββββββββββββββββββ Response / JSON
β
Real-time UI Update
| Attribute | Details |
|---|---|
| Audience | Cohabiting couples where one partner has dietary restrictions (IBS, low FODMAP, low caloric needs) and the other has standard/high caloric requirements |
| Tech Level | π‘ Medium |
| Pain Level | High |
| Motivations | Reduce relationship friction around food β’ Achieve health goals without sacrificing partner intimacy |
| Price Willingness | medium |
MVP Factory Validation Report β 2026-03-01
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
PASS Market Demand ββββββββββ 9/10
β
PASS Competition Gap ββββββββββ 8/10
β
PASS Technical Feasibility ββββββββββ 8/10
β
PASS Monetization Potential ββββββββββ 7/10
β
PASS Audience Fit ββββββββββ 8/10
βββββββββββββββββββββββββββββββββββββββββββββββββββββ
OVERALL SCORE ββββββββββ 8.1/10
VERDICT π’ BUILD β Strong market opportunity
TESTS PASSED 5/5
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Why this works: Exceptional Reddit validation (1982 upvotes, 494 comments) proves acute demand for this specific use case. No existing meal planner treats couples as a unit while respecting divergent physiological needs. The dual-profile optimization creates a genuine moat against generic planners. Freemium model fits weekly usage pattern while allowing viral growth through partner invites.
Unique angle: π‘ Treats the couple as a cooking unit rather than two isolated users, algorithmically optimizing for shared prep time and ingredient overlap while maintaining strict dietary boundaries
Competitors analyzed: PlateJoy (single-profile personalized planning), Eat This Much (macro-focused, individual use only), Mealime (simple family planning without caloric divergence handling)
Next.js 14 App Router + TypeScript + TailwindCSS + Lucide-react
| Layer | Technology | Purpose |
|---|---|---|
| π₯οΈ Frontend | Next.js 14 App Router | React framework |
| π¨ Styling | TailwindCSS | Utility-first CSS |
| π Backend | Next.js API Routes | Serverless endpoints |
| πΎ Data | Server-side logic | Business processing |
| π Deploy | Vercel | Edge deployment |
# Clone & install
git clone https://github.com/guyromb/splitplate.git
cd splitplate
npm install
# Start development
npm run dev
# β http://localhost:3000
# Build for production
npm run build
npm start# Add your keys here
NEXT_PUBLIC_APP_NAME=SplitPlate| Signal | Data |
|---|---|
| π΄ Problem Severity | High |
| π Market Demand | 9/10 |
| π Competition Gap | 8/10 β Blue ocean π |
| π° Monetization | 7/10 |
| π― Model | π Freemium β Paid |
| π£ Source | reddit community signal |
Contributions are welcome! Here's how:
- Fork the repo
- Create your branch:
git checkout -b feature/amazing-feature - Commit:
git commit -m 'Add amazing feature' - Push:
git push origin feature/amazing-feature - Open a Pull Request
MIT License β see LICENSE for details.
Discovered from reddit Β· Built 2026-03-01 Β· Powered by MVP Factory v11
Autonomously researched, validated & generated β zero human code written