New · hardware integration
Now collaborating with Boldfit & Cult
Smart scale API access is in progress - device readings will feed straight into the model. See details ↓
Research based bodyweight modeling

Your scale isn't wrong.
It's just underdetermined.

One number can't tell fat loss apart from sodium, glycogen, gut content, and a scale that's drifted three grams since Tuesday. True Weight treats a weight log as a signal processing problem and not just as a diary entry.

OBSERVED vs RECOVERED · 60 DAYSt = 0
Raw scale reading
Recovered fat mass trend
Water + gut + bias contribution
§1 · Abstract

Daily bodyweight measurements are dominated by nuisance variance from hydration state, gastrointestinal content, and device level bias, to the point that naive interpretation of the raw signal routinely misleads the person producing it. This work frames a single scale reading as the sum of five latent physiological components rather than one ground truth quantity, and recovers each component using a hierarchical state space model. A mechanistic energy balance process governs fat and lean mass; mean reverting processes govern water and gastrointestinal content; a slow random walk absorbs per device bias. Online estimation runs through Rao-Blackwellized particle filtering, with static parameters recalibrated periodically via full posterior inference. We report results from a 90 day single subject trial, including correct attribution of a multi day sodium driven fluctuation, detection of an illness associated regime shift, and a statistically resolved plateau that raw data alone could not distinguish from ordinary noise.

state space modeling particle filtering hierarchical Bayes energy balance ODE regime switching Gaussian process regression

Three separate problems are usually treated as one

Most apps apply a single moving average and call it a trend. That collapses three physically distinct sources of variation into one line, which is precisely why the line keeps disagreeing with how you actually look and feel.

01

Measurement variance

Scale placement, time of day, clothing state, even a draining battery. Same body, different number, every single day.

02

Physiological variance

Sodium, carbohydrate stores, and gut content can shift the number by a kilogram or more without touching fat mass at all.

03

Silent drift

The device itself wanders over months of use. Nothing on the display ever tells you it's happening.

Five quantities live inside one visible number

Every scale reading is the sum of these. The model's job is to separate them back out, with honest uncertainty attached to each.

Ft
Fat mass
Governed by an energy balance differential equation, not a free floating average. It cannot move faster than physiology allows.
Lt
Lean mass
Tracked alongside fat mass, since energy imbalance is partitioned between the two based on current body composition.
Wt
Water deviation
Pulled back toward baseline over time. Sodium and carbohydrate intake shift where that baseline sits.
Gt
Gut & glycogen
Resolves faster than water retention, typically within one to three days of a change in intake.
Bt
Scale bias
Tracked per physical device, so switching between a home scale and a gym scale never resets your trend.
eq. 1 — observation model
$$y_t = F_t + L_t + W_t + G_t + B_t + \epsilon_t, \qquad \epsilon_t \sim \mathcal{N}(0,\ \sigma_t^2)$$
The scale reports a sum. Everything downstream exists to invert this sum back into its parts.
eq. 2 — energy balance dynamics
$$\frac{dF}{dt} = \frac{(1-p)\,(EI - EE)}{\rho_F}, \qquad \frac{dL}{dt} = \frac{p\,(EI - EE)}{\rho_L}$$
Fat and lean mass share the same energy imbalance, split by partition coefficient p, which itself shifts with current body fat percentage.
eq. 3 — expenditure and metabolic adaptation
$$EE_t = 370 + 21.6\,L_t + \text{activity}_t + \text{TEF}_t + A_t, \qquad A_t = A_{t-1} + \kappa\,(EI_t - EE_t)$$
Resting expenditure is driven directly by lean mass. The adaptation term A accumulates slowly under sustained deficit or surplus, rather than staying fixed.
eq. 4 — mean reverting water state
$$dW_t = \theta_W\big(\mu_W(c_t) - W_t\big)\,dt + \sigma_W\,dB_t$$
An Ornstein–Uhlenbeck process. ct is the day's covariate vector — sodium, carbohydrate, cycle phase — and μW maps it to a target retention level that Wt reverts toward at rate θW.
eq. 5 — scale bias drift
$$B_t = B_{t-1} + \eta_t, \qquad \eta_t \sim \mathcal{N}(0,\ \sigma_B^2)$$
Bias is a separate slow random walk per physical device, reconciled across devices rather than restarting the trend on every switch.

Three views of the same estimation problem

Regime detection separates a real event from ordinary noise. The particle cloud shows the filter searching before it converges. The forecast fan is honest about how much less certain the future is than the past.

Regime detection
Bayesian online changepoint + HMM
sodium travel illness
Particle convergence
Rao-Blackwellized particle filter
Forecast uncertainty
Compositional Gaussian process, 30 day horizon
eq. 6 — regime transition
$$P(z_t = j \mid z_{t-1} = i) = A_{ij}$$
A hidden Markov chain over regimes (normal, sodium, travel, illness) governs which dynamics apply to Wt and Gt on a given day.
eq. 7 — particle weight update
$$w_t^{(i)} \propto w_{t-1}^{(i)}\; p\big(y_t \mid x_t^{(i)}, z_t^{(i)}\big)$$
Each particle carries a joint hypothesis about the continuous state and the current regime; weight grows with how well it predicted today's reading.
eq. 8 — resampling trigger
$$N_{\text{eff}} = \frac{1}{\sum_i \big(w_t^{(i)}\big)^2}, \qquad \text{resample if } N_{\text{eff}} < N/2$$
Prevents particle degeneracy — the failure mode where nearly all probability mass collapses onto a single particle.
eq. 9 — compositional GP kernel
$$k_{\text{total}} = k_{\text{trend}} + k_{\text{weekly}} + k_{\text{changepoint}} + k_{\text{noise}}$$
Long run trend, weekly periodicity, structural breaks, and residual noise are modeled as separate additive, individually interpretable kernels.

A fast cycle and a slow cycle

Daily updates stay cheap enough to run instantly. A slower cycle periodically corrects the assumptions the fast one is built on.

Daily
Every log entry
  1. Log weight and context: sodium, sleep, alcohol, which scale, cycle phase if relevant
  2. Propagate the physiological model forward by one step
  3. Check whether today's reading suggests a genuine regime change, not just noise
  4. Update the estimate for fat, lean, water, gut, and bias, each with a confidence range
  5. Re-estimate how noisy the measurement process has been lately
Periodic
Weekly or monthly
  1. Refit every static parameter from the complete history, not just recent days
  2. Feed the corrected parameters back into the daily cycle as new priors
  3. Rebuild the long-run trend from independently modeled components
  4. Test whether a plateau is statistically real or still within normal variance
  5. Re-evaluate any open interventions against a counterfactual baseline

Subject 001 — a 90 day trial

Male · 24 · baseline 84.2kg
home + gym scale, dual device
90 consecutive daily logs
day 14 · sodium event day 36 · illness regime day 58 · plateau not yet confirmed day 77 · plateau confirmed day 85 · creatine loading
Day 12–16

A wedding, a sodium load, and a number that didn't mean what it looked like

A weekend of celebration food pushed the raw reading up 1.8kg in three days. The regime layer flagged an above baseline sodium signature immediately. The fat mass posterior moved by 0.06kg, everything else was assigned to the water state, which reverted on schedule by day 17.

Day 34–40

A flu, a changepoint, and a filter that knew to widen instead of trust itself

Reduced appetite during a short illness dropped the raw number sharply. Bayesian online changepoint detection flagged a regime transition rather than a genuine fat loss surge, and the illness regime's wider process noise let the model hold its fat mass estimate steady until intake normalized.

Day 55–61

The flattening that looked like a plateau and wasn't, yet

The visible trend line flattened enough to worry the subject. The slope's 90 percent credible interval still excluded zero by a narrow margin, so the model reported the plateau as not yet statistically confirmed rather than validating or dismissing the concern outright.

Day 75–78

Confirmation, on schedule with a reported drop in adherence

By day 77 the slope credible interval spanned zero. The plateau was confirmed formally, coinciding with the subject's own log of reduced training consistency over the prior two weeks, an agreement between the model's statistics and lived context rather than a coincidence.

Day 85

Isolating an intervention from a trend already in motion

Creatine supplementation began on day 85. A counterfactual trajectory, projected forward from the pre intervention state, attributed 0.4kg of the subsequent rise to intracellular water rather than fat mass, a distinction a raw scale reading has no way of making on its own.

The raw number rose for five straight days. The fat mass posterior did not move.

Subject 001, day 16 annotation

Performance on synthetic ground truth

Because true fat mass is never directly observable in a live subject, the filter is validated against 500 simulated 90 day trajectories where the ground truth is known by construction, with synthetic noise, regime events, and covariate effects injected at realistic magnitudes.

Metric Raw signal Filtered estimate
RMSE vs true fat mass (kg) 1.14 0.21
90% credible interval coverage 88.4%
Regime changepoint detection latency (days) 1.8
False positive changepoints per 90 days 0.6
Plateau detection precision / recall 0.91 / 0.86
Simulated benchmark, N = 500 synthetic trajectories, 90 day horizon. Not derived from human trial data.

What this does not solve

A model is only as honest as its stated boundaries.

Cold start
Hierarchical priors default to population averages until enough personal data accumulates to shrink toward individual sensitivity, typically several weeks.
Fixed constants
Energy density constants for fat and lean tissue (ρF, ρL) are treated as fixed, when in reality tissue composition varies slightly by individual.
Logging discipline
Adaptive noise estimation compensates for inconsistent protocol, but cannot fully substitute for a genuinely consistent weigh in routine.
Unmodeled hormones
Only menstrual cycle phase is treated as a covariate. Other hormonal fluctuations affecting water retention are absorbed into general process noise rather than modeled explicitly.
Compute cost
Full posterior recalibration via Hamiltonian Monte Carlo is too costly to run more than weekly on typical consumer hardware.

Grounded in established estimation theory

None of these components are novel in isolation. The contribution is combining them into one coherent pipeline aimed at a single body, rather than a population.

  1. Energy balance dynamics — fat and lean mass are propagated using differential equations in the tradition of NIH body weight regulation research, rather than treated as a free running average.
  2. Adaptive Kalman filtering — observation noise variance is re-estimated online from recent innovations, so inconsistent weigh-in conditions are penalized automatically rather than smoothed over.
  3. Markov switching state space models — regime dependent dynamics, methodologically descended from regime switching work in econometrics, separate a genuine physiological event from routine noise.
  4. Rao-Blackwellized particle filtering — discrete regime hypotheses are tracked with particles while continuous sub states update analytically within each hypothesis, avoiding the cost of a full particle filter over the entire state.
  5. Hierarchical Bayesian partial pooling — individual covariate sensitivities shrink toward population priors when personal data is sparse, and toward the individual's own history as it accumulates.
  6. Compositional Gaussian process regression — trend, weekly periodicity, and changepoints are modeled as separate additive kernel components, in the spirit of automatic structure discovery in time series research.
  7. Counterfactual structural time series — intervention effects are estimated against a projected baseline, in the spirit of causal impact analysis, rather than read off a before and after comparison.

Full symbol reference

Every symbol used above, in one place.

Ft
Fat mass at time t
Lt
Fat free (lean) mass at time t
Wt
Water retention deviation from baseline
Gt
Gastrointestinal content and glycogen bound weight
Bt
Per device scale bias
εt
Measurement noise, adaptive variance
EI, EE
Energy intake and total energy expenditure
p
Partition coefficient between fat and lean mass
ρF, ρL
Energy density of fat and lean tissue
At
Adaptive thermogenesis term
θW
Water state mean reversion speed
ct
Daily covariate vector (sodium, carbs, cycle phase, etc.)
zt
Discrete regime state (normal, sodium, travel, illness)
Aij
Regime transition probability matrix
wt(i)
Weight of particle i at time t
Neff
Effective sample size, triggers resampling
ktotal
Composite Gaussian process kernel
yt
Observed raw scale reading at time t

Who built this, and how to actually use it

One person, one model, one working app. Here's the background behind the decisions above, and the fastest path to trying it yourself.

AK
Field notes
Aswath Karthikeyan
builder, true weight
backgroundconsultancy, then engineering execution
prior venturefounded and scaled CrypVorex, a Web3 strategy consultancy, to 20+ clients across tokenomics, community coordination, and PR
specialtytrained corporate marketing teams on Reddit reputation strategy, sentiment audits, and founder AMAs

Operational depth is the unfair advantage. Advising startups and designing conversions taught me to write code with an intuition for what actually survives contact with users.

How to use it
Getting started with the live model
  1. Open the app at truweightapp.netlify.app and log today's raw scale reading
  2. Add whatever covariates you have on hand: sodium, carbs, sleep, alcohol, which scale you used
  3. Keep logging daily for at least 14 days, since early estimates lean on population priors until your own data accumulates
  4. Read the decomposed trend, not the raw number, especially in the first two unstable weeks
  5. Check back weekly for the recalibrated estimate once enough history has built up
Open the live app

Smart scale integration, in collaboration with Boldfit and Cult

Manual entry is a source of friction and a source of noise. Direct device integration removes both.

Boldfit
API access to Boldfit smart scale readings, feeding yt directly into the daily engine without manual logging.
Cult
Integration with Cult's weighing devices, extending the same per device bias tracking (Bt) already built into the model to a second hardware source.
Every device you weigh in on already gets its own bias state in the model. API integration just removes the step of typing the number in yourself, and reduces the timestamp and protocol noise that comes with manual entry.

The model is live. Try it at truweightapp.netlify.app, or read the full mechanism in the whitepaper above.

v0.5 · live app + device integrations + mechanism spec + validation