DEV Community

Aditya Bafna
Aditya Bafna

Posted on

MenuMaestro: A Local-First Menu Translator for Restaurant Owners — Built on Gemma 3

Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle Submission 💸

MenuMaestro: A Local-First Menu Translator for Restaurant Owners — Built on Gemma 3

Submission for the Hacktoberfest Open-Source AI Challenge: Week 2 — Side Hustle


What I Built

MenuMaestro is a fully local, privacy-first menu translation and cultural adaptation tool for small restaurant owners.

You drop in your dish names — or a photo of your handwritten menu — and get back:

  • Culturally adapted names in 12 languages (not word-for-word robot output)
  • Appetising descriptions that make sense to the target audience
  • Dietary flags — Vegan, Halal, Gluten-Free, and more — detected automatically
  • Cultural notes for dishes that commonly confuse foreign guests
  • A tagline for your restaurant in the target language

The whole thing runs on Gemma 3 via Ollama, on your laptop. Nothing leaves your machine.

GitHub: github.com/adibafna/menumaestro


The Problem

I have a local Indian restaurant near my college. The owner is brilliant at cooking. His menu is terrible at explaining itself to anyone who didn't grow up eating the food.

"Laal Maas" on a menu in a tourist area tells a first-time visitor nothing. Google Translate gives you "Red Meat." That's it. No context, no appetite, no allergy info. The owner was spending ₹2,000/month on a translation agency who gave him slightly better word-for-word output.

He needs:

  1. Something that explains why a dish is delicious — not just what it's called
  2. Dietary information (he gets asked about dairy, nuts, and halal constantly)
  3. Something that doesn't cost a subscription every time he updates his seasonal specials

MenuMaestro solves all three.


Demo

MenuMaestro UI — restaurant name, dish list, and translated output side-by-side at localhost:7860

Input

Restaurant: Shree Rajputana Dhaba
Cuisine: Rajasthani
Target language: English (Tourist-Friendly)

Dishes:
Laal Maas
Dum Aloo
Makki ki Roti
Sarson ka Saag
Churma
Lassi
Enter fullscreen mode Exit fullscreen mode

Output (Gemma 3, running locally)

✨ Suggested tagline: "Royal flavors of Rajasthan — slow-cooked, fire-kissed, unforgettable."


1. Laal Maas → Rajasthani Fire Lamb

A slow-braised lamb curry ignited with whole dried Mathania chillies — Rajasthan's answer to the world's most satisfying cold-night meal. The heat creeps up slowly; the depth lingers.

Dietary: Gluten-Free

💡 Despite the name meaning "red meat," this dish is defined not by the protein but by the intense Mathania chilli — a variety almost impossible to replicate outside the region.


2. Dum Aloo → Whole Baby Potatoes in Yoghurt Gravy

Petite potatoes simmered in a sealed pot with tangy yoghurt, warming whole spices, and a saffron finish — the dum (steam) technique creates a depth no stir-fry can match.

Dietary: Vegan Gluten-Free

💡 "Dum" literally means breath — the sealed-pot steaming technique is a Mughal-era method that transforms ordinary baby potatoes into something extraordinary.


3. Makki ki Roti → Rustic Maize Flatbread

Stone-ground yellow cornmeal pressed into thick flatbreads and cooked on an iron griddle — earthy, filling, and inseparable from Sarson ka Saag in Punjabi winter tradition.

Dietary: Vegan Gluten-Free


4. Churma → Rajasthani Festival Sweet

Coarsely ground wheat flour toasted in ghee, sweetened with raw jaggery and perfumed with cardamom — crumbly, rich, served at celebrations alongside dal baati.

Dietary: Vegetarian

💡 Churma is the sweet third of the iconic dal-baati-churma trio; ordering it alone tells the owner you're an adventurous tourist.


Architecture

┌──────────────┐   photo (optional)    ┌─────────────────────┐
│  Gradio UI   │──────────────────────▶│  Gemma 3 Vision     │
│  (browser)   │                       │  (OCR — reads menu  │
└──────┬───────┘                       │   photo locally)    │
       │ dish names                    └──────────┬──────────┘
       │◀──────────────────────────────────────────┘
       ▼
┌──────────────────────────────────────────────────────────┐
│  Gemma 3 Text  (Ollama — 100% local, no API key needed)  │
│  Structured JSON output: names · descriptions · flags   │
└──────────────────────────┬───────────────────────────────┘
                           │
                    Rendered Markdown
                    + Raw JSON export
Enter fullscreen mode Exit fullscreen mode

Stack:

  • Model: gemma3:4b via Ollama — open-weight, Apache 2.0
  • Framework: Gradio — open-source UI, runs in browser
  • Language: Python 3.10+
  • License: MIT

Why Open Innovation Matters Here

1. Cost makes the business model work

The restaurant owner I showed this to was paying ₹2,000/month (~\$24) for translation. MenuMaestro's running cost after setup: \$0/month. That's the difference between a tool a local business can actually afford and one they can't.

A cloud API at \$0.01 per dish × 200 dishes × 12 languages × monthly updates adds up fast. Gemma 3 on a laptop has zero marginal cost per run.

2. Seasonal menus stay private

Restaurants change their menus seasonally — sometimes daily. A chef's new signature dish is real intellectual property before it launches. Sending it to a cloud API before service opens is a genuine concern. Local inference removes that concern entirely.

3. The niche where general models genuinely underperform

I tested GPT-4o, Claude 3.5, and Gemma 3 on the same 10 Rajasthani dishes.

  • GPT-4o translated "Churma" as "Sweet crumbled bread" — technically correct, commercially useless
  • Claude 3.5 skipped cultural notes entirely on dishes it didn't recognise
  • Gemma 3 with the right system prompt produced richer descriptions for regional Indian dishes than either — likely because its instruction-tuning included more regional food writing in Hindi-adjacent contexts

The system prompt is the real product here. Because we own the model and the prompt, we iterate for specific cuisines without paying per token for every experiment.

4. Model swap is one line

Swap to gemma3:12b, mistral, or any future Ollama model by changing two constants in app.py. No contract, no migration cost, no API key rotation.


First User

I handed a laptop running MenuMaestro to the owner of a local Rajasthani dhaba near my college.

He sat with it for 20 minutes. He translated his 18-dish menu into English and French. He found two dishes he'd never gotten a good English description for in five years of running the restaurant.

Would he pay? He asked if he could pay per menu update — "like a subscription, maybe ₹300 a month." That's \$3.60/month. Given the \$0 running cost after setup, that's effectively pure margin for anyone who packages this as a service.

What did he ask for next?

  • Print-ready PDF output (his next printed menu goes to 1,000 tourists)
  • QR-code generation for table menus
  • A "formal dining" vs. "street food" tone toggle

All three are on the roadmap.


Running It

# Prerequisites: Python 3.10+, Ollama installed (https://ollama.com)
ollama pull gemma3:4b

git clone https://github.com/adibafna/menumaestro
cd menumaestro
py -m pip install -r requirements.txt
py app.py
# Open http://localhost:7860
Enter fullscreen mode Exit fullscreen mode

Sample menus in demo_menus/ — indian_sample.txt and thai_sample.txt — work out of the box.


Links


Built with Gemma 3 (open-weight, Google DeepMind) · Ollama (open-source inference runtime) · Gradio (open-source UI) · MIT License

Top comments (0)