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.
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.
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.
Scale placement, time of day, clothing state, even a draining battery. Same body, different number, every single day.
Sodium, carbohydrate stores, and gut content can shift the number by a kilogram or more without touching fat mass at all.
The device itself wanders over months of use. Nothing on the display ever tells you it's happening.
Every scale reading is the sum of these. The model's job is to separate them back out, with honest uncertainty attached to each.
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.
Daily updates stay cheap enough to run instantly. A slower cycle periodically corrects the assumptions the fast one is built on.
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.
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.
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.
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.
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 annotationBecause 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 |
A model is only as honest as its stated boundaries.
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.
Every symbol used above, in one place.
One person, one model, one working app. Here's the background behind the decisions above, and the fastest path to trying it yourself.
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.
Manual entry is a source of friction and a source of noise. Direct device integration removes both.
The model is live. Try it at truweightapp.netlify.app, or read the full mechanism in the whitepaper above.