
The step app that refuses to flatter you
A native iOS app that turns your real walking into a real journey to the Moon, without inflating a single number.
TIMELINE
July 2026 (in progress)
ROLE
Product Design
Brand Identity
Product Direction
TOOLS
SwiftUI
Figma
Claude
Codex
HealthKit
Firebase
SwiftData
Just Me!
/
Problem
Every honest choice here makes the product feel worse on day one.
/
Research
The category had an empty seat, and it was the honest one.
Before committing to the idea I mapped the category against four groups: utility pedometers, social walking platforms, virtual-route products, and step-powered games. The useful finding was not a gap in features, it was a gap in posture. The utilities are accurate and joyless. The games and the social platforms are engaging and loose with what the numbers mean.
That left truthful wonder as an open position, real numbers presented in a way that still produces awe, and local-first privacy alongside it. I took that position deliberately, and it is the reason the rest of the decisions in this case study were even close calls rather than obvious ones.
The same analysis flagged the risk that comes with it. If the numbers stay honest, the first genuinely big milestone is months away, so the product has a retention hole exactly where a dishonest competitor would put a dopamine hit. The answer had to be density rather than inflation: 459 real stages along the route, each one an actual distance equivalence, so there is always a nearby true thing to reach instead of a distant fake one. That single trade decided the shape of the whole app.

/
Process
You can import ten years of steps. It will never win you the race.

/
Process
The all-time bar used to fill relative to its own total, which is the standard move and which means nothing. On a second on-device review I realised it was reading as real progress toward the Moon when it was not, and the light track underneath compounded it by looking like a filled white bar on the dark glass. The screen was telling two lies at once, and neither was intentional.
I rescaled it to the real thing. The bar now spans the full 512,533,334 steps, so what you actually see is a long empty rail with a sliver at the left end, green for imported history and blue for everything since you joined. It is, visually, a bar that says you have barely started. That is the correct thing for it to say.
My own phone is the best argument for it. I have walked 12,934,501 steps into this, which is a number I am genuinely proud of, and the honest bar renders it as 2.52 percent. Twelve and a half million steps, and the rail is still almost entirely empty. Every instinct I have as a designer wants to fix that, and fixing it would mean lying.
The reason this is worth the disappointment is that the honesty is what makes the rest of the app mean anything. If the top-level number is inflated, then every stage you reach below it is inflated too, and the 459 real distance equivalences stop being facts and become decoration. The empty bar is what buys the credibility that the stages spend.
The comment I left in that file still reads "an honest, mostly empty rail," which is the only note in the codebase I wrote for a future version of me rather than for a compiler.

/
Process
Every stage detail was supposed to show how many people had reached it. The trouble is that early on, and for anyone with the social features switched off, the honest answer is that I have no idea.
The easy fix is a plausible number. Nobody would ever catch it, and a stage that says 1,200 astronauts have been here feels considerably better than one that says nothing. I wrote a copy ladder instead, so that every state has a true sentence: you have reached this stage, you and three other astronauts have reached it, no astronauts have reached this stage yet, and for the one you are working toward, you're walking toward this stage. The counts only ever come from walkers the app can actually see, with you excluded so you are never double-counted in your own total.
The design consequence I liked is that the empty state stopped being a failure. "No astronauts have reached this stage yet" is a genuinely good thing to read when you are about to become the first one, and I would not have found that line if I had let myself fill the gap with a number.

/
Final Design
Eight numbers are allowed to leave your phone.
Walking alone is local-first. Your history, your stages and your weekly recaps stay on the device, and there is no account until you ask for one. Social is a separate opt-in, and appearing on the global board is a further one on top of that.
When you do turn it on, the complete set of health-derived data that may leave the phone is eight integers and one date. Steps since you joined, steps today, this week and this month, a route identifier and two revision numbers, and the day your data is fresh through, formatted with no time attached because a timestamp is a location if you collect enough of them. No samples, no workouts, no device identifiers, no routes you actually walked, no coordinates.
I put that boundary in a single type with the rule written above it, so that the constraint sits where the next person to touch the code will see it rather than in a document nobody opens. That is the part I would defend hardest: a privacy promise that lives in a policy is a hope, and one that lives in the shape of a type is closer to a guarantee.
Around that spine the app is a living Today screen with your voyager standing on the stage you are actually on, a 459-stage illustrated Atlas you scroll along a dashed route, a celebration when you clear one, and pseudonymous social boards. All of it is downstream of the same rule.
/
Reflection
OTHER
PROJECTS
Get in touch

