This is a submission for the Hacktoberfest Weekend Challenge: Build for a Friend.
What I Built
I built NutriMate for a friend who wants meals that support their workout routine while keeping food expenses within an affordable budget.
That gave me a concrete problem to work on: turn a fitness goal and a daily budget into practical meals using familiar Sri Lankan ingredients.
NutriMate is a meal-planning app powered by Gemma, Google’s open-weight model. It combines profile information, dietary preferences, budget, and previous meal feedback to generate personalized plans.
The app includes:
- Multi-day meal plans with estimated calories, protein, carbohydrates, fat, and cost.
- Ingredients and preparation instructions for each meal.
- Meal replacements that must fit the rest of the day’s plan.
- A grocery list generated from the planned meals.
- Meal completion tracking and plan history.
- Feedback through ratings, comments, and tags such as “too expensive” or “too spicy.”
Sri Lankan food is central to the experience. The generation prompts emphasize dishes and ingredients such as red rice, dhal, string hoppers, eggs, fish, and local vegetables.
My friend has no special cooking restrictions, so the focus is affordability and workout-related meal planning. The app also supports dietary exclusions and allergy information for users who need them.
Demo
https://drive.google.com/drive/folders/1m9L4f9kfHT88joQW3xmM69XyJY434GFV?usp=drive_link
Code
GitHub repository: https://github.com/charan2r/nutri-mate.git
How I Built It
NutriMate is built as a mobile app for easy usage.
The stack is:
- React Native and Expo for the mobile interface.
- NestJS and TypeScript for the backend.
- PostgreSQL and TypeORM for profiles, plans, meals, and feedback.
- Gemma, served through Google’s hosted API, for meal plan and replacement generation.
The generation flow is:
Profile and preferences → Gemma → structured meal data → validation → saved plan and groceries
A major part of the work was deciding what should happen when a model returns incomplete or unsuitable information.
The backend rejects missing meal slots, incomplete nutrition, invalid numbers, unknown catalogue IDs, and missing prices. Each day must meet its calorie target within a 10% tolerance and stay within its budget. Reported calories are also checked against the meal’s macros for plausibility.
When a model selects a reviewed database meal, the backend uses that record’s actual ingredients and nutrition before validating the plan.
Replacement generation is also the same. A proposed swap must fit the complete plan, and saving it updates the meal, totals, validation results, and groceries in one database transaction.
Why Does Open Innovation Matter?
For this project, the value of open weights is the ability to choose how the AI runs as the application develops.
Gemma handles the core generation tasks. Its available weights create a path toward running the model on infrastructure I control and adapting it to a more specific food-planning task. That matters for an application built around personal preferences and regional food knowledge.
I separated inference behind a provider interface, allowing the hosting implementation to change without rebuilding the mobile experience or validation engine.
The current version uses hosted Gemma, so the profile context and feedback included in prompts are sent to Google. Self-hosting and fine-tuning are future possibilities, rather than features demonstrated in this version.
Open innovation also makes the surrounding application easier to inspect and improve. Someone can review the budget rules, contribute better Sri Lankan meal data, improve ingredient matching, or change how feedback influences future plans.
For my friend’s use case, those improvements matter: better local food knowledge and more realistic prices can make a meal plan more useful in everyday life.
Prize Categories
Gemma is the central model for generating meal plans and replacement recipes. The application’s prompts, structured response handling, and validation workflow are built around those tasks.
Render is used to host the backend of the application.
Top comments (0)