Our math
The score you can check
Every food score on the internet asks for your trust. This page is built so ours doesn't need it: the whole formula is below — every input, every constant, the worked example with all its intermediate numbers, and the parts we're not sure of. If you find a food that scores wrong, that's not an embarrassment. It's how the formula gets better, in public.
Formula v3.0 · revised 6 times in public · last change 2026-09-17
The whole idea in one sentence
A food fills you up for its calories when it's rich in protein, fiber or water — and nothing in it is engineered to keep you eating past full.
That is the entire method, and the word doing the most work in it is or. There are three routes to a good score — water, protein, fiber — and a food needs to win on one of them. Cucumber wins on water alone, whey protein on protein alone, psyllium on fiber alone, and all three reach the top. Two channels pull a score back down, sugar and savoury convergence, plus a third for alcohol, and a food only has to trip one of those too. The result is one number from 0 to 100 — satiety per calorie — which measures exactly one thing and is not a health score, a virtue score, or a verdict.
Whose formula this is
Ours is not the model. The model is Ted Naiman's satiety-per-calorie model, v14-S, and Sately runs it unchanged as formula v3.0, with constants frozen from his published workbench on 13 September 2026. Nothing on this site improves it, tunes it for a food, or averages it with anything else — when a number here disagrees with his calculator, this site is wrong and gets fixed.
The live model is at h4v4.com — Ted's own workbench, where the constants can be moved and every food moves with them. Ours are frozen: a score has to mean the same thing on Tuesday as it did on Monday, so this site pins a dated set and publishes it below. The one thing we add is Rule 0, and we say so where it appears.
Wording of the attribution to be confirmed with Ted.
Watch a real food get scored
The fastest way to understand a formula is to watch it run. Below are four real foods from our database. For each one, the numbers printed on its label flow through the actual formula — in your browser, right now, using the same code that scores everything on this site — and land on the chip at the end.
Off the label, per 100 g
61 kcal · 10.3 g protein · 0.4 g fat · 3.6 g carbs · 3.3 g sugar · 0 g fiber · 36 mg sodium
Inside the formula the calories are recomputed from the macros — 59 kcal — because fiber is worth 2 kcal a gram, not 4. The label's own figure is used for one thing only: the under-5-kcal rule.
Three routes up — winning on one is enough
The shares are taken over 92 kcal, not 59: every share in the formula adds a reference energy of 33.3909 kcal to the denominator, which is what keeps a food with almost no calories from dividing by nothing.
Two channels down, plus alcohol
Read onto the scale, then clipped
Z = 18.2179 + (106.5 − 18.2179) × 0.8301 = 91.50
score = 91.50 − 0.0037 × (91.50 − (-7.5)) = 91.14
Both anchors sit outside 0–100 on purpose — the floor at 18.2179 is where a food with no open route lands, and the ends of the visible scale have to be reachable, which is why Oreos sit exactly at 0 and water at 100.
exceptionally filling
Computed in your browser just now, from the numbers above — compare it with the live page for nonfat greek yogurt.
Three things worth noticing. The three route bars do not add up to anything — switch to potato chips and watch every route sit near zero, then switch to the yogurt and see it carried by two of them at once. The channels are usually empty: most food trips nothing, which is why an empty bar is not an accusation. And the penalty is not a judgment about “junk” — it fires on measurable patterns, printed on the label, that are rare in nature and standard in engineered food.
Three routes up, two channels down
Each curve below is not an illustration — it is sampled at render time from the same two functions that score the database, R and Q, with real foods pinned where they actually sit. Every threshold in the captions is read out of CONSTANTS. If the formula changed and nobody updated this page, the page would update itself.
The three routes are combined by soft-OR: B = 1 − (1−W)(1−P)(1−V). Read that as “any one of these is enough” — which is the single most important thing to understand about this score, and the biggest difference from the formula it replaced, where the three were averaged and a food had to be good at all of them.
1 · Protein — the first of three routes
The strongest and longest-acting fullness lever. Your body defends a protein target: dilute protein and people eat more of everything until they reach it, whether fat or carbohydrate does the diluting. The curve saturates because the evidence does — in the controlled test, dropping protein from 15% to 10% of calories pushed intake up 12%, while raising it to 25% changed nothing. The route is half open at 43% of calories, and a food that wins here does not need to win anywhere else.
2 · Water — the second route
How many calories hide in each bite. Stomach volume is a real fullness signal, and water and air are how you eat a satisfying weight of food for few calories. This is the best-replicated lever in the whole literature: pooled across 38 trials, serving less energy-dense food made people eat about 223 kcal a day less while eating the same weight of food. v14-S reads this as water: the share of 100 g that is neither macronutrient nor salt, ramped by R at a fixed sharpness of 0.15. The credit is then switched off as the food gets dense anyway — half gone by about 78 kcal per 100 g, which is why a dry biscuit earns nothing here even though most of what is left in it is not fat.
3 · Fiber — the third route
Real, and smaller than its reputation: fiber slows eating, slows the stomach, and adds staying power — but pooled across 62 trials, viscous fiber on its own moved body weight by about a third of a kilo. So the fiber route opens late: half open only at 95 g per 1000 kcal, a level almost nothing but legumes, bran and psyllium reaches. It is a full route rather than a capped bonus — psyllium husk reaches the top of the scale on fiber alone — but almost nothing on a supermarket shelf gets there. Ordinary fiber earns its keep by carrying water and bulk, which the water route already rewards.
4 · The two channels down — sugar and savoury
The three routes describe what a food is. These describe what a food is for. In the landmark inpatient trial, people offered ultra-processed menus matched for calories, macros, sugar, sodium and fiber still ate about 500 kcal a day more, unprompted — something beyond the nutrient totals drives intake. The finding that the combination is what matters, rather than any single nutrient, comes from work classifying foods by specific pairings. v14-S prices it as two continuous channels instead of a list of pairs: sugar, and savoury convergence — plus a third for alcohol. They are combined by soft-OR like the routes, so a food only needs to trip one, and the further it trips it the further it is dragged below what its nutrients earned.
The sugar channel needs both of its doors open — sugar by weight and sugar as a share of calories — and then the food's own protein and fiber buy it back out again. That last part, “matrix protection”, is what keeps fruit off the candy shelf: a strawberry and a gummy sweet can carry similar sugar per calorie and only one of them arrives wrapped in anything.
The savoury channel needs a convergence — fat with available carbohydrate, with salt and sugar as intensifiers — and then a gate on energy density decides whether the convergence matters at all.
The penalty channels
- sugar
- Sugar by weight and as a share of calories — discounted by the protein and fiber it arrives with.
- savoury
- Fat, starch and salt converging in one food, and only once it is energy-dense enough to overeat.
- alcohol
- Alcohol as a share of calories: calories with almost no satiety.
Nothing here is a cliff — every leg eases on, so two foods a gram apart are never a tier apart. One gate protects light foods: the savoury channel is half gated at 297 kcal per 100 g and barely exists below it. You cannot passively overeat cucumber, however salty.
What v3.0 dropped, and what survived
Switching to v14-S removed five mechanisms the previous formula had. Each one changed what some food's number means, so each one is named here rather than quietly deleted. If a score you remember has moved, this list is the most likely reason.
- The liquid discount is gone. We compensate poorly for calories we drink: the same food in drinkable form pushed daily intake up 12–19%. The old formula priced that as a flat cut on every drink. v14-S has no drink term at all — a drink is scored on its water, protein, fiber and sugar like anything else, which already puts soda near the bottom and milk in the middle. Whether that is enough is an open question we are testing against the database.
- The extra sugary-drink term is gone too. A sugared, protein-poor drink used to take a second cut on top of the first. Now it takes none: what pulls a cola down is the sugar channel, the same one that acts on a biscuit.
- Sweetener parity is gone. The old formula scored a diet soda as if its sweetness were sugar. That was always the thinnest judgment in it, and v14-S does not make it: non-nutritive sweetness is still recorded per food and is read by nothing. The data stays; the term is gone until there is one worth defending.
- The protein floor is gone. The old penalty multiplied a score down and could bury a genuine protein food, so a floor caught it. v14-S does not multiply: the penalty drags a food toward a fixed anchor below zero, so a protein-rich food keeps its footing without a special case.
- The five hyper-palatability clusters are gone. Fat-with-salt, fat-with-sugar and the rest were five named patterns, each with its own multiplier. v14-S has two continuous channels instead, and no list of pairs anywhere — which is why nothing on this site says “this food trips the fat-and-salt cluster” any more. It says sugar, or savoury.
Two things survived. Alcohol still carries its own penalty — a beer before lunch increased what people ate, dose-dependently, and those calories were added on top rather than compensated for — half strength at 20% of calories from alcohol. And Rule 0, which is ours and not Ted's: foods under 10 kcal per 100 g get a dash, not a score. A virtually calorie-free food can't cost you anything, and pretending to rank water against tea would be precision theater.
Don't trust us — try it
The sliders run the real formula, and the six numbers underneath are the ones the formula actually computes — three routes, three channels. Start from a real food and change one thing: give white bread the protein of chicken and watch the protein route open; take the sugar out of cola and watch the sugar channel close while the water route stays exactly where it was.
Invent a food — or start from a real one and change it. The score updates from the real formula, the same code that scores every food on this site.
exceptionally filling
Routes up — one is enough
Combined by soft-OR: 89%
Channels down
Combined by soft-OR: 0%
The constants are read-only here on purpose: they are frozen values, and the site has to score every food with the same ones. To move a constant and watch every food move with it, use Ted Naiman's own live workbench at h4v4.com.
The exact equations, every constant
Everything above, stated precisely enough to rebuild our entire database from a nutrition label and a spreadsheet. All inputs are per 100 g (or 100 ml) as eaten.
Two shapes do all the work. R(x, a) is an S-curve that is half open at a; Q(x, m) is a saturating ramp that is half open at m. Every term below is one of those two, and nothing in the formula has a step in it — which is why no two foods a gram apart are ever a tier apart.
Energy and shares. Calories are recomputed from the macros (4 protein / 9 fat / 4 available carb / 2 fiber / 7 alcohol) rather than taken off the label, and a reference energy is added so a zero-calorie food is defined:
K = 4·protein + 9·fat + 4·(carb − fiber) + 2·fiber + 7·alcohol
Kr = K + 33.3909
p = 4·protein / Kr · · · f = 9·fat / Kr · · · c = 4·(carb − fiber) / Kr
s = 4·sugar / Kr · · · a = 7·alcohol / Kr · · · v = 1000·fiber / Kr
e = K / 100 · · · n = sodium / (25·100)
w = 1 − (protein + fat + carb + alcohol + 2.5·sodium/1000) / 100
Three positive routes, combined by soft-OR. A food needs to win on only one:
W = R(w, 0.15) · (1 − Q(e, 0.7776))
P = R(p, 0.4275)
V = Q(v, 94.60)
B = 1 − (1 − W)·(1 − P)·(1 − V)
The sugar channel needs both doors — sugar by weight and sugar by calories — and is then bought back out by the food's own protein and fiber:
hS = 0.7982 · R(sugar/100, 0.0306) · R(s, 0.0311)
· (1 − R(p, 0.0708)) · (1 − Q(v, 16))
The savoury channel is a convergence signal X, gated by energy density. I is the strict fat×carb overlap and U their union; q mixes a little union into the intersection so a one-sided food is not excused entirely. Salt drives one door and sugar the other — either one counts:
DF = R(f, 0.5412) · · · DC = R(c, 0.4279)
I = DF·DC · · · U = 1 − (1−DF)·(1−DC)
T = I + 0.1141·(U − I)
DN = R(n, 0.1625) · · · DSg = R(s, 0.16)
X = 1 − (1 − DN·T)·(1 − DSg·I)
G = R(e/9, 0.3298)
hN = G · Q(X, 0.1967)
Alcohol is its own channel, and all three are combined by the same soft-OR as the routes:
hA = R(a, 0.2)
H = 1 − (1 − hS)·(1 − hN)·(1 − hA)
The score is B read onto a latent scale that runs past both ends of 0–100, dragged down by H, then clipped:
Z = 18.2179 + (106.5 − 18.2179) · B
score = clip(Z − H · (Z − (-7.5)), 0, 100)
One more quantity is reported but does not enter the score: J, the matrix protection — how far the food's own protein and fiber, soft-OR'd together, attenuate the sugar channel. It is a diagnostic, and it is the number to look at when a fruit and a sweet carry the same sugar and score nothing alike.
And Rule 0, ours rather than the formula's: under 10 kcal per 100 g we print a dash.
▸ All 20 constants — what each one is measured in, and what it doesValues rendered from the live constants file, so this table cannot drift from the code that scores the database. Frozen from h4v4.com on 13 September 2026.
| Name | Value | Unit | Part | What it does |
|---|---|---|---|---|
| K0 | 33.3909 | kcal per 100 g | reference | Reference energy added to the calorie denominator, so a food with no calories at all is still defined. |
| waterEnergyMid | 0.7776125184394392 | kcal per g | water route | Energy density at which the water route is half switched off: past this, being watery stops helping. |
| proteinCalMid | 0.4274943872788564 | share of calories | protein route | Protein as a share of calories at which the protein route is half open. |
| fiberCalMid | 94.59610662000452 | g per 1000 kcal | fiber route | Fiber per 1000 kcal at which the fiber route is half open. |
| fatCalMid | 0.5412104416980106 | share of calories | savoury channel | Fat as a share of calories at which the fat leg of the savoury channel is half on. |
| carbCalMid | 0.4278804750724663 | share of calories | savoury channel | Starch and sugar as a share of calories at which the carbohydrate leg is half on. |
| sodiumMidFrac | 0.16252102066368213 | fraction of 25 mg per g | savoury channel | Sodium at which the salt leg of the savoury channel is half on. |
| sugarConvMid | 0.16 | share of calories | savoury channel | Sugar as a share of calories at the savoury channel's second door — sugar converging with fat, as in a doughnut, rather than salt. |
| densityGateMid | 2.9682620423807515 | kcal per g | savoury gate | Energy density at which the savoury gate is half open. Below it the channel barely exists: you cannot passively overeat cucumber, however salty. |
| convMid | 0.19670590246573127 | 0–1 signal | savoury channel | Convergence signal at which the savoury channel reaches half strength. |
| q | 0.11409669003595321 | 0–1 mix | savoury channel | How much of the convergence counts as union rather than strict overlap — a small allowance for one-sided cases. |
| sugarMassMid | 0.03057504403463175 | g per g of food | sugar channel | Sugar by weight at which the sugar channel's first door is half open. |
| sugarCalMid | 0.03114169209194445 | share of calories | sugar channel | Sugar as a share of calories at which the second door is half open. Both doors have to open. |
| matrixProtMid | 0.07080286430825813 | share of calories | matrix protection | Protein share that half-protects a food from the sugar channel: milk is not candy. |
| matrixFiberM | 16 | g per 1000 kcal | matrix protection | Fiber per 1000 kcal that half-protects a food from the sugar channel: fruit is not candy. |
| wSugar | 0.7982318548229641 | 0–1 weight | sugar channel | The most the sugar channel can ever weigh. |
| alcoholMid | 0.2 | share of calories | alcohol channel | Alcohol as a share of calories at which the alcohol channel reaches half strength. |
| emptyFloorE | 18.2179 | latent points | scale anchor | Where a food that opens none of the three routes lands. |
| lowerAnchorL | -7.5 | latent points | scale anchor | What a fully penalised food is dragged toward. Below zero on purpose, so the bottom of the visible scale is reachable. |
| upperAnchorU | 106.5 | latent points | scale anchor | Where a food with every route open lands. Above 100 on purpose, so the top of the visible scale is reachable. |
Two constants are worth knowing about even if you never open that table. wAlcohol is absent from the frozen set, which means the alcohol channel runs at full weight rather than the 0.85 on Ted's equation sheet. And the two anchors are the sheet's pulled in — L at -7.5 rather than -33.2079, U at 106.5 rather than 109.8128 — which compresses the top of the scale. Both differences are real and both are the live workbench's, not ours; the second set is kept in the code as CONSTANTS_SHEET so the gap can be measured rather than argued about.
One food, every intermediate number
The equations above, run on a real label, with nothing hidden between the input and the answer. This is Ted's own worked example — plain nonfat Greek yogurt — and every figure in the table was computed by the scorer as this page rendered.
Per 100 g · 59.2 kcal · 10.3 g protein · 0.4 g fat · 3.6 g carb (3.2 g sugar) · 0 g fiber · 36 mg sodium
| K | 59.2000 | energy from the macros, kcal per 100 g |
| W | 0.6325 | water route, 0–1 |
| P | 0.5355 | protein route, 0–1 |
| V | 0.0000 | fiber route, 0–1 |
| B | 0.8293 | the three routes, soft-OR'd |
| hS | 0.0036 | sugar channel |
| J | 0.9910 | matrix protection (diagnostic) |
| X | 0.0001 | savoury convergence signal |
| G | 0.0201 | energy-density gate on the savoury channel |
| hN | 0.0000 | savoury channel, after the gate |
| hA | 0.0000 | alcohol channel |
| H | 0.0036 | the three channels, soft-OR'd |
| Z | 91.4298 | B read onto the latent scale |
Score 91.1 — Ted's workbench gives 91.1 for the same numbers. Read the table as the sentence the score makes: two routes half open, carried to 83% by the soft-OR, and not one channel out of three doing anything at all. The same yogurt on the equation-sheet constants scores 93.7, which is the whole reason this page says which set is frozen and on what date.
Where the science ends and our judgment begins
An honest formula has to say which of its parts are established and which are bets. Here is the line, drawn as precisely as we can draw it.
The components: well established
That protein increases satiety and defends its own target, that lower energy density cuts intake, that fiber helps modestly, and that ultra-processed, hyper-palatable food drives eating past fullness even when the nutrients are matched — each of these rests on randomized trials or pooled analyses of them, and each is a route or a channel in the formula. One well-established finding is not in the formula any more: that drunk calories are compensated poorly. v14-S has no drink term, and the section above says so plainly rather than letting a citation imply otherwise. The evidence tier of every source is shown in the citations, in plain language.
The weights: our stated bets
No clinical trial tells you the protein route should be half open at exactly 43% of calories, or where the lower anchor sits. Those twenty numbers are calibrated, not derived — against the feeding literature, against each other, and against thousands of foods checked by eye. Three bets deserve naming. The first is protein's weight: it is set above what two-hour satiety tests justify, because its appetite effect plays out over days, not the window a lab test measures. The second is the soft-OR itself — the claim that one route is enough, so that a food which is only watery and a food which is only high in protein deserve the same score. It is defensible and it is a choice, and it is the reason whey isolate and cucumber both reach 100. The third is the size of the penalty: the evidence that engineered combinations drive intake is strong, the evidence for where exactly to price each channel is a classification study rather than a feeding trial. If new evidence moves any of these, the changelog below is where you'll see it move.
The sanity check
The famous satiety experiment — Holt 1995, the source of nearly every “most filling foods” list — tested 38 foods in groups of eleven to thirteen people for two hours, and has never been replicated at scale. We deliberately did not fit our formula to it. We use it the other way: as a check that our scores point the same direction where it is strongest. Boiled potatoes near the top, croissants near the bottom — on that, the 1995 data and our math agree.
What the score ignores, on purpose
The score measures fullness per calorie. It does not measure, and does not try to measure:
- Vitamins, minerals, or fat quality. Salmon's omega-3s are a reason to eat salmon. They are not a satiety fact, so they are not in the number.
- Protein quality. Per calorie, broccoli carries about as much protein as an egg; the egg's is more usable. The score sees the quantity only.
- Price, taste, convenience, culture, ethics. All real, all yours to weigh, all outside a satiety number.
- Your biology. Appetite varies between people more than any food average suggests. The score describes the food, not you — a food you'll actually eat beats one that scores four points higher and stays in the fridge.
A single number that claimed to measure everything would measure nothing. This one does one job, and tells you which job.
Every change, dated
Every score in the database is stored with the formula version that produced it and can be recomputed. When the method improves, that's public history — not a silent rewrite. Current: v3.0.
v3.02026-09-17
Ted Naiman's satiety-per-calorie v14-S, run unchanged; constants frozen from h4v4.com on 13 Sep 2026. Rule 0 kept (dash under 10 kcal per 100 g). Incomplete labels unscored. Liquid, sugary-drink, sweetener and protein-floor terms of v2.x retired.
v2.72026-08-20
v2.7 (18 Aug 2026, the foothill): the hedonic ramps were exactly zero AT the Fazzino classification lines, so a food the literature would call hyperpalatable at precisely 20/20 fat/sugar carried zero craving intensity, and foods just under a line sat in a dead zone — 70–85% dark chocolate (16% of energy as sugar beside 64% fat) showed craving 0%, indistinguishable from unsweetened baking cacao (Andreas, 18 Aug). The thresholds are distributional conventions, not biology — the same argument that turned the v2.4 cliffs into the v2.5 ramps — so membership now fades in below each line instead of vanishing at it: a foothill ramps 0 → 0.10 across [half the line, the line], and the main ramp continues 0.10 → 1 from the line to the engineered level, smooth at every joint (PARAMS.hFoot, PARAMS.sFoot). Applied uniformly to every cluster and to the sugary-drink ramp — no per-food knobs. The cacao spectrum now ramps 100/60/9/0% craving across 45–59/60–69/70–85/unsweetened instead of 100/55/0/0. Every mover moves down; the accepted collateral is dried spices and dry pantry powders (thyme, paprika, oat bran: −4 to −5, the per-100 g artifact grazing the fat+starch foothill) and near-line engineered sweet-fat products like protein bars (Quest −6), which is the direction v2.6 already argued for. Nothing else changed.
v2.62026-08-13
v2.6 (11 Aug 2026, the calorie half): the core weights were 0.62 protein and 0.38 energy density, which reads backwards against the evidence the previous version leans on. Bolhuis (J Nutr 2016) measured the fat/energy-density manipulation raising ad libitum intake about 60%, where isolated salt raised it 11%; the salt half of that study already sets the fat+salt weight here. A score that means satiety per calorie should not let protein outrun the calorie half: at 0.62/0.38, tripling energy density from 100 to 317 kcal cost 14 points while going from 20% to 44% of energy as protein gained 15, which is how a 317 kcal protein bar reached the seventies. Both weights are now 0.50. Denser foods fall and lighter ones rise; boiled potato now outranks salmon, which inverts a v2.2c ordering and matches Holt 1995, whose isoenergetic servings — satiety per calorie, measured directly — put boiled potato top of all 38 foods at 323% against fish at 225%. Nothing else changed: the hedonic clusters, the fibre bonus and every other term are v2.5 untouched.
v2.52026-08-06
v2.5 (6 Aug 2026, hedonic rebalance): the hyper-palatability term no longer has a cliff. Membership was 0 below a threshold and jumped to 0.6 on crossing, so 20 mg of sodium cost salted ground beef 29 points; it now eases in smoothly from the line to the level typical of clearly engineered product. Fat+salt is down-weighted to 0.35: Fazzino's own longitudinal follow-up (Appetite 2021) found fat+sodium predicted neither weight nor body-fat change while carb+sodium did, and Bolhuis (J Nutr 2016) found isolated salt raises ad libitum intake about 11% independent of fat, with no fat-by-salt interaction. A new fat+starch cluster (weight 0.9) does the work fat+salt was wrongly credited with — it is the combination that barely exists outside a factory, and it catches fried and extruded snacks without touching meat, cheese, eggs, nuts or dairy (Hoch, Sci Rep 2015; DiFeliceantonio, Cell Metab 2018). The fiber bonus is now gated by that same signature, so fried starch stops banking credit for fiber that survives in name only; no whole high-fiber food loses a point.
v2.42026-07-29
v2.4 (29 Jul 2026, sweetener parity): non-nutritive sweetness now counts exactly as the sugar it replaces — sweetness-equivalent grams (curated per food, else estimated from the label) are added to sugar and calories before the percent, then run through the same thresholds and ramps as real sugar. The v2.1 binary flag (jumpS) is gone: a teaspoon of stevia no longer flags a whole dish harder than the sugar it displaced (Andreas's parity directive). Affects the fat+sweet cluster, the pure-sugar cluster, and the sugary-drink term.
v2.32026-07-28
v2.3 (6 Jul 2026, from the 322-food eyeball): (1) protein floor ramps in over P% 10–15 instead of a hard 15% threshold; (2) liquid modifier aL=0.85 on all drinks (drunk calories satiate less than chewed); (3) empty-calorie floor fE=7 — the bottom band requires hedonic drive, so pure non-hedonic fats (oils) sit just above engineered junk.
v2.2c2026-07-05
v2.2c: protein weight 0.62 (timescale argument), pure-sugar cluster, sugary-drink term, protein floor, alcohol + sweetener terms, Rule 0.
Who makes this, and who pays for it
No one can pay for a score.
Every food and every branded product goes through the same formula you just read. There is no mechanism by which a brand can pay for a better number, pay to remove a worse one, or opt out — the inputs are their own nutrition labels.
We sell no supplements, no shakes, no ads, and no placement, and we have no diet camp to defend. When Sately charges for anything, it will charge the people it serves — you — never the makers of the food it scores.
The site is built in the open by Dr. Andreas Eenfeldt, a Swedish family physician who previously founded the world's largest low-carb resource. The formula is Dr. Ted Naiman's v14-S, run unchanged, on public data (USDA and nutrition labels) — published in full above so that it can be checked rather than believed. About Sately →
Found a food that scores wrong? Good — that's a contribution, not a gotcha. Check its inputs on its page, and if the formula (not the data) is what's off, the fix will show up in the changelog above, dated, like every fix before it.