MenuChecker
A daily restaurant-menu digest for Myanmar restaurants near Rangsit University, delivered over Line — built because the students who follow these restaurants were checking several Facebook pages and Line groups separately every morning just to see what was on offer.
PythonFlaskwaitressGoogle Gemini APILine Messaging APIPlaywrightAPSchedulerpytest
- Two ingestion paths into one extraction pipeline: a Playwright scraper for restaurants posting on Facebook, and a Line webhook for restaurants that post directly in a Line group.
- Uses the Gemini API (text and vision) to read dish names and prices from Burmese-language posts or photographed menu boards, with model fallback restricted to genuinely transient failures.
- A Line Flex-message ordering flow — tap a restaurant's card, pick items and quantities by DM, get a summary to send the restaurant — backed by an atomic on-disk menu store.
- Hardened through a self-run production-readiness review: fixed 15 findings (race conditions, unhandled exceptions reaching the webhook, duplicate message delivery), moved off the Flask dev server to waitress, and covered every fix with a 76-test pytest suite.
- Scheduled for 08:00 Thailand time so menus land before first classes.