← All updates
New turn

Your protein target just got smarter — here's the math behind it

Engineering update

Most nutrition apps set your protein target off your total bodyweight. That's a fine rule of thumb if you're already lean. It's a bad one if you're not — which describes a lot of people starting a bulk.

Here's the problem: 220 lbs of a lean guy and 220 lbs of a guy carrying more body fat don't have the same amount of muscle to feed. If we set both of their protein targets off the same "220 lbs × 2.2g/kg" math, one of them is getting an accurate number and the other is being told to eat protein his body doesn't need — grams (and grocery money) that would be better spent elsewhere.

So we rebuilt the calculation to use lean mass instead of total bodyweight, and we're walking through exactly how, because we think you should be able to see the work.

What changed

Your protein target is still driven by your Bulk or Cut style (Lean Bulk, Dirty Bulk, Standard Cut, Preserve-Muscle Cut — same per-kg multipliers as before). What changed is what those multipliers get applied to.

Before: protein = target_weight × per_kg_multiplier

Now, if you've set a current body-fat estimate: protein = (current_weight × (1 − body_fat%)) × per_kg_multiplier

That middle term — current_weight × (1 − body_fat%) — is your lean mass: everything that isn't fat. It's a better proxy for how much muscle your protein intake actually needs to support.

Two details worth calling out:

  • We switched from target weight to current weight for this specific calculation. The old formula leaned on your goal weight, which makes sense for a bodyweight-based target but doesn't make sense once you're estimating lean mass — your body-fat percentage describes your body today, not your goal body. So the lean-mass version is anchored to who you are right now.
  • If you haven't set a body-fat estimate, nothing changes for you. The old target-weight formula is still there as the fallback, byte-for-byte. No existing user's number moved when we shipped this. You opt in by setting a body-fat estimate; until you do, you get exactly what you got before.

How we get your body-fat estimate without a DEXA scan

We're not going to pretend a phone app can give you a lab-grade body-fat reading. So we didn't build one. Instead, we did two things and made sure you know the difference between them.

First, we compute a starting suggestion. Using your height, weight, age, and sex — all data you already gave us — we run the Deurenberg formula, a published, peer-reviewed BMI-based body-fat estimate:

BMI = weight_kg / height_m²
BF% ≈ 1.20 × BMI + 0.23 × age − 10.8 × (1 if male, 0 if female) − 5.4

This formula is well-studied and reasonable on average, but it has a known, specific blind spot: because it's built on BMI, it can't tell the difference between muscle and fat. A muscular, resistance-trained person will often get overestimated — sometimes by a meaningful margin — because BMI doesn't know that the extra weight on the scale is muscle, not fat.

That's a real problem for our audience specifically, since a lot of you are exactly the people this formula is worst at estimating. So:

Second, if you've told us you do resistance training, we shift the suggested estimate one tile leaner before showing it to you. It's a deliberate correction for the formula's known bias, not a precise adjustment — think of it as "we know this number runs high for lifters, so we nudge it back toward reality before you ever see it."

Third, and most importantly: it's a suggestion, not an answer. You'll see six tiles — Very Lean, Lean, Athletic, Average, Higher, Much Higher — with simple illustrations, no percentages shown on screen. One tile is pre-highlighted based on the math above, but you're never required to accept it. Tap a different one if it doesn't match what you see in the mirror, and your choice is what gets used. We log whether you kept the suggestion or picked your own, tagged internally as formula_suggested or self_selected — partly for our own understanding of how often the estimate lands, partly so we're never treating a guess as a measurement in our own data.

Why we built it this way instead of a photo scanner

We looked seriously at AI photo-based body-fat scanning — there's real, peer-reviewed research showing computer-vision models can get close to DEXA-level agreement across large populations. But that accuracy comes from models purpose-trained on paired photo/DEXA datasets, not from pointing a general-purpose AI vision model at a photo and asking it to guess. We didn't want to ship something that looked like precision without actually having it behind it. A tile picker that's honest about being a starting point beats a scanner that implies more confidence than the underlying tech has earned.

The engineering side, for anyone who wants it

  • New fields on your profile: current_body_fat_pct, does_resistance_training, and body_fat_source — all separate from any existing goal-weight or wearable-synced fields, so nothing got overloaded or repurposed.
  • The lean-mass branch and the legacy fallback both live in one function, with test coverage confirming the fallback path produces byte-identical output to the pre-existing formula when no body-fat estimate is set.
  • The tile-suggestion logic (nearest-tile matching, the resistance-training shift, and the clamp that stops the shift from pushing you past the leanest tile) is unit tested independently of the UI.
  • This shipped additively — no existing calculation path (calories, carbs, safe-rate pacing) was touched.

If you've already set your goal, jump into your profile and set your current body-fat tile — it's a five-second tap, and it's the difference between a protein number based on your goal weight and one based on the muscle you're actually carrying right now.

This has already shipped to our private beta — join the waitlist to get it the moment it lands on the App Store.