The step app that refuses to flatter you

(

(

1

1

)

)

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

TEAM
TEAM

Just Me!

/

Overview

The Moon is 512 million steps away. A good day is ten thousand.

That ratio is the entire design problem. At this app's reference stride the Moon sits 512,533,334 steps from your front door. Walk well every day and you will move the bar by about two thousandths of one percent.

Which means a step app built on this idea has an obvious and very tempting cheap version. Scale the bar to something reachable so it fills nicely. Let people import years of Apple Health history so they arrive already near the top of the leaderboard. Show a number of other people who reached this landmark, whether or not you actually know it. Every one of those makes the product feel better on first open, and every one of them is a lie of a slightly different size.

I built the version that does none of it. This case study is about those four decisions, what each one cost, and why I would make them again.

We led the end-to-end design of a cohesive hardware-integrated ecosystem from scratch, focusing on democratizing home automation for mass-market users.

/

Overview

The Moon is 512 million steps away. A good day is ten thousand.

That ratio is the entire design problem. At this app's reference stride the Moon sits 512,533,334 steps from your front door. Walk well every day and you will move the bar by about two thousandths of one percent.

Which means a step app built on this idea has an obvious and very tempting cheap version. Scale the bar to something reachable so it fills nicely. Let people import years of Apple Health history so they arrive already near the top of the leaderboard. Show a number of other people who reached this landmark, whether or not you actually know it. Every one of those makes the product feel better on first open, and every one of them is a lie of a slightly different size.

I built the version that does none of it. This case study is about those four decisions, what each one cost, and why I would make them again.

/

Problem

Every honest choice here makes the product feel worse on day one.

I studied cognitive science, so the part I could not stop thinking about is that this category runs on a known trick. Progress feels good in proportion to how much of it you can see, not how much of it is real, and any product that converts a small daily number into a big cumulative story is one design decision away from manufacturing that feeling instead of earning it.

The specific trap is that the dishonest version is not obviously dishonest to the person using it. Nobody opens a step app and audits the denominator. A bar that fills to a total you invented looks exactly like a bar that fills to the real one, except it feels better, so the user prefers it. That asymmetry is what makes this an ethics problem rather than a taste problem: the incentive points one way and there is no user complaint that will ever point back.

So the constraint I set before building anything was that the app is never allowed to make the number look better than it is. Not rounded, not rescaled, not padded with data the user did not earn during the mission, not filled in with a plausible guess where a real count was missing. The rest of this is what that rule cost.

We led the end-to-end design of a cohesive hardware-integrated ecosystem from scratch, focusing on democratizing home automation for mass-market users.

/

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.

Apple Health may already hold years of your walking. Letting people import it is genuinely good: your personal journey should include your real life, and arriving with 4 million steps already banked feels wonderful.

It also destroys any shared challenge instantly. Whoever has owned an iPhone longest wins, permanently, and nobody who joins later can ever catch up. Most products in this space pick one side, either no history at all or history that silently counts for everything.

I split the number instead. Imported history and post-activation steps are two separate values that never merge, from the data model through to the wire. Your personal journey to the Moon adds them together, because that story is yours. The leaderboard only ever sees steps taken after you joined, so the race starts when you start. In the code the type that publishes to the server carries postActivationSteps and nothing else, which is what makes this a guarantee rather than an intention.

I am the person this rule costs the most. My own profile reads 12,921,953 imported and 12,591 after joining. Nearly thirteen million steps of my real walking, and essentially none of it counts competitively, because I imported it rather than earning it inside the app. I wrote a rule that puts me at the bottom of my own leaderboard, and I would not change it, because the alternative is a product where the winner is whoever has owned an iPhone longest.

What I learned is that the fair version needed two totals rather than one compromise between them. My first instinct was to find a single number that was fair enough for both jobs, and there isn't one. Once I let the two questions be two fields, the design got simpler, not more complicated.

We led the end-to-end design of a cohesive hardware-integrated ecosystem from scratch, focusing on democratizing home automation for mass-market users.

/

Process

I shipped a progress bar that is almost entirely empty.

The Moon is 512 million steps away. A good day is ten thousand.

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

When I did not know how many people had been there, I said so.

The Moon is 512 million steps away. A good day is ten thousand.

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

I cut a feature I had just finished, and it was the right call.

The Moon is 512 million steps away. A good day is ten thousand.

Scrolling 459 stages is slow, so I designed a fast-scroll scrubber, rebuilt it once when the drag behaviour was wrong, and got it working. Then I put it on the phone, used it for two days, and deleted it. It never earned its place next to the thing people actually come for, which is the artwork, and keeping it because it had been expensive to build would have been the worst possible reason. I left a comment marking the cut and the commit it lives in, in case a future version of the problem wants it back.

The habit underneath that is checking things on the real device instead of trusting the screenshot. A launch crash that only ever happened on hardware, an Atlas that scrolled fine in the simulator and stuttered badly on the phone, and a font that had been silently falling back for days all surfaced the same way. When a layout question was genuinely ambiguous I built an HTML prototype with live sliders first and moved the values around until the answer was obvious, rather than arguing about it in the abstract or guessing in Swift.

Two things I want to be straight about. This is not released. It runs on my iPhone and it has never been through TestFlight or the App Store, so nothing here is a claim about real users or retention, and the honest test of whether truthful wonder actually holds people is a test I have not run yet. And the build was AI-assisted: I set the product rules, made every design and product call, ran five on-device review rounds, cut my own work, and tested on real hardware, but I directed agents to write the code rather than writing it myself. That is how one person got a native iOS app with a backend this far in a couple of weeks, and it is also why the next milestone is other people's phones rather than more features on mine.

We led the end-to-end design of a cohesive hardware-integrated ecosystem from scratch, focusing on democratizing home automation for mass-market users.

OTHER

PROJECTS

Get in touch