Under the Hood
The VIC cafeteria menu, but it actually remembers what you like. Built by someone who got tired of squinting at a PDF every Monday morning.
Getting Started
Create an account (takes 10 seconds), then head to the Menu page. You'll see every dish the VIC cafeteria is serving today.
Tap the stars on any dish to rate it 1-5. Four ratings is all the algorithm needs to start building your taste profile. Rate things you love and things you don't, both help.
Once you hit 4 ratings, the menu re-sorts itself: best dishes for you float to the top, and a "Top Picks" section appears. Keep rating to sharpen your profile over time.
FAQ
How accurate are the recommendations?
They get better with every rating. With 4+ ratings the algorithm has a solid baseline; with 10+ it's surprisingly good. It learns what you like and what you avoid.
When does the menu update?
Menus are scraped automatically when Eurest publishes them (usually Sunday/Monday for the upcoming week). The app always shows the current day's dishes.
What's the "Taste Radar" on my profile?
A visualization of your flavour preferences across dimensions like savory, sweet, spicy, fresh, rich, and crunchy. Derived from the dishes you've rated, it updates as you rate more.
Can I see the menu without signing in?
Yes! The public menu page shows today's dishes for everyone. You just need an account to get personalized rankings and to rate dishes.
Is my data shared?
No. Your ratings and taste profile are private to your account. Community ratings are aggregated anonymously.
The Pipeline
Weekly PDF menus pulled automatically from the Eurest WordPress media API.
Dishes, dates, stations, prices & dietary tags extracted via pdfplumber.
Three ML models: DeBERTa food NER, BART zero-shot (cuisine + sensory), sentence-transformer embeddings.
Dual-centroid scoring: cosine similarity to your taste profile, novelty bonus, repetition penalty.
FastAPI + Next.js + Clerk auth. Rate dishes 1-5 and recommendations improve over time.
Tech Stack
Frontend
- Next.js 16 + React 19
App Router, server components, TypeScript end-to-end.
- Tailwind CSS 4
Utility-first styling with a flat, shadow-free design language.
- Redux Toolkit + Recharts
State management and taste-profile visualizations.
Backend & ML
- FastAPI + SQLAlchemy
Async API with PostgreSQL. Clerk JWT auth.
- Three ML Models
DeBERTa food NER, BART-large zero-shot (cuisine + sensory), all-MiniLM-L6-v2 embeddings. All CPU, no GPU required.
- Docker Compose
Rootless containers, non-root users, separate dev/prod configs.
Why This Exists
Every week the VIC cafeteria in Building F publishes a PDF menu. By Thursday you've forgotten what was good on Monday. This started as a fun technical challenge, for the love of the game, but also because nobody wants to end up with something mid for lunch.
VICYZ scrapes the menu automatically, understands each dish through NLP, and learns your preferences from your ratings. The more you rate, the better it gets at telling you whether today's "Potato-Feta Cheese Gratin" is actually worth it.
This is a side project, not affiliated with Eurest or the IAEA. Their official positions on cafeteria recommendation systems remain, as far as we know, undefined. All opinions expressed by the algorithm are its own.