Inspiration
We’re all drowning in food content—TikTok, Reels, Shorts, blogs, cookbooks—and almost none of it actually makes it to our plates. We save links, DM recipes, screenshot ingredient lists… and then forget about them.
As a food creator myself, I’m part of that problem. I wanted an app that closes the gap between “that looks amazing” and actually cooking it.
Cook From Saved is that missing piece: a place where all those saved recipes go to get finished, not forgotten.
What it does
Cook From Saved is an AI‑powered recipe and planning app focused on execution:
Capture from anywhere
- Use the system share sheet / Share Extension to send links or videos from TikTok, Instagram, YouTube, and the browser straight into the app.
- Paste any recipe link in the app and let AI extract a structured recipe.
- Scan a cookbook or magazine page to pull out ingredients and steps.
- Snap a photo of ingredients and get recipe matches from your saved library.
AI recipe extraction (Vertex AI / Gemini)
- Uses Firebase Vertex AI (Gemini 2.5 Flash via
firebase_ai) to: - Turn social video links or downloaded videos into full recipes (title, ingredients, steps, tags, calories).
- Turn arbitrary recipe URLs into structured recipes.
- Detect ingredients from images and match them to your existing recipes.
- Outputs follow a strict JSON schema so the UI stays consistent and avoids hallucinated recipes.
- Uses Firebase Vertex AI (Gemini 2.5 Flash via
Organize and resurface
- Home shows a personalized feed:
- “Coming up” (today, tomorrow, this week) based on your meal plan.
- “Still want to cook these?” resurfacing older, forgotten saves.
- Recent recipes carousel with platform badges (TikTok, IG, YouTube, web).
- Smart messaging based on time of day (“What’s for lunch today?”, etc.).
Plan your meals
- A dedicated Meal Planner screen with a weekly calendar.
- Plan saved recipes onto specific days with a polished bottom‑sheet “plan a meal” picker.
- Today’s plans surface across the app (notification bell + “Today’s Plan” bottom sheet).
Smart grocery list
- Convert any recipe into an ingredient‑level shopping list, automatically categorized (Produce, Dairy, Meat, etc.).
- Support for:
- Grouping items by grocery category with emojis (🥬, 🥩, 🥛, etc.).
- Checking off items and collapsing completed ones to the bottom.
- Scaling ingredients by servings and auto‑updating quantities in the list.
- Two views:
- Recipes: see each recipe with its ingredients and missing/available items.
- All items: a combined grocery view by category for store navigation.
Monetization with RevenueCat
- Free tier
- Up to 3 saved recipes (
freeRecipeLimit = 3). - Basic home view and shopping list.
- Pro tier (subscription via RevenueCat)
- Unlocks Scan (cookbook/ingredient scanning) and the Meal Planner tab.
- Removes recipe save limit (unlimited saved recipes).
- Unlocks advanced AI flows like ingredient‑based matching and richer planning.
- Paywall shown on launch for non‑Pro users and when hitting feature gates.
How I built it
Core tech stack
- Flutter (
sdk: ">=3.10.1") for a single high‑quality cross‑platform mobile codebase. - State management:
providerfor controllers (ChangeNotifier) that manage recipes, scanning, shopping lists, etc. - Local data & offline support:
hive+hive_flutterfor fast, offline‑friendly storage of recipes and shopping items.- Controllers (e.g.
RecipeController,ShoppingListController) read/write viaHiveStorageService.
- Cloud & AI
firebase_coreandcloud_firestore(available for cloud backends where needed).firebase_aito call Vertex AI / Gemini 2.5 Flash for:- Video recipe extraction (
AIProcessingService.processVideoFile). - URL recipe extraction (
AIProcessingService.processUrl). - Ingredient detection from images (
IngredientScanService.extractIngredientsFromImage). - Matching available ingredients to recipes (
IngredientScanService.matchRecipesWithAI).
- Subscriptions & monetization
purchases_flutterfor RevenueCat.flutter_secure_storageto securely persist RevenueCat user IDs and cached Pro status across reinstalls.
Key flows and architecture
App entry (
main.dart)- Initializes Firebase, Hive, RevenueCat, and
WakelockPlus(keep screen on while cooking). - Integrates
share_handlerto capture links shared from other apps and route them straight to the processing flow. - Uses a
MultiProvidersetup to expose controllers andRevenueCatServiceacross the app. - Routes:
- First‑time users go through a custom onboarding flow.
- Returning users land on the Dashboard (Home, Scan, Planner, Groceries tabs).
- Initializes Firebase, Hive, RevenueCat, and
RevenueCat integration (
RevenueCatService)- Uses
purchases_flutterandflutter_secure_storageto: - Persist a stable appUserID across reinstall to prevent trial abuse.
- Fetch customer info and offerings, and compute
isProUser. - Cache Pro status in secure storage for offline fallback.
- Exposes:
initializationCompletefuture so the UI can delay the paywall until entitlements are known.purchasePackageandrestorePurchaseswrappers with user‑friendly messages.- UI gating:
DashboardView:- Shows a paywall on first launch for non‑Pro users, after RevenueCat finishes initializing.
- Gating logic for Scan and Planner tabs; tapping them opens the Pro paywall if not subscribed.
HomeView:- Uses
freeRecipeLimitand a Pro upgrade banner to nudge upgrades. - Uses
ProFeatureGatehelpers to checkrevenueCatService.isProUserbefore allowing certain actions.
- Uses
- Uses
AI pipeline for videos/links
LinkDetectionServicefigures out whether a link is social media, YouTube, or a generic recipe URL.LinkProcessingService:- For YouTube and recipe URLs: calls
AIProcessingService.processUrldirectly with Gemini. - For other socials: downloads the video with
VideoDownloadServiceand sends bytes viaInlineDataParttoAIProcessingService.processVideoFile. - Validates the AI result with
_isLikelyValidRecipeto avoid saving non‑recipes. - Annotates recipes with
sourceUrl,source(socialorweb), andvideoFilePathwhere available.
Meal planner
CalendarView:- Weekly calendar (Monday‑based) with today highlighting and “Today” shortcut.
- Per‑day sections that show planned recipes with time and calories.
- Bottom‑sheet “Plan a meal” picker that lets you attach any saved recipe to a date.
- Uses
RecipeController.planRecipe/getRecipesForDateunder the hood.
Shopping list
ShoppingListController:- Stores shopping items in Hive (with
recipeIdto relate them to recipes). - Builds:
- Per‑recipe lists (for the Recipes tab).
- Combined by‑category list (for the All Items tab) using
GroceryCategoryHelper.
- Handles:
- Check/uncheck items.
- Servings overrides per recipe and recalculation of ingredient quantities.
- Bulk actions like “Unmark all items” and “Delete all items”.
GroceriesView:- Two‑tab UI (Recipes / All items) with a pill‑style tab selector.
- Floating action button behavior changes by tab:
- In Recipes tab: add a recipe to the shopping list.
- In All Items tab: add a free‑form grocery item.
- Beautiful empty states with GIFs and clear CTAs.
Challenges
Bridging many content sources into one flow
Social videos, long‑form recipe sites, screenshots, cookbooks, and raw ingredient photos all behave differently. Designing a single pipeline that can intelligently handle or reject each case, without hallucinating recipes, took careful schema design and guardrails in the AI prompts and validation.Keeping AI helpful but safe
Using Vertex AI (Gemini 2.5) throughfirebase_airequired strict JSON schemas (RecipeJsonSchema,IngredientsJsonSchema,MatchedRecipeIdsJsonSchema) and downstream validation so that invalid or non‑recipe content doesn’t pollute the user’s library.Monetization UX
Getting RevenueCat right was not just an SDK integration problem. I had to decide:- What is free (3 saved recipes, basic grocery list).
- What is Pro (Scan, Planner, unlimited saves, richer AI features).
- Where to show the paywall so it feels natural instead of spammy (on launch for non‑Pro, plus on gating actions).
Balancing ambition with hackathon time
The vision includes more features (social meal planning, creator bundles, deeper analytics), but I focused on shipping a polished core loop: save → organize → plan → shop → cook, with a real, working subscription model.
What I learned
- How to build a production‑style subscription app with RevenueCat, including:
- Persistent app user IDs, entitlement‑driven UI, and clean paywall flows.
- How to use Vertex AI (Gemini) via
firebase_aiand design robust JSON schemas so AI output integrates cleanly into a typed Flutter data model. - How to design a food app around behavior change (getting to the “finish line”), not just another bookmarking tool.
- How to combine local‑first UX (Hive) with cloud AI services in a way that still works gracefully when the network or AI quota has issues.
What’s next
- AI‑powered automatic tagging and cuisine/difficulty classification.
- Smarter suggestions on the Home screen based on what you’ve planned and cooked.
- Shared meal plans for households and friends.
- Creator‑specific bundles (“Cook with Eitan this week”) that leverage the same infrastructure.
Log in or sign up for Devpost to join the conversation.