Transparent by default
How the FoodScore works
FoodScore is a single 0–100 number computed deterministically from per-100g nutrient data. The algorithm is public and reproducible. No editorial bump, no lobby influence, no secret sauce.
Reference framework
USDA DGA 2020-2025
Daily Value system
FDA 2016 rule
Process level
NOVA classification
1. Inputs
Every food in our database is normalised to per 100g. We source data primarily from USDA FoodData Central (Foundation and SR Legacy for generic foods, Branded for packaged products) and cross- reference against FDA-mandated labels. The algorithm reads these fields:
- Macronutrients: calories, total fat, saturated fat, trans fat, fiber, protein, added sugar
- Minerals: sodium, potassium, calcium, iron, magnesium, phosphorus, zinc
- Vitamins: A, C, D, E, K, B12, folate, riboflavin
- Fatty acids: omega-3 (ALA + EPA + DHA)
- NOVA class (1–4) from ingredient list
2. Base score
Every food starts at 50. From there we add bonuses for positive nutritional contributions and subtract penalties for shortfalls. The final score is clamped to 0–100.
3. Bonuses
| Criterion | Rule | Cap |
|---|---|---|
| Fiber | +1.5 per gram above 1g/100g | +12 |
| Protein | +1 per gram above 4g/100g | +10 |
| Micronutrients ≥ 10% DV | +2 per qualifying nutrient | +12 |
| Omega-3 ≥ 0.5g | +5 flat | +5 |
| Healthy fat profile (NOVA 1-2 only) | Total fat ≥ 8g and saturated fat < 35% of total fat | +10 |
| Whole food | NOVA 1: +10 / NOVA 2: +8 | +10 |
Total bonuses are capped at +35. This ensures that a heavily fortified ultra-processed breakfast cereal cannot score higher than a whole food that naturally delivers similar micronutrients.
4. Penalties
| Criterion | Rule | Cap |
|---|---|---|
| Added sugar | -1.5 per gram above 2g/100g | -25 |
| Saturated fat | -2 per gram above 3g/100g | -15 |
| Sodium | -1 per 150mg above 200mg/100g | -12 |
| Trans fat present | -20 flat | — |
| Ultra-processed (NOVA 4) | -10 flat | — |
| Processed (NOVA 3) | -5 flat | — |
| Empty calories | -15 if protein + fiber < 2g AND added sugar > 5g | — |
| Concentrated ultra-processed fat | -3 if NOVA 4 AND total fat ≥ 15g AND saturated fat ≥ 3g | — |
5. Verdict bands
| Score | Verdict |
|---|---|
| 90–100 | Excellent |
| 75–89 | Very good |
| 60–74 | Good |
| 45–59 | Decent |
| 30–44 | Poor |
| 0–29 | Avoid |
6. What FoodScore is not
FoodScore is a quality indicator for a given 100g of food, not a prescription. It does not account for portion size, allergies, individual medical needs, or dietary patterns. A high-scoring food eaten in excess is still too much. A low-scoring food eaten occasionally in a balanced diet is not a crisis.
Unlike EWG Food Scores, we do not use the outdated 2004 UK Ofcom traffic-light methodology. Unlike some commercial apps, we are not funded by any food brand or certification body.
7. Changelog and governance
When calibration changes, we publish the diff. All formula constants are documented in the public src/lib/foodscore.ts source file. Quarterly data refreshes pull the latest USDA FDC dataset.
See the about page for editorial principles, and the contact page to report a data issue.