BiteCheck

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.

A pancake, egg and bacon breakfast broken into three dishes with portion controls, and its nutrition shown as ranges, such as 467 to 631 kcal.
Each range is the table value ±15%. A small value can round to the same number at both ends, like this fibre row's 2–2 g.

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.

The rules, as the app applies them
RulePointsReason the app shows
ProteinUp to +20, in proportion, full at 25 gGood protein, only when the protein range starts at 10 g or more
FibreUp to +15, in proportion, full at 8 gHigh fibre, only when the fibre range starts at 5 g or more
Energy over 600 kcal0 to −15, rising to −15 at 1,000 kcalVery energy-dense portion
Deep-fried−15 (in place of the fried penalty)Deep-fried preparation
Fried−8Fried preparation
High in sugar−18High in sugar
Refined carbs−8Refined 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+8Whole grain
Steamed or boiled+5Steamed or boiled — light preparation
Grilled+4Grilled, 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.

Packaged snack verdict: 47 out of 100, grade D, high in fat, with per-serving label values and the note that the data comes from Open Food Facts.
A crisps label, one 30 g serving: 47, grade D, from the values Open Food Facts holds.

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.

The dish picker opened to replace Hamburger, listing likely matches such as Cheeseburger, category chips and a search box.
A cheeseburger read as Hamburger: the right dish leads the likely matches.

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.

Examples from the app's scoring code (typical portions from its table; run November 4, 2026)
MealScore and gradeReasons
Spaghetti bolognese, 1 plate78 BGood protein, High fibre, Refined carbs; 411–557 kcal
Spaghetti bolognese, 2 plates68 BThe same, plus Very energy-dense portion; 823–1113 kcal
Taco, 1 piece / 2 pieces72 B / 84 AGood protein
Samosa, 1 piece / 4 pieces49 D / 56 CDeep-fried preparation; four also show Good protein, High fibre and Very energy-dense portion
Greek salad, 1 bowl / if the model says fried66 B / 58 CBalanced meal overall / Fried preparation
Cola label, one 330 ml serving55 CBalanced meal overall
Apple, default portion63 CBalanced 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.

Food photos and their licences
PhotoAuthorLicenceSeen in
Al pastor tacos with salsa verde and limeT.TsengCC BY 2.0Camera and History screenshots, social card
Spaghetti bolognese with peasHaJunkiyada (photo by Liat Portal)CC BY-SA 4.0Verdict and History screenshots
Ramen with chashu, bean sprouts and greensLuis Carlos DiazCC BY 4.0History screenshot
Greek salad (horiatiki) with fetaScudsvladCC BY-SA 4.0History screenshot
Rajma chawalShreya151994CC BY-SA 4.0History screenshot, social card
Dolsot bibimbap (Korean rice bowl)Sous ChefCC BY 2.0History screenshot, social card
Pancakes, bacon and fried eggsWikiTryHardDieHardCC BY-SA 3.0The example history behind the screenshots
Burger and friesKurtkaiserCC0The example history behind the screenshots
Idli with sambar and coconut chutneySutapa PalCC BY-SA 4.0The example history behind the screenshots
Masala dosa with chutney and sambarMarajozkeeCC BY-SA 4.0The example history behind the screenshots

See the rules at work on your next meal.

Get it on Google Play