Menutee
Live site: menutee.app
Overview
Menutee is a mobile + web product that solves a real, daily problem for people
with dietary restrictions: "I'm out, I'm hungry, where can I actually eat?"
Instead of forcing users to read every menu line by line and guess what fits
their diet, Menutee scores each dish on a restaurant's menu against the user's
personal dietary profile (diabetes, low-carb, low-FODMAP, gluten-free,
vegetarian, etc.) and shows a clear % match so they can pick a meal
in seconds.
The product was born from a personal need — the founder is a Type 1 diabetic — and is being built as a serious data product, not a directory. Every restaurant is geo-located from OpenStreetMap, every menu is OCR'd or scraped, every dish is matched to a known recipe with macronutrient data, and every score is computed against the user's diet on the backend.
The catalogue currently covers two cities in two countries:
- Bucharest, Romania
- ~1,300 restaurants with full cuisine-level type-matching live across map, list, and detail screens, and a Romanian dish catalogue built up over the Phase 1 pilot.
- Rimini, Italy
- Italian-cuisine catalogue with 105+ dish families, 56 CREA-grade recipes (sourced from the Italian Council for Agricultural Research's nutrition tables), 862+ Italian-language ingredient aliases, and a growing per-restaurant menu library covering Romagna traditional cuisine, pizzas, seafood, and piadinerie.
Both cities are live in production, and the per-cuisine catalogue architecture is designed to scale to new cities and regions without code changes.
Core features
- Diet-fit scoring engine flagship
-
Every menu item is scored against the user's diet profile on the backend (never
duplicated in the mobile app). The user-facing
% matchis purely a diet-fit metric — confidence in identifying the dish is handled internally and never blended into the visible score. This separation keeps the product honest: a 90% match means "this dish genuinely fits your diet 90%," not "we're 90% sure what this dish is." - Vision-LLM menu ingestion pipeline
- A multi-stage backend pipeline ingests restaurant menus from PDFs, images, and websites: OCR and structuring via Google Gemini and DeepSeek, per-page diagnostics so one bad page doesn't kill an import, an admin draft + approval workflow before any menu goes live, a PDF trimming helper for menus with decorative cover or divider pages, and a bulk import CLI that runs against the live production container via AWS SSM with no rebuild required.
- Dish matcher with multi-cuisine recipe database
- Items are matched to a curated dish_families catalogue. Each family has recipes with full ingredient breakdowns and macronutrient data. Romanian dishes are a hand-curated catalogue built during the Bucharest pilot; Italian dishes draw on 56 CREA-grade recipes from the Italian Council for Agricultural Research, 21 per-pizza families (Diavola, Capricciosa, Marinara, Quattro Formaggi, Calzone, …), Romagna secondi, and Cappelletti/Strozzapreti pasta families. Multi-language aliases (Italian, Romanian, English) feed a confidence-weighted matcher that picks the right recipe variant mechanically.
- Two-tier restaurant scoring (L1 + L2)
- L1 cuisine match is derived from OSM/Overture tags and Google Places categories. L2 keyword scoring scrapes restaurant websites for menu-relevant keywords and scores type-fit per cuisine, live across all three card surfaces (discover sheet, map picker, detail screen).
- Map-first discovery UX
-
The Flutter app uses two distinct data endpoints — a server-side supercluster
/mapendpoint for marker rendering and a/nearbyendpoint for the list sheet — to keep map performance smooth at city scale. Tiles use a custom Voyager-Mediterranean style generated from a Python pipeline, with a colour palette tuned for a warm Mediterranean restaurant vibe rather than the generic OSM blue/grey. - Real-time location with battery awareness
- Geolocator cadence and accuracy adapt to user state (idle vs. browsing vs. background) to balance map freshness against battery drain on the user's phone.
- Multi-source restaurant data ingestion
- Restaurant coordinates and metadata are pulled from multiple authoritative sources: OpenStreetMap via Overpass API (city-scale bulk imports), Overture Maps for richer cuisine tagging (Italian L1 enrichment uses bbox-scoped runs to focus on one city at a time), Kaggle CREA datasets for Italian nutrition and dish families (a 4-step proven seed playbook: stage → probe → seed → verify), and Google Places for high-precision geo (6+ decimal coordinates — restaurant pins must be accurate to the building, not the street).
Tech stack
- Mobile
- Flutter (Dart), shipped on Google Play Internal Testing; Apple Developer org registration in progress.
- Backend
- Node.js + Fastify 4 + TypeScript, better-sqlite3 with FTS5 full-text search, WebSocket-ready.
- Hosting
- AWS — EC2 (Docker, zero-downtime container rotation via SSM), S3 + CloudFront for the web and admin apps, Cognito for auth, Route 53 for DNS.
- CI/CD
- GitHub Actions auto-deploys backend, web, and admin on push to
main. - AI
- Google Gemini (vision + structuring), DeepSeek (structuring), Claude Code for development workflow.
- Data sources
- OpenStreetMap (Overpass), Overture Maps, Kaggle CREA Italian nutrition database, Google Places.
- Admin tooling
- Custom React/TypeScript admin app at admin.menutee.app for menu review and approval.
- Observability
- Prometheus metrics, structured logs.
What makes it interesting
- Solo-built, production-grade
- The entire stack — Flutter mobile app, Node/Fastify backend, React admin UI, marketing site, CI/CD, AWS infrastructure — is built and operated by one developer with AI-assisted workflows.
- Domain-deep, not generic
- Rather than "another restaurant app," Menutee owns the harder problem of structured dish identity and per-diet scoring, with real per-cuisine catalogues behind it.
- Already multi-country
- Live in two countries — Bucharest (Romania) and Rimini (Italy) — with a per-cuisine catalogue architecture that scales to new cuisines and regions without code changes. The Italian catalogue was bootstrapped from public CREA nutrition data in a single push, validating the playbook for future cuisines.
Status
In closed beta — live in Bucharest (Romania) and Rimini (Italy), shipped on Google Play Internal Testing with Apple Developer org registration in progress.