Inspiration

We've all opened the fridge, stared at a half-empty shelf, and ordered takeout anyway. Not because we couldn't cook — because figuring out what to make from random ingredients takes more mental energy than it's worth. Chefit started as a fix for that moment. The idea was simple: tell the app what you have, and it tells you what to cook. No meal planning, no grocery list from scratch, no wasted produce rotting in the back of the drawer.

We also noticed that cooking apps are either recipe libraries with no awareness of your pantry, or rigid meal planners that assume you shop perfectly every week. There was nothing that started with your reality and worked forward from there.

What it does

Chefit lets you build a pantry board by typing or scanning a photo of your ingredients. From there, it fetches live recipes from the Edamam API and ranks them by how well they match what you actually have — separating "ready to cook" recipes (you have everything) from "almost there" ones (missing one or two items). Recipes nearing your expiry dates bubble to the top so nothing goes to waste.

Missing something? Add it to a built-in shopping list, then tap to open Instacart, Kroger, Walmart, or Amazon Fresh with your list pre-loaded. Each provider shows a price estimate and item coverage so you can pick the best option.

Beyond the pantry, Chefit is a social platform. Users post photos of their finished dishes, leave star ratings and written reviews on recipes, and comment on each other's posts. Profiles show your cooking history as a grid of posts.

How we built it

Frontend: SwiftUI targeting iOS 17+ and macOS 14+. We built a full design system — custom colors, Nunito typography, an 8px spacing grid, and reusable components (recipe cards, ingredient chips, bottom sheets) — to keep the UI consistent across every screen.

Backend: Node.js and Express with PostgreSQL on Neon. REST API handles auth (JWT stored in Keychain), posts, comments, reviews, and user profiles. Image uploads go through Cloudinary for CDN delivery.

Recipe intelligence: A RecipeDiscoveryPlanner builds protein-led query batches against the Edamam API. RecipeMatcher scores results with a weighted formula — ingredient coverage at 50%, protein hits as a bonus, missing ingredient count as a penalty, and cooking time as a tiebreaker. Meal context (time of day) filters recipes to appropriate cooking times.

Ingredient scanning: Camera and photo library input feeds an AI-powered detection pipeline that canonicalizes ingredient names, assigns confidence scores, and lets users confirm before anything hits the pantry.

Challenges we ran into

Ranking recipes fairly. A recipe that uses 8 of your 10 ingredients feels better than one that uses 3 of 3 — but a perfect 3-ingredient match is also genuinely ready to cook. Getting the scoring formula to surface both kinds without burying one took a lot of iteration on the weight values.

Ingredient normalization. Users type "chix breast," "chicken breasts," "boneless chicken" — all the same thing. Building a normalizer and protein detector that collapses these reliably without false positives (collapsing "sweet potato" and "potato" into one) was harder than expected.

Cross-platform SwiftUI layout. The same view needs to work on an iPhone in portrait and a Mac at full width. We landed on a responsive breakpoint at 920px that switches between a panel layout and a single-column stack, but hitting that without layout ambiguity warnings took significant constraint work.

Multipart uploads on iOS. Cloudinary image uploads from SwiftUI required hand-rolling multipart form-data encoding with boundary strings — there's no native SwiftUI API for this, so we had to build it from URLSession primitives.

Accomplishments that we're proud of

  • A pantry-to-recipe pipeline that feels fast and genuinely useful — scan a photo, get ranked recipes in seconds.
  • A scoring algorithm that correctly distinguishes "you can make this right now" from "you're one ingredient away" without false confidence on either side.
  • A full social layer (posts, comments, reviews, profiles) built on top of the core cooking utility — it doesn't feel bolted on.
  • A consistent design system across every screen: same colors, same type scale, same component patterns whether you're on iPhone or Mac.
  • Shopping list integration that connects directly to five grocery providers with live price and coverage estimates.

What we learned

SwiftUI's declarative model is powerful but unforgiving about state ownership — we learned early to centralize pantry and cart state in observable stores rather than passing it down through view hierarchies. Reactivity became much easier once IngredientStore and FavoriteRecipeStore were the single sources of truth.

On the backend side, designing the review system as an upsert (create-or-update) from the start saved us from having to handle "did this user already review this recipe?" logic on the client. Pushing that decision to the database layer with a conflict clause kept the Swift code simple.

The biggest product lesson: expiry-date-aware ranking matters more than we expected. Surfacing recipes that use ingredients about to expire changed how the app felt from "search tool" to "kitchen assistant."

What's next for Chefit

  • Follow system — follow other cooks and get a personalized feed from people you care about.
  • Cooking mode — step-by-step instructions with a built-in timer, hands-free voice navigation.
  • Dietary preferences — filter discovery by vegetarian, vegan, gluten-free, and allergen tags.
  • Notifications — expiry alerts, new posts from followed users, comment replies.
  • Apple Sign In — faster onboarding alongside email/password.
  • Likes on posts — engagement signal to surface popular community dishes.
Share this project:

Updates