Ultimate · empty states

Day one, before anyone arrives

Minh Trần just signed up: 0 followers, 1 following (the founder auto-follow), no journeys, no badges. These are the states the App Review reviewer meets in their first five minutes — and every real user's first day. Doctrine: honest ≠ empty cuts both ways — we don't guilt a quiet screen into activity, and we don't paper a real zero over with filler. The one loud exception is the feed: a zero-follow feed is Discover-fed, never blank — that's its own full mock, feed-empty.html. Everything here stays quiet on purpose.

Activity — quiet is the truth

Chrome identical to notifications.html; no on-air strip (no live step), no rows, no CTA. Activity reports what people did — when nobody has yet, it says so once and stops talking.

9:41
Activity
Quiet for now
When someone steps with you — a heart, a comment, a share — it lands here.
Ruling

Activity never nags

Activity is not a growth surface. It reports what people did; an empty report gets one calm sentence in the system voice, not an illustration, not a button. The copy teaches the vocabulary — heart, comment, share, step with — so the first real row already makes sense.

No tangerine dot on the tab, no badge: zero unseen rows means zero signals. The badge model stays server-truthful from minute one.

Never here: "Invite friends to get started", "Post a step to get noticed", or any CTA that treats quiet as a failure the user must fix. That's the app cheering for itself.

Profile — vocabulary before volume

Chrome identical to profile.html (own profile). No on-air card — nothing is live. The doors stand with honest zeros; the "+" tile is the page's one hero and its only CTA.

Ruling

Doors show honest zeros; the "+" tile is the hero

The doors stay on screen at 0 and 0 — muted, not accented, with one seat-line each that says what will live there. Doors are vocabulary, not shame: hiding them until they're impressive would teach the page's most important objects last. They stay tappable — badges.html already answers the empty visit ("Badges arrive on their own — all you ever do is show up").

The one CTA on the page is Start a journey — the dashed "+" tile grown into the filmstrip slot's hero. No on-air card, no follower bar, nothing borrowed from the populated layout that would render as a hole.

Never here: progress framing ("Complete your profile — 2 of 5"), placeholder ghost-journeys, or an accent color pretending something is live. Zero is rendered as zero.

Search — a real zero stays a zero

Chrome identical to search.html (typed state, query "quangminh99"). The people search found nothing; the page says so and offers exactly one useful thought.

9:41
quangminh99
No one by that name yet
Check the spelling — or invite them.
Ruling

A failed search doesn't backfill with filler

A person-lookup that finds nothing gets no trending journeys, no suggested people, no "you might like" stuffed underneath. The user asked a specific question; padding the answer teaches them the results can't be trusted. The landing state (recents + discovery zones) is one ✕-tap away — discovery lives there, on purpose.

Two lines only: the honest zero, then the one useful thought — spelling, or the person isn't on Stepo yet.

Never here: "While you're here…" content units. Honest ≠ empty also means honest ≠ noisy.