Inspiration

Most people don't have a recipe discovery problem — they have an execution problem.

We save recipes from TikTok/YouTube/blogs, screenshots, and links… and then dinner still becomes:

  • "What should I cook today?"
  • "Do I have the ingredients?"
  • "What exactly should I buy, and how much?"
  • "I lose the recipe mid-cook and timers are everywhere."

Kitsho (Cook + Shop) was built to match the Shipyard brief: "From saved recipe to dinner made."
So the app is designed around one goal: turn any saved recipe into a plan you can actually finish — ingredients → shopping list → guided cook mode.


What it does

Kitsho is a production-ready mobile app that combines:

  • AI-powered recipe import + generation
  • smart categorized shopping lists
  • step-by-step cook mode with timers
  • RevenueCat-powered Pro subscription

The core loop (what makes dinner happen)

Step What the user does What Kitsho produces
1) Pick Import a recipe (link/video/text) or cook from pantry A clean structured recipe
2) Check Mark ingredients as Have / Need A "what's missing" view
3) Shop Missing items auto-fill a categorized list A smart shopping list (no e-commerce)
4) Cook Start Cook Mode with steps + timers Progress tracking + completion summary

Core features (MVP)

Feature Details
Cook from Pantry (AI) Add ingredients as chips, set filters (time/diet/cuisine/equipment), generate personalized suggestions
Recipe Import Paste link, video URL, or text → AI extracts + normalizes → review/edit before saving
Smart Shopping List Auto-categorized (Produce/Dairy/Meat/Pantry/etc.), check-off, quick add, clear checked, share list
Cook Mode Step-by-step interface, progress tracking, per-step timers, step completion, cooking stats + summary
Saved Recipes Collections + favorites with quick access
Preferences Diet, skill level, equipment, units (metric/imperial), default servings

Pro subscription (RevenueCat)

Kitsho Pro is designed as an upgrade for confidence + speed, not basic usability.

Tier What you get Limits
Free Core cooking + shopping experience 3 AI operations/week (import + generate combined), tracked
Pro (RevenueCat) Unlimited import + unlimited AI generation + AI Fix Recipe + Daily Suggestions No limits

Pro-only highlights

  • Fix Recipe with AI: improves formatting, quantities, units, and instructions
  • Daily Suggestions: personalized recommendations based on preferences and history, cached per user/day

How we built it

Stack

Layer Tech
Mobile Flutter (Riverpod + go_router)
Backend Firebase (Firestore + Security Rules, Auth, Storage, Cloud Functions)
AI Google Gemini 2.5 via Firebase Cloud Functions
Monetization RevenueCat subscriptions + entitlement gating + webhook sync
Security flutter_secure_storage + local_auth (biometrics)

Architecture (high level)

  • Riverpod powers app state (auth, pro status, preferences, recipe data, shopping lists).
  • Firebase stores everything with Security Rules so users only access their own data.
  • All AI runs server-side via Cloud Functions to keep keys private and enforce consistent output formats.

AI implementation (Gemini 2.5 + Cloud Functions)

Cloud Function Purpose Model
aiImportRecipe Extract recipe from link/video/text Free: gemini-2.5-flash / Pro: gemini-2.5-pro
aiGenerateFromPantry Generate recipes from pantry + filters gemini-2.5-flash
aiFixRecipe (Pro) Normalize/improve recipe formatting gemini-2.5-pro
aiNormalizeIngredients Clean names, quantities, categories gemini-2.5-flash-lite
dailySuggestions (Pro) Daily personalized recipe suggestions (Cloud Function; cached per day)
revenuecatWebhook Sync subscription events → DB Webhook handler

RevenueCat implementation (what judges care about)

  • RevenueCat manages subscriptions and entitlements (Kitsho Pro).
  • Kitsho also uses a dual-source Pro check for reliability: 1) RevenueCat entitlement
    2) Backend Pro status in Firestore kitsho_pro_users collection (kept in sync via webhook)

This prevents "Pro drift" if a client state is stale and enables server-side Pro checks for AI features.

Security & auth

  • Email auth + magic link (OTP) + Google OAuth with deep-link callback.
  • Optional biometric unlock + protected actions.
  • API keys stored in Firebase Functions environment variables (never shipped to the client).

Challenges we ran into

Challenge Why it's hard What we did
Importing from "real-world" content Recipes are inconsistent: missing quantities, vague steps, messy formatting Added a Review & Edit screen + Pro-only Fix Recipe with AI
Making AI output trustworthy Users won't cook if they don't trust the recipe Enforced structured outputs + normalization + clear user control
"Cook + Shop" as one product Many apps split this into separate experiences Built a single execution loop: Check → List → Cook
Subscription gating without ruining UX Paywalls too early kill trust Free tier proves value; Pro unlocks power features + unlimited usage

Accomplishments that we're proud of

  • Shipped a working Cook + Shop loop that closes the execution gap.
  • Built real AI flows: pantry generation + import + normalization + Pro fix.
  • Implemented RevenueCat Pro with a robust backend sync strategy (webhook + Firestore).
  • Delivered Cook Mode with timers, progress, and a completion summary that reinforces habit.
  • Added real security primitives (Firebase Security Rules, secure storage, biometrics) for production readiness.

What we learned

  • "Saved recipes" don't equal meals — momentum is the product.
  • AI needs guardrails: structured formats + review screens = trust.
  • The highest leverage UX is reducing friction at the exact moment a user decides to cook.
  • Monetization works best when it upgrades confidence and speed, not basic cooking.

What's next for Kitsho | From Saved Recipe to Dinner Made

Roadmap

Timeframe Next steps
Next 2–4 weeks Improve video import robustness, better ingredient normalization, tighter cook-mode UX
Next 1–2 months Smarter substitutions, meal queue ("Cook this week"), reminders tied to shopping list status
Future Creator/community phase (profiles, video feed, likes/comments), shared household lists, deeper personalization

Kitsho's north star stays simple: turn "saved" into "served."

Built With

  • app-links
  • cached-network-image
  • dart
  • firebase
  • firebase-auth
  • firebase-cloud-functions
  • firebase-storage
  • firestore
  • flutter
  • flutter-secure-storage
  • go-router
  • google-fonts
  • google-gemini-api
  • google-sign-in
  • http
  • image-picker
  • local-auth
  • node.js
  • revenuecat
  • riverpod
  • share-plus
  • typescript
  • video-player
Share this project:

Updates