How BiteCheck scores a meal
BiteCheck is an Android app by Sonicon Software. Photograph a meal, or scan a packaged food's barcode, and it gives a 0–100 wellness score, an A–E grade, one to four reasons and nutrition as ranges. A vision model names the dishes; the nutrition math and the score run on your phone from a table of 452 dishes. It is a general wellness indicator, not medical advice.
From photo to dishes
When you check a meal, the app makes a smaller copy of the photo (at most 1024 pixels on the long side and 300 KB) and sends it to BiteCheck's analysis service. A vision model returns up to six dishes, a portion for each, preparation tags such as fried or steamed, and a confidence level.
The service tries Cloudflare Workers AI first, then Groq, then OpenRouter. The app matches each dish to one of the 452 dishes in its table. A dish it can't match keeps the model's own name and is marked Approximate estimate. A photo with no food in it gets No food detected.
The copy is saved fresh from the image pixels, so it carries no location or other camera details. The photo is the only thing sent: no account, name or device identifier goes with it.
Portions and ranges
Each dish comes in a unit that fits it: piece, slice, roti, serving, small bowl (katori), bowl, plate, glass or cup. Change a portion in half steps and the numbers and score update. Calories, protein, carbs, fat and fibre show as ranges 15% either side of the table's value: a fixed band, not a measured error.
The model suggests each portion. If its wording doesn't match a unit the dish has, the app starts from one default portion. Counted items (pieces, slices, rotis) go up to 12; bowls, plates, glasses, cups and servings go up to 4.
The band is the same width for every dish, so it says nothing about how sure the app is. A misread dish or portion can be much further off.
How the score is built
BiteCheck's score is a fixed set of rules in the app, not a medical assessment. Every meal starts at 55; protein and fibre add up to 35 points; frying, sugar, refined carbs, high fat on a packaged label and portions over 600 kcal take points away; whole grain, steamed and grilled add a few. The reasons name the biggest effects.
| Rule | Points | Reason the app shows |
|---|---|---|
| Protein | Up to +20, in proportion, full at 25 g | Good protein, only when the protein range starts at 10 g or more |
| Fibre | Up to +15, in proportion, full at 8 g | High fibre, only when the fibre range starts at 5 g or more |
| Energy over 600 kcal | 0 to −15, rising to −15 at 1,000 kcal | Very energy-dense portion |
| Deep-fried | −15 (in place of the fried penalty) | Deep-fried preparation |
| Fried | −8 | Fried preparation |
| High in sugar | −18 | High in sugar |
| Refined carbs | −8 | Refined carbs (white flour or white rice) |
| Packaged label fat of 17.5 g or more per 100 g | −12 (packaged food only) | High in fat — fine now and then |
| Whole grain | +8 | Whole grain |
| Steamed or boiled | +5 | Steamed or boiled — light preparation |
| Grilled | +4 | Grilled, lean preparation |
The total is rounded and kept between 0 and 100. Grades: A from 80, B 65–79, C 50–64, D 35–49, E below 35. The app lists the largest effects first, up to four. When no rule gives a reason, it shows one chip, Balanced meal overall: that means nothing stood out, not that the meal was checked for balance.
The preparation tags come from two places: the dish table marks some dishes (a samosa is marked deep-fried), and the vision model adds tags from what it sees in the photo.
The verdict screen labels the number Health score. This site calls it a wellness score, because it is a general wellness indicator from these rules, not an assessment of anyone's health.
Packaged food by barcode
BiteCheck reads a barcode on your phone with Google's ML Kit scanner and fetches the product's nutrition panel from Open Food Facts. It scores the label values per serving with the same rules, flags sugar, refined carbs and fat from per-100 g thresholds, and says the data comes from Open Food Facts. A product the database lacks gets no verdict.
- High in sugar: 22.5 g or more sugar per 100 g.
- Refined carbs: less than 3 g fibre and at least 25 g carbs per 100 g.
- High in fat: 17.5 g or more fat per 100 g, which also costs 12 points.
A product with no serving size is scored per 100 g. You can change the number of servings, and a looked-up product opens again later without a connection.
When it gets a dish wrong
Tap Not quite right? on a photo verdict. You can swap a dish for another from the table, remove a dish, or add one the photo missed. The meal is rescored on your phone and its saved history row is rewritten. Nothing extra is sent. The confidence chip then reads Edited by you.
A swapped dish keeps your portion if the new dish uses the same unit, or both are counted items; otherwise it starts from the new dish's default. The picker lists likely matches first, then every dish by category, with a search box.
Inputs and limits
BiteCheck's result rests on what a vision model sees in one photo, a table of typical recipes and a short list of rules. Each step can be wrong in ways the score doesn't show. These are the known limits, with real output from the app's scoring code where a number helps.
Recognition can be wrong
A vision model names the dishes, and it can misread them: in a release check it read bhatura as puri, and in the store screenshot above it read a cheeseburger as Hamburger. Use Not quite right? to fix it. The confidence chip is the model's own estimate of its answer, not a measured hit rate.
At most six dishes per photo
The analysis describes one photo with six dishes at most, so a busier plate or thali is not fully covered.
Portions are guesses
The model suggests a portion. If its wording doesn't fit a unit the dish has, the app uses one default portion. You can change it in half steps, up to 12 pieces or 4 bowls or plates.
Preparation is read from the photo
Tags such as fried, steamed or high in sugar come partly from the model and can move the score a long way. A Greek salad scores 66 B, or 58 C if the model calls it fried; a plate of two pancakes, two fried eggs and a slice of bacon scores 62 C, or 44 D if the model adds high in sugar. A photo can't show the oil, ghee or sugar used.
Bigger portions can score higher
Protein and fibre add points by the gram, while the frying, sugar and refined-carb penalties are flat and the size penalty starts only above 600 kcal. One taco scores 72 B and two score 84 A. One samosa scores 49 D and four score 56 C, with Good protein and High fibre chips. One 30 g serving of a crisps label scores 47 D, four servings 57 C.
Unknown dishes use rough estimates
A dish with no match gets a generic profile from a keyword in its name, or a mid-range default, and is marked Approximate estimate. It can still grade A: an unmatched "mystery stew", one serving, scores 81 A.
Ranges are a fixed band
Each range is the table value for your portion, 15% either side. It is not a measured margin of error, and a small value can show the same number at both ends, such as 2–2 g.
The table describes typical recipes
Of the 452 dishes, 209 are Indian dishes with values derived from IFCT 2017 and adjusted for typical recipes (their fibre values are rough estimates), and 243 others each come from one USDA FoodData Central record. Home and regional versions vary.
Packaged food depends on Open Food Facts
The values are whatever the database records, which may be incomplete or out of date. A product it doesn't have, or one missing calories, protein, carbs or fat, gets no verdict. A missing fibre value counts as 0 g. A missing sugar or fibre value doesn't trigger the sugar or refined-carb flag. The fat penalty applies only to packaged products, not to photographed dishes.
Drinks are judged by food thresholds
The packaged sugar cut-off is 22.5 g per 100 g, set for food. A cola label with 10.6 g of sugar per 100 gets no sugar penalty: a 330 ml serving scores 55 C, Balanced meal overall.
The score covers a few things only
Energy, protein, fibre, and the preparation, sugar, refined-carb and packaged-fat rules. It ignores salt, additives, vitamins and minerals, allergens, and your own needs or conditions. A plain apple scores 63 C. Don't use it for allergies, a medical diet or decisions about a health condition; see the BiteCheck notice in our terms.
Checks need a connection
Photos taken offline wait on the phone, up to 20 (a 21st replaces the oldest), and are sent when you reconnect. In the release check on October 28, 2026, four photos took about 6 to 10 seconds each from upload to answer. The app waits up to 20 seconds for one.
Daily limits
The analysis service allows 30 photo checks per network per UTC day. The live service also caps the total across all users, currently at 300 a day, and that setting can change. Everyone on one Wi-Fi shares the 30. A capped check says to try again after midnight UTC.
Recognition depends on outside providers
The chain of AI providers behind the analysis service can change without an app update. If every provider fails, the check fails and you can try again.
| Meal | Score and grade | Reasons |
|---|---|---|
| Spaghetti bolognese, 1 plate | 78 B | Good protein, High fibre, Refined carbs; 411–557 kcal |
| Spaghetti bolognese, 2 plates | 68 B | The same, plus Very energy-dense portion; 823–1113 kcal |
| Taco, 1 piece / 2 pieces | 72 B / 84 A | Good protein |
| Samosa, 1 piece / 4 pieces | 49 D / 56 C | Deep-fried preparation; four also show Good protein, High fibre and Very energy-dense portion |
| Greek salad, 1 bowl / if the model says fried | 66 B / 58 C | Balanced meal overall / Fried preparation |
| Cola label, one 330 ml serving | 55 C | Balanced meal overall |
| Apple, default portion | 63 C | Balanced meal overall |
Data sources
Nutrition values come from USDA FoodData Central (public domain, CC0) for 243 dishes, and are derived from IFCT 2017 (Indian Food Composition Tables) for 209 Indian dishes, adjusted for typical home and restaurant recipes. They are approximations for typical recipes, not laboratory measurements.
Packaged-food data comes from Open Food Facts, a public database, under the Open Database License.
Photo credits
The food photos in the screenshots and the social card on this site are from Wikimedia Commons, used under the licences below. None is AI-generated. Crops and resizes of CC BY-SA photos are shared under the same licence.
| Photo | Author | Licence | Seen in |
|---|---|---|---|
| Al pastor tacos with salsa verde and lime | T.Tseng | CC BY 2.0 | Camera and History screenshots, social card |
| Spaghetti bolognese with peas | HaJunkiyada (photo by Liat Portal) | CC BY-SA 4.0 | Verdict and History screenshots |
| Ramen with chashu, bean sprouts and greens | Luis Carlos Diaz | CC BY 4.0 | History screenshot |
| Greek salad (horiatiki) with feta | Scudsvlad | CC BY-SA 4.0 | History screenshot |
| Rajma chawal | Shreya151994 | CC BY-SA 4.0 | History screenshot, social card |
| Dolsot bibimbap (Korean rice bowl) | Sous Chef | CC BY 2.0 | History screenshot, social card |
| Pancakes, bacon and fried eggs | WikiTryHardDieHard | CC BY-SA 3.0 | The example history behind the screenshots |
| Burger and fries | Kurtkaiser | CC0 | The example history behind the screenshots |
| Idli with sambar and coconut chutney | Sutapa Pal | CC BY-SA 4.0 | The example history behind the screenshots |
| Masala dosa with chutney and sambar | Marajozkee | CC BY-SA 4.0 | The example history behind the screenshots |
