Home Cooking Platform
A full-stack recipe platform with real multi-constraint search, not a toy CRUD demo.
FlaskPostgreSQLSQLAlchemySQL
The Problem
Recipe apps often ignore practical constraints — what ingredients you actually have on hand, or real dietary restrictions — and just return anything that loosely matches a search term.
The Approach
Built a full-stack Flask + PostgreSQL application around a real 10-table relational schema, with search logic that dynamically builds parameterized SQL to match ALL of a user's selected ingredients and dietary restrictions at once — not just any of them — plus session-based auth and a live-updating review/rating system.


- ▹Schema: Users, Recipes (with FKs to NutritionalInfo and FlavorProfiles), Ingredients, Contains (recipe↔ingredient join), DietaryRestrictions + CompatibleWith (recipe↔restriction join), Saves, Reviews — indexed on UserID, CuisineType, and AverageRating
- ▹Search query joins Contains→Ingredients and CompatibleWith→DietaryRestrictions, groups by recipe, and uses HAVING COUNT(...) to require that a recipe matches every requested ingredient/restriction — the correct SQL pattern for "match all" filtering, as opposed to a naive WHERE...IN that would under-constrain results
Highlights
- ▹10-table relational schema (users, recipes, ingredients, dietary restrictions, nutrition, flavor profiles, saves, reviews) with real indexes on the columns actually queried
- ▹Search correctly enforces "match every selected filter" using SQL GROUP BY + HAVING, rather than the common mistake of loosely matching any of them
- ▹Session-based auth with UUID primary keys and password-length validation
- ▹Posting a review updates the recipe's running average rating in the same transaction
- ▹Built with the Flask application-factory pattern and Blueprints, split cleanly into main/auth/recipe/user route modules