Inspiration

At midnight, she finally returns to a cramped shared apartment, exhausted from juggling multiple jobs between a restaurant and a convenience store. Her feet ache, her time is gone, and cooking feels impossible. That day, she earned a little extra tip. You might think more money would mean better meals, healthier choices. But in reality, as depicted by the book Nickel and Dimed, she defaults to the same fast, familiar junk food. Not because she doesn’t want better, but because habits, time, and infrastructure quietly limit her choices.

We began to notice those same invisible constraints everywhere.

Students, after years of mandatory college meal plans, suddenly had to fend for themselves. During exam weeks when every minute matters, quick and nutritious meals became a daily struggle. Limited by time and energy.

For others, like Muslim students trying to follow dietary restrictions, even finding reliable sources of food can be stressful. Limited by the lack of trustworthy, personalized resources.

So we asked: what if technology doesn’t simply perpetuate the status quo, but helps people break out of them?

What it does

SnapChef turns whatever you have into personalized recipe ideas. Simply take a photo of your ingredients, add preferences, and tell us how many people or meals you’re planning for. This AI tool greatly reduces the time and effort spent deciding what to make.

What makes SnapChef powerful is how it adapts to you. It personalizes recipes based on your goals, dietary restrictions, and available kitchen tools, while prioritizing ingredients by freshness to maximize what you already have and reduce waste. Whether you’re cooking on a budget, managing specific dietary needs, or just trying to save time, SnapChef adjusts to fit your life.

Each recipe includes estimated cook time and nutritional information. Users can even save their favorites for later, making it easier to build habits and cook smarter over time.

How we built it

SnapChef is a full-stack web application using React for the frontend and Node.js for the backend, mainly developed in VSCode. On the backend, we connected our system to a PostgreSQL database to store user profiles, preferences, and favorite recipes. We integrated Clerk for authentication and created a user-mapping layer to link Clerk users with our internal database, enabling persistent data and cross-device syncing.

At the core of SnapChef is our AI engine powered by the GPT-4o-mini API. We use carefully structured prompts with contextual inputs to generate personalized recipes. Through layered prompt design and fine tuning we ensure the outputs are practical and adaptable to real life.

For development and collaboration, we used GitHub for version control, managing changes through commits and pull requests. Our repository is connected to Vercel, where every push is automatically deployed publicly.

Architectural Stack: Built from scratch with Next.js 16 (App Router) + React 19 + TypeScript, Clerk auth, OpenAI gpt-4o-mini for recipe generation and ingredient detection, Neon PostgreSQL for persistence, Tailwind CSS v4 for styling, refined with GitHub Copilot, and deployed on Vercel.

Challenges we ran into

One of the biggest challenges was balancing personalization with user convenience. Early on, we required users to input many details for each recipe, which improved results but made the process tedious. We redesigned the system by moving stable information (like dietary restrictions and goals) into a persistent user profile stored in PostgreSQL, while keeping per-session inputs minimal. This allowed us to maintain strong personalization without slowing down the user experience.

Another challenge was debugging authentication and cross-stack integration. Although Clerk login appeared to work, the frontend didn’t consistently react and errors surfaced in unrelated areas (e.g., CAPTCHA initialization warnings and Next.js image domain issues with img.clerk.com). This couldn’t be fixed by a single prompt. Instead, we traced the full data flow, including frontend auth state, API calls, backend logic, and database writes, checking each layer step by step. By isolating issues, we fixed the configuration mismatches and missing Next.js settings, ensuring reliable user syncing and rendering.

Accomplishments that we're proud of

We’re proud that we didn’t just call an API—we engineered how it reasons. Instead of sending everything as a single prompt, we separated system and user messages, placing non-negotiable rules (like allergy constraints, freshness prioritization, and structured output) in the system layer. This ensured the model treated them as hard constraints rather than suggestions. User attributes like goals, biological context, and available kitchen tools were injected into the prompt, allowing the model to adjust nutrition, portioning, and cooking methods dynamically.

To ensure reliability, we enforced structured outputs using response_format: { type: "json_object" } and tuned temperature (e.g., 0.4 for generation, 0.2 for vision tasks), reducing hallucinations and making responses more consistent. This lets us simplify parsing logic into a clean, deterministic pipeline.

We also stress-tested edge cases. When users input irrelevant ingredients or upload unrelated images, the system detects and filters them out instead of forcing them into recipes. For example, when we tested it with a photo of multivariable calculus homework, we were relieved it didn’t try to turn triple integrals into a dish.

Beyond the technical system, we’re proud of our design mission. Instead of asking users to plan perfectly, SnapChef meets them where they are, and makes what they have work.

What we learned

We understood the significance of designing a full-stack system. This was particularly important when debugging, as separating frontend and backend code was much more efficient. Finally, we were taught to design a system with AI included. This involved controlling input variables, such as system prompts versus user prompts, as well as output variables. Parameters were adjusted to increase efficiency. Finally, version control via GitHub was critical in our development. This was particularly important given our rapid development cycle.

On the product side, we learned that constraints are often the real problem, not lack of effort. People don’t struggle to cook because they don’t care, but because they’re limited by time, habits, resources, and uncertainty. Designing SnapChef shifted our thinking from “giving better options” to “working within real-life constraints,” which ultimately led to a more practical and impactful solution.

What's next for SnapChef

The next step for SnapChef is to move beyond static recommendations and become something that actually learns from you over time. We want to bring in machine learning and reinforcement learning so the system can pick up on patterns in what you cook, skip, or change. Instead of asking you to constantly input preferences, SnapChef would gradually understand your habits, constraints, and goals on its own, making the experience feel more natural and less repetitive.

At the same time, we want to make ingredient recognition much more reliable. By using more advanced computer vision models, including transformer-based architectures with attention mechanisms and multimodal systems, SnapChef can better understand what’s actually in an image and ignore irrelevant inputs. Together, these improvements move SnapChef closer to being a system that doesn’t just suggest recipes, but helps you make better decisions, save time and energy, and get the most out of what you already have.

Built With

Share this project:

Updates