The problem
If you have a food allergy, or you are avoiding something for medical or religious reasons, a supermarket is a reading exercise. The information is on the packet. It is in six-point type, on a curved surface, often in a language you are still learning, and the important word is buried in a list of forty.
Germany makes this sharper than most markets. Labelling is strict and detailed, which is good: the data is genuinely there. But “the data is there” and “a person standing in an aisle can use it” are not the same thing. People end up photographing packets to read later, or putting the item back to be safe.
Nuvia is the answer to a small, specific question: can I eat this? Asked at the shelf, answered in a couple of seconds.
What I’m building
A scanner, not a search box. You point the camera at the barcode. There is no product name to type and no spelling to get right, which matters when the name is in a language you do not read well.
A verdict first, the detail underneath. The result screen leads with a plain answer against the profile you set up: safe, not safe, or check this. The full ingredient breakdown sits below it for anyone who wants to read further. I chose that order deliberately. Leading with a table makes the user do the analysis again, which is the work they opened the app to avoid.
Profiles for real households. Most scanner apps assume one person with one restriction. A family usually has several, and they shop together. You can switch profile before you scan, and the same product gives a different answer.
Language handling as a first-class feature, not a translation layer. An ingredient list is a domain vocabulary, not ordinary prose: Molkenerzeugnis matters and a generic translation of it does not. The AI step is there to map label wording onto the restriction the user actually set, and to say plainly when it cannot.
Flutter and Supabase again. The same stack as Giftlo, for the same reason: one codebase across both platforms, and a backend I can change quickly while the product is still finding its shape.
The hard part
Knowing when to say “I don’t know”.
A food-safety app that is confidently wrong is worse than no app at all. Someone acts on the answer. The failure modes are all real: a barcode that is not in any database, a label the camera read badly, an ingredient that could be derived from milk or could not be, a “may contain” line that is a legal hedge rather than a fact.
The temptation with an AI feature is to smooth all of that over and always return something. I am building it the other way. The app is allowed to say it is not sure, and when it does, it says exactly which ingredient it could not resolve and why. An honest “check the packet for this one word” is a useful answer. A confident wrong one is a liability.
The result
Nuvia is in build, not launched, and I am not going to write a results section that pretends otherwise. It is on this site because the ship log tracks what I am working on as well as what is finished, and because an honest “building” entry is more informative than a page that only ever shows wins.
What is settled so far: the scan-to-verdict flow, the household profiles and the approach to uncertainty described above. What is not: the launch date, the pricing and how much of the label parsing can run without a network round trip.
The status chip on this page comes from the ship log. When it flips to LIVE, this section gets rewritten with what actually happened.
What I’d do differently
I started with the ingredient database and worked forward to the camera.
That was backwards. The database is the part I understood, so it was the part I felt productive doing. But the entire product lives or dies on whether a one-handed scan works, in bad supermarket lighting, holding a basket. I did not test that properly until the data layer was well established, and it has shaped more of the rebuild than anything else.
The lesson is the same one Giftlo taught me and I evidently needed twice: build the risky, unglamorous, user-facing thing first. The parts you already know how to do will still be there.