Plumb

Every balance and yoga app counts your seconds. Sixty seconds in tree pose held rock steady and sixty seconds held wobbling are, in every one of them, the same event with the same tick beside it. They are not the same event.

What it does differently

A hold has a width

During a hold, Plumb reads the direction of gravity fifty times a second and reports how far the device wandered from the hold’s own average — an angle, in degrees, with the band that measurement actually has. Two holds of identical length come back as 0.84° ± 0.03° and 3.97° ± 0.11°, and now they are two different things rather than two identical ticks.

Your left side against your right

This is the part no app in the category does. After three measured holds on each side, Plumb reports the difference with a band built from two separate sources, kept separate because they behave differently:

Holds per sideMeasurement errorDay-to-day spreadTotal bandVerdict
3±0.032°±0.227°±0.258°indistinguishable
6±0.022°±0.199°±0.221°one side weaker
12±0.016°±0.219°±0.234°one side weaker

The measurement half shrinks with the square root of how many holds you do. The day-to-day half does not shrink at all — and shrinking it would be the easiest way to make a difference look certain that is not. You are not the same every day, and that is information rather than noise to be averaged away.

When the total band crosses zero, the two sides are indistinguishable and Plumb says exactly that. For most people, most of the time, it is the true answer. An app that always finds an imbalance is not more useful; it is only less honest.

It knows when it cannot measure

An accelerometer has its own noise, and that noise looks exactly like sway. Plumb reads the noise floor out of your data rather than out of a settings screen: noise is fast and a body is slow, so the angle between consecutive samples gives it away. Because any real fast motion inflates that estimate, it is an upper bound — which means the subtraction is conservative and the reported sway is biased low. This app never says you swayed more than you did.

True swayReportedBandKind
0.00°at most 0.09°a ceiling
0.15°0.17°±0.030°a number
0.60°0.67°±0.020°a number
2.40°2.68°±0.053°a number

Note where the band is widest: not at the largest sway but at the smallest, where the measurement sits closest to the noise it was subtracted from. A measurement is reported as a number only when its band is narrower than itself; below that it becomes a ceiling, because a number whose band covers zero is not a number.

Drift, without a story attached

Swaying around a point and sliding away from it are different failures and deserve different advice, so Plumb fits the whole hold and reports whether you ended away from where you began. Its band comes from how much the slope varies between six blocks of the hold, not from a model of the noise — body sway is strongly autocorrelated, and ordinary least-squares inference called nearly every steady hold a collapse when it was tried.

It refuses to say why you moved. An unsigned distance from where you began grows for any one-way motion: falling out of a pose and settling into one look identical from here, and the information that would separate them is not in this measurement. An earlier version had a “recovering” state; a failing test showed it was reporting a direction it could not observe, and it was removed rather than tuned.

What it measures is the phone

Not your body. Hold it against your chest or slip it into a waistband and it follows your trunk; leave it on the mat and it will faithfully measure the mat. That sentence is on the screen before your first hold, because a measurement whose subject is unclear is not a measurement — and no other app in this category says what its sensor is actually attached to.

Eight poses, and only eight

Only held poses can be measured this way. In a flowing sequence the deviation from where you started is the movement, so there is nothing to measure; a longer list would only be a less truthful one.

Free. No in-app purchases, no subscription, no account. iPhone, iPad and Apple Watch. Six languages of interface.

What it will not do

The privacy lines are gates, not promises

Each claim above corresponds to a check that runs on every build and fails it if the claim stops being true: the source is scanned with comments stripped for URLSession, URLRequest, CFNetwork, NWConnection, CLLocationManager and StoreKit, and separately for HealthKit, HKHealthStore and HKWorkout. The measurement class is checked for any persistence call, and the stored record is checked for the absence of a raw-sample field — because a field that exists will eventually be filled. Every permission string that must be absent is checked for absence. A promise nobody measures is worse than no promise, because people rely on it.

How the numbers here were produced

Every figure on this page and in the App Store screenshots comes from the shipping core, run over holds built from a written rule — a first-order autocorrelated slow component standing in for body sway, an uncorrelated fast component standing in for sensor noise, and an optional linear drift — not from a design file. The core carries 51 tests, and a mutation gate breaks each of its 41 defences one at a time to check that a test actually goes red. Four of those defences escaped on the first run and the tests were sharpened until they did not; one guard turned out to be unreachable and was deleted rather than left in place looking measured.

norea.studio · Privacy · Support