Plain-language guide · no code required
PROCESSING SCORE

How processed is this food, really?

Every product we scan gets a 0–100 processing score. The higher the number, the closer the food is to its whole, natural form. The lower it is, the more it's been industrially processed. This page explains exactly how that number is decided, why we built our own system instead of borrowing one, and where it's still rough around the edges.

The 0–100 scale, in five bands

A product never just gets a number — it lands in one of five plain-language tiers.

Whole
85–100
Unprocessed or barely touched
Clean
65–84
A few recognizable additives
Moderate
40–64
Noticeably processed
Processed
15–39
Heavily industrial
Ultra
0–14
Ultra-processed

How a product gets its score

1
We read the ingredient list

We parse the label the way a careful human would — for example "Milk Chocolate (Sugar, Cocoa Butter), Peanuts" counts as 2 ingredients, not 4, because the things in brackets are sub-ingredients. A very long list nudges the score down on its own, because more ingredients usually means more processing.

2
We look for "markers" — additives we have evidence about

We maintain a library of 876 known additives (artificial colors, preservatives, emulsifiers, sweeteners, and so on). Crucially, not all additives are treated equally — each is weighted by how concerning the science says it is:

● Red — strongest evidence of harm (e.g. artificial colors, sodium nitrite, titanium dioxide)
● Orange — industrial additives with emerging evidence (e.g. HFCS, aspartame, carrageenan)
● Yellow — signs of processing, little direct health evidence (e.g. citric acid, natural flavor)

A red marker hurts the score roughly twice as much as a yellow one. So one genuinely concerning ingredient (like high-fructose corn syrup) drags a score down further than five harmless processing aids combined — which is the whole point.

3
We add up the concern and convert it to a 0–100 score

The weighted markers are totalled, then run through a curve that turns "total concern" into a friendly 0–100 number. A clean product with no markers scores 100. The curve drops fastest in the middle, so the difference between a Moderate and a Processed product is sharp and meaningful — not a gentle slope.

4
A safety net for the obvious cases

Some products have a short, "clean-looking" ingredient list but are clearly junk — candy, soda. If we find no markers but the product is in a category like that, we cap the score (candy can't beat 55, canned goods can't beat 75) so a gummy bear can't pose as a whole food. Fresh foods, oils, and plain dairy have no cap.

Show the actual math — for anyone who wants the real mechanics ▼ expand

This is the algorithm itself — no hand-waving. Five steps turn an ingredient list into a 0–100 number.

1 · Each marker gets an "effective weight"

A marker's base weight (1–5, how concerning on its own) is multiplied by its color tier. If it appears after "contains 2% or less of…", the base is halved first (it's a trace amount).

effective_weight = base_weight × tier_multiplier
    red = ×2.0      orange = ×1.2      yellow = ×1.0
2 · Add them into one total

This single number is "how much concerning stuff is in here," with bad ingredients counted heavily. Fermented foods (yogurt, sauerkraut) get a ×0.6 discount — that processing is traditional, not industrial.

total_weight = sum of every marker's effective_weight
               × 0.6  if the product is fermented
3 · Small penalty for very long lists

Nothing for 8 ingredients or fewer; each one beyond that shaves 0.3 off the final score.

ingredient_penalty = max(0, (ingredient_count − 8) × 0.3)
4 · Convert total weight → 0–100 with a sigmoid (the key move)

An S-curve centered at weight = 12, which is where it drops fastest — so the Moderate→Processed boundary is sharp. Weight 0 gives 100; by weight ~25 you're in single digits.

score = 100 / (1 + e^(0.2 × (total_weight − 12)))   # normalized so 0 → 100
score = score − ingredient_penalty
score = clamp(0, 100, round(score))
5 · Safety net + tier

If zero markers matched but the category is junk, cap the score (candy/soda → 55, canned/sauces → 75, fresh/oils/dairy uncapped). Then map to a band: 85+ Whole · 65–84 Clean · 40–64 Moderate · 15–39 Processed · <15 Ultra.

Worked example — Coca-Cola (real output: 18, Processed)
MarkerTierBase× multEffective
Caramel ColorRed4×2.08.0
HFCSOrange5×1.26.0
Phosphoric AcidOrange4×1.24.8
Natural FlavorsOrange1×1.21.2
total_weight = 8.0 + 6.0 + 4.8 + 1.2 = 20.0
6 ingredients → no length penalty
score = 100 / (1 + e^(0.2 × (20 − 12)))  =  16.8
      × 1.087 normalization              =  18.3   →  18   →  Processed

In short: weight up the bad ingredients, add them, run through one S-curve, nudge for list length, cap obvious junk. There's also a secondary sub-score (steeper curve, k=0.35) used only to break ties so two "Ultra" products can still rank against each other — it doesn't change the headline number. Source of truth: nova_classifier.py.

Why we built our own instead of using NOVA

NOVA is the academic standard for classifying food processing — and we respect it, our system is informed by it. But NOVA only has four buckets, and it's brutally blunt: a single industrial ingredient drops a food straight into the worst category.

Under strict NOVA

Whole-grain bread with enriched flour, yogurt with a thickener, and Coca-Cola all land in the same "ultra-processed" bucket. That's not useful to someone trying to make a better choice.

Under Baseline

Those three get meaningfully different scores, because we weight which additives are present by real evidence — bread isn't punished like soda. Five tiers and weighted markers give people room to choose better.

Every red/orange/yellow assignment traces back to published research — IARC classifications, large cohort studies (BMJ, Nature), and regulatory decisions (e.g. the EU's 2022 titanium-dioxide ban). It's evidence-led, not vibes.

Two questions hiding inside one score

There are really two different things people mean by "processed," and they don't always move together:

1. How far is the form from nature?

Whole potato → bag of cut potatoes → fries → chips. Each step changes the food's structure further from how you'd find it growing — even before a single additive is involved.

2. What's been added to it?

Seed oils, preservatives, colors, sweeteners. Two fries can sit at the same "form" level — clean (avocado oil + salt + potato) vs. industrial (seed oil + preservatives) — but be very different on this axis.

Today our score leans heavily on question 2 (the added ingredients). It reads structural transformation only indirectly. That's a deliberate, useful starting point — the ingredients are where most of the health signal and most of the differentiation live — but it's the main thing we're actively refining.

What we're still deciding (open, with the team)

These are live calibration questions — not settled. The principle steering them: the score should help someone make a better real-world choice, not pass an academic purity test.

  • How hard do we scrutinize? If we're too strict, almost everything but a potato, a steak, and a salad gets dinged — and everyone feels punished. The likely direction is to ease off pure "form" strictness and lean on the added ingredients.
  • What the user sees vs. our internal benchmark. Clean single-origin foods should land on the good end even if a purist would call them "minimally processed." A plain oatmeal should read as essentially unprocessed; an all-whole-food RX Bar should sit on the low-processing end even though it's been ground and packed.
  • How much should processing count toward a product's overall score? Right now processing is a standalone module — the overall product score is built from clinical-evidence and ingredient signals and doesn't yet blend in a processing weight. What share processing should get (alongside macros, micros, and ingredients) is an open call for Stefan + Edgar. (Confirm the exact food-score composition with Edgar.)
  • Four tiers or five? Cory's mental model is four (whole → minimal → moderate → ultra). We currently use five. Open question whether to collapse or keep the extra granularity.

A few real products

ProductScoreTierWhat drives it
Organic milk100WholeNo additives (added vitamins are never penalized)
Cheerios88WholeOnly mild markers (corn starch, canola oil)
Granola bar54ModerateBHT plus several oils and flavors stack up
Coca-Cola18ProcessedCaramel color (red) + HFCS + phosphoric acid
Doritos8UltraArtificial color (red) + MSG + multiple oils

Look up any ingredient

Every additive we track and its tier — search and see for yourself.

These are the markers behind the score. Effective impact = base weight × tier multiplier (red ×2.0, orange ×1.2, yellow ×1.0). Type an ingredient to check how it's rated.

IngredientTierImpactGroup

Note: many ingredients have several name variants on labels (e.g. "Acesulfame K" / "Ace-K") — all variants resolve to the same rating when we scan a product.

Where it's still rough (we'd rather you hear it from us)

No score is perfect. These are the known limitations of the processing score today — this list is a starting point and we expect it to grow as Cory and the team push on it.

  • It reads the list, not the amounts. A trace of an additive and a heavy dose can score the same. We partly handle this (ingredients listed under "contains 2% or less" count for half), but it's not true quantity awareness.
  • It's about processing, not total nutrition. A product can be minimally processed and still high in sugar, salt, or fat. This score answers "how industrial is it?" — not "is it healthy overall?" That's a different (future) algorithm.
  • The marker library is finite. We know 876 additives. A brand-new or obscure ingredient we haven't catalogued yet looks "clean" to us until we add it.
  • The category safety-net is blunt. Capping by category (candy, soda) depends on us correctly guessing the category, and the caps are round numbers we chose — defensible, but a judgment call.
  • The science is still moving. Where an additive sits (red vs orange) reflects today's best evidence. As studies land, markers get re-graded — Coca-Cola recently dropped from 31 to 18 when caramel color was promoted to red.

Questions, disagreements, or "this still feels like a black box"? → tell Stefan and this page gets better.