
No green checkmark for allergens, ever
Photograph any foreign-language menu, say your dietary constraints out loud — get every dish translated, allergen-flagged with a deliberately fail-safe design, and pronounced, plus an honest "what I'd order for you."
Ask a chatbot to read a menu you can't decipher and tell you what's safe, and you're trusting it to translate correctly and never quietly clear an allergen it wasn't sure about. Menu Decoder is built around one asymmetric rule: a missed allergen is dangerous, a false warning is just a shrug — so the system is biased toward warning everywhere it can be. There is no code path anywhere in this app that renders a green checkmark for an allergen.
Vision extraction reads every dish in one call — unreadable lines are flagged, never silently dropped, with a completeness % shown.
A LoRA-tuned Qwen2.5-1.5B model tags cuisine + all 14 EU allergens + spice + vegetarian/vegan per dish — runs on a laptop, $0 marginal cost.
Cautious prompt rubric · unoverridable badge rendering · deterministic safe-list filter before the LLM ever picks.
Tap a dish to hear its name spoken in the menu's own language — unsupported locales hide the button rather than faking it.
Given a dish name (+ optional description), the model emits the full allergen/dietary JSON tagging — a generative structured-output task, not a single-label guess. Trained on 6,750 synthetic dish rows across 15 cuisines, split by dish family so a dish's 3 prompt variants never straddle train/test. The metric that matters is allergen recall on "contains" and the false-safe rate — reported per allergen, not averaged away.
| System | Allergen recall | False-safe rate | Cost |
|---|---|---|---|
| Base Qwen2.5-1.5B (bare prompt) | 0.0% | 100.0% | $0 |
| + LoRA fine-tune | 69.3% | 7.3% | $0 |
| Claude teacher (bare prompt, same as LoRA sees) | 0.0% | 100.0% | Max subscription |
| Claude teacher (schema-primed) | 79.2% | 1.7% | Max subscription |
claude -p call per menu for extraction — no metered API, no vision API key required. See the full writeup for the honest engineering story, including the real bugs found and fixed along the way.