Work / AskCal / Wiki / Surfaces
setup
Surfacecanonicalverified 2026-09-27
SURFACE.MOBILE.ONBOARDING.SETUPSummary
Everything the target needs — the five numbers and the goal — on one screen.
Raw wireframe
- .context/designs/mobile/onboarding/setup.html
Why it is drawn this way
One screen, merged from two. This was body.html (five inputs) and then
goals.html (a goal preset). The split cost a screen and bought nothing: the
only decision on the second screen was which direction the number should move,
and every number it decided against came from the first. Splitting age, height,
weight and activity across steps was already a conversion tax with no benefit;
splitting the goal off from the numbers it applies to was the same mistake one
level up.
Worse, it leaked: Settings' "Daily calories" row opens this route, and
StepNav took a hardcoded step={2}, so a user changing their target months
later saw a progress bar and "2/4" inside Settings. With one screen there is
nothing to count and nothing to leak.
The numbers come before the goal, in reading order. Asking someone to pick a deficit before telling them what it comes off is a guess dressed as a decision. By the time the goal options are on screen the maintenance figure is known, so each preset can show the target it lands on rather than only a delta — a delta is legible only to someone who already knows the base.
Age, height and weight are three rows of one card, label left and value right, rather than three floating boxes in a grid that never lined up.
"0.45 kg a week" is not a typo for 0.5. 500 kcal a day is 3,500 a week against roughly 7,700 in a kilogram.
Protein is a floor derived from bodyweight, not a share of the calories, so a deficit never takes it below that floor. See setup.
"Set it myself" is drawn collapsed, and that is the drawn state. The old goals screen drew it open, with a rate slider, a By rate / By calories toggle and a live total — four ways to set one number, all on screen at once.
What was cut, and why none of it was information. Every line below was on one of the two screens this replaces:
| Cut | Why |
|---|---|
| "These go into the standard energy-expenditure formula." | The genre of the maths is not a fact the reader can use. |
| "Used only for the BMR equation, which is sex-specific." | Justifies a field rather than labelling it. |
| "Mifflin–St Jeor, good to about ±10%" | Naming the formula is a credibility flex. And ±10% was then stated a second time further down the same screen. |
| "1,748 at rest × 1.30 for how you move = 2,272" | Printed arithmetic nobody audits, which made a setup form read as a worked example. |
| "Be honest rather than aspirational — overstating this is the single most common reason a calorie target turns out to be wrong." | Three lines to say "pick the true one". |
×1.2 / ×1.3 / ×1.5 |
Internal coefficients on a consumer screen. |
| Two of three "you can change it later"s | Said three times in three wordings on one screen. It is said once now, next to the target. |
The activity subtitles stay. "Desk job, little walking" is what the option is — the content of the choice, not commentary on it.
The BMR floor notice still belongs here and still appears only when the goal
worked out under the resting rate. The app must never silently override a stated
goal; lib/targets.ts carries flooredAtBmr precisely so it can be said out
loud.
Related
Sources
- .context/designs/mobile/onboarding/setup.html
Every project of mine is written down like this.
Read the résumé