Fitnit · built in public

Lab

Working boards for design and product experiments. Each is built from real screenshots and real data rather than mockups, and re-generated as the app changes, so the record stays honest rather than becoming a highlight reel.

Built in public. Real screenshots, real funnel numbers, and the reasoning behind each change — including the parts that went wrong. Published because the decisions are more useful than the conclusions, and most product writing only shows the conclusions.

Boards

Made to be shared

A Today card designed to be the screenshot, a share sheet at the moment someone takes one, and the streak and PR moments people already screen-record — each with the person's referral code on it.

3 proposals drawn, not built v1.148.0 baseline

What shipped

Seven proposed changes — the home widget grid, a premium ring, a physique scan, saveable meal plans, sharing that pays, a challenge you can lose, and moving the push ask earlier — each shown against the screen it replaces.

7 shipped before / after v1.139–1.145

Onboarding, every frame

Every screen of the signup flow, a scrubber for stepping through how it has changed across versions, and the PostHog funnel showing where it actually loses people.

v1.119.0 13 frames funnel data

Landing b-roll

Replacing the three carousel icons with photoreal plates generated on fal.ai, with the app's own UI composited onto the phone in each shot. Style rounds and comp tests.

3 slides fal.ai $1.65 spent

Draw it instead

Should the three pre-onboarding slides be photographed or drawn? Four illustration directions in Fitnit green, each seated in the real landing layout beside the photoreal plates that ship today.

4 directions Gemini round 1

Sign in, sign up

The two account screens as shipped, beside CSS mockups built from the real landing plates and wordmark at the phone's true size. Every arguable number is a variable; iterate here before touching React Native.

before / after 2 variants each CSS mock

Profile surface

Six stacked cards carrying three corner radii, two paddings and two gaps — measured, then collapsed into one token. Plus the settings rows going 46pt → 56pt, and the nav badge that was missing under it all.

before / after 6 surfaces 2 checkers

Meal detail

The nutrition card redrawn as five capsule sliders with an icon each and a fill that says what share of the meal it was. Before/after composites sized for marketing.

before / after 3 new icons marketing

What it takes to compete

Seventeen category leaders pulled live from the App Store — screenshots, subtitles, pricing, age — beside our real install numbers. Momentum measured from Apple’s own review feed, what each one makes per month — and the 5,017 accounts we already had and never used.

17 apps 4 charts 5,017 accounts 78 actives

Deleting? Tell us why.

The two moments iOS lets you speak to someone who is leaving — a shortcut above Remove App, and Apple’s cancel sheet. Built and shipped, beside the mockups it started as. Plus the six push tokens, and the entitlement scare that wasn’t.

v1.137.0 shipped 6 push tokens 5,031 accounts

Six store pages

Apple lets one app have many App Store pages and A/B test them — the only surface with enough traffic for a test to finish. The arithmetic that says test one at a time, and six alternate listings worth building.

6 concepts 152 impressions/day 3-week test not built

Nobody knows it’s there

Fitnit can be driven by Siri with the app closed, and nothing in the app says so. Three places a tip could go, the budget that stops ten features fighting over one moment, and the arithmetic that says do the App Store first.

3 mockups v1.149.0 19 food loggers / 90d not built

Next experiment

Drop a self-contained HTML export in scripts/lab/, run externalize.py, and add a card here.

empty slot

Served from src/public/lab/ · Cloudflare Pages, deploys on push
Add a board: python3 scripts/lab/externalize.py <export>.html --out src/public/lab --name <slug>
Images are content-hashed into lab/assets/, so a re-export only rewrites what changed.