3rd Place — BugsByte Hackathon · Built for the Nutrium challenge track.
A full-stack AI-powered nutrition and wellness platform. Upload a photo of your fridge, get a recipe. Scan a restaurant menu, get the healthiest pick. Log how you feel, get a clinical report. All personalized to your profile.
| Module | Description |
|---|---|
| NutriChat | Conversational AI nutritionist "Vitium": answers questions about food, supplements, and wellness |
| NutriUpgrade | Transforms any dish into a healthier version targeting Nutri-Score A or B, while preserving the dish's identity |
| FoodSwap | Suggests a completely different healthy alternative to a meal, based on your preferences |
| Photo to Recipe | GPT-4o Vision scans a photo of your fridge or pantry and generates a complete recipe |
| Menu Scout | GPT-4o Vision reads a restaurant menu photo and recommends the healthiest dish |
| Food Compare | AI head-to-head nutritional comparison of two food items with a justified verdict |
| NutriMap | Finds healthy restaurants and health stores near you via Google Places API |
| Insights | Logs dietary reflections, analyzes sentiment, detects plan deviations |
| Clinical Report | Generates a downloadable PDF clinical behaviour report from a user's insight history |
Every AI feature is context-aware: once a user completes their profile, all recommendations automatically account for allergies, dietary preferences, biometrics, and nutritional goals.
The repo follows a bones / skin metaphor:
healthium/
├── bones/ # Backend
│ └── app/
│ ├── main.py
│ ├── database.py
│ ├── models.py
│ ├── schemas.py
│ ├── helpers/
│ │ ├── chat_gpt.py
│ │ ├── fat_secret.py
│ │ └── user_context.py
│ └── router/
│ ├── auth.py
│ ├── nutrichat.py
│ ├── healthier_ref.py
│ ├── substituir_ref.py
│ ├── photo_to_recipe.py
│ ├── best_ref.py
│ ├── compare_aliments.py
│ ├── places_near.py
│ └── insigths.py
└── skin/ # Frontend
└── src/
├── views/
├── components/
├── api/
├── stores/
└── router/
- FastAPI — async REST API
- SQLModel + SQLite — ORM and local database
- OpenAI Python SDK — GPT-4o (vision) and GPT-4o-mini
- passlib + bcrypt — password hashing
- fpdf — PDF generation for clinical reports
- httpx — async HTTP client (FatSecret, Google Places, Nominatim)
- uv — fast Python package manager
- Vue 3 + TypeScript + Vite
- Pinia — state management
- Vue Router v5 — client-side routing with auth guards
- TanStack Query — async data fetching and caching
- Tailwind CSS v4 — utility-first styling
- shadcn-vue / reka-ui — accessible UI components
- Vue Leaflet — interactive map for NutriMap
- vee-validate + Zod — form validation
- Python 3.12+
- Node.js 18+ (or Bun)
- API keys (see Environment Variables)
cd bones
# Install dependencies with uv
pip install uv
uv sync
# Create a .env file (see Environment Variables section)
cp .env.example .env # or create manually
# Start the development server
uv run uvicorn app.main:app --reload --port 8000The API will be available at http://localhost:8000.
Interactive docs: http://localhost:8000/docs
cd skin
# Install dependencies
npm install
# or: bun install
# Start the development server
npm run dev
# or: bun devThe app will be available at http://localhost:5173.
Create a .env file inside the bones/ directory:
# OpenAI — Required for all AI features
OPEN_AI_KEYS=sk-...
# FatSecret — Required for food database search (/product endpoint)
# Get credentials at https://platform.fatsecret.com/
FAT_SECRET_CLIENT_ID=your_client_id
FAT_SECRET_KEY=your_client_secret
# Google Places API — Required for NutriMap (/places/nearby endpoint)
# Falls back to mock data (Braga) if not provided
GOOGLE_API_KEY=your_google_api_key
# Session middleware secret — any random secure string
RANDOM_KEY_MIDDLEWARE=your_random_secret_stringNote: The app works without
GOOGLE_API_KEY- it will return a mock healthy restaurant in Braga as a fallback. All AI features require a validOPEN_AI_KEYS.
- The backend currently uses SQLite for simplicity. The
pyproject.tomlalso includesasyncpgandpsycopg2-binaryfor a future migration to PostgreSQL. - CORS is configured to allow all origins (
*) — restrict this in production. - The session middleware secret is hardcoded as a fallback in
main.py— always setRANDOM_KEY_MIDDLEWAREin your.envfor real deployments. - The AI prompts are written in European Portuguese — all model responses come back in PT-PT.
This project was built as a hackathon submission. All rights reserved.