I audited 6 fitness apps, studied sobriety apps (which hold onto users far longer than fitness apps do), and ran 6 in-person interviews across three cohorts. The participants hit the same friction zones whether they were lapsed, active, or new to fitness apps.
In 2023 I owned the research, UX strategy, flows, lo-fi testing, mascot direction, and high-fidelity design. In 2026 I redesigned the brand and built the product myself: 37 React components, a Supabase backend, and three accessibility audits.
I audited fitness and sobriety apps, ran 6 interviews, mapped findings, and tested 4 core tasks in Figma. Three years later I rebuilt the app against that same research, with help from Claude Code: 92 commits between Aug 30 and Sep 10, 2026.
Testing moved the hierarchy from goal-setting first to workout logging first, and the build keeps that order. Building it also retired the leaderboard: ranking beginners by load contradicted the research, so a monthly challenge took its place.
2023 · Research and design
2026 · Build and ship
01 · The Problem
Most people quit within three months.
Research context · Retention data
Dr. Muscle (2024) · StriveCloud (2024)
"Many people begin a workout regimen but lose focus and motivation after a short amount of time. Conventional gym apps frequently lack elements for goal setting and habit building."HabitaBull Lifting · Project Brief, Fall 2023
Fig. 01: Problem framing
02 · Research + Insights
Every app I audited had the same problems.
Fig. 02: Insight clustering across all 6 participants
- Simple interfaces usable mid-workout
- Progress visible over time, not just today's session
- Community or social layer for accountability
- Workouts that adapt to level and available equipment
- Logging too time-consuming to maintain mid-set
- Apps felt generic, same routines regardless of goals
- No guidance for beginners on form, pacing, or rest
- Too many ads, paywalls, features unrelated to lifting
Fig. 03: Top 6 findings from interview clustering
Core design thesis: habit infrastructure is the product
03 · Design Process
Six questions set the direction.
I wrote six "How Might We" questions, one per top finding, to set the design direction. Then I mapped user flows for the two core journeys (building a custom routine and using auto-generate) and tested lo-fi prototypes against four tasks in Figma.
Fig. 04: Opportunities per finding, and feature ideation (green notes = built in Figma)
04 · Brand
The mascot carries the brand.
The brand is built around the mascot, who carries the HabitaBull voice: strong, a little stubborn, and on your side. The 2023 bull grinned. The 2026 bull was redrawn with a closed, easy smile, because the app talks to you most on the days you nearly did not come, and a grin is the wrong face for that. The name lost its second word at the same time: it is just HabitaBull now.
The mark had to survive being small. For the app icon and tab symbol it was redrawn as a horned head, then the horns were re-curved twice because the first silhouette read as a bunny at 48px, and the whole thing was scaled down for padding. The icon sits on brand terracotta, optically centred rather than mathematically.
The Oxide pass. The first build shipped with Tailwind's stock orange-500 and green-500 carrying every action and every success state. Both were replaced with values matched in chroma to the brand cyan, and every figure below is measured against a named surface. Orange is a fill, not a text colour. One action colour per screen.
Source: app/globals.css, with the contrast maths inline. Control boundaries hold a 3:1 floor on every surface they sit on.
05 · Build + Ship
I built it in 2026.
The 2023 study stopped at lo-fi prototypes and a brand guide. Between August 30 and September 10, 2026, I rebuilt HabitaBull as a shipped product against that study's own research, with Claude Code as a pair for the build: 92 commits, a Next.js 16 and React 19 app in TypeScript with Tailwind v4, a Supabase backend for the social features, Vitest for the logic, and an installable PWA deployed on Vercel.
It is phone-only on purpose. Every screen is designed at 390 by 844 and the desktop view just draws that device. Installing is not cosmetic either: iOS evicts script-writable storage after seven idle days for uninstalled sites, and the user who disappears for three weeks is exactly who this product is for. Uninstalled, they would come back to an empty app.
- Log a workout first, set goals later. The lo-fi finding that flipped the hierarchy is the app's information architecture.
- Auto-generate from equipment, muscles, and time. Now it also takes a plain-language description of your week.
- The streak calendar with photos. Streaks are shown, but "a streak is a nice-to-have, not the score."
- Setting the "why" before day one, borrowed from sobriety apps.
- The leaderboard is gone. Ranked by absolute load it shames the beginner the whole study was written for. A monthly challenge measured against your own schedule replaced it.
- Day types remember their own lineup, so pressing "Leg day" brings back yours, not a template.
- Cardio became its own category, with incline logging and planks in seconds.
- Nothing counts against you during rest. The timer says so: "Nothing is counting."
What each 2023 finding became, three years on. The six findings from the interviews are the build's spec. Each one is now a structural decision, not a feature beside the product.
- 01 · One thing per screen, made structuralExactly one orange action per screen and never two, because orange is the only fill that isn't a shade of the ground. The tab bar is absent during a workout: mid-session there is one thing to do.
- 02 · History is the engine, not a feature beside itClear every target rep and the weight goes up one increment; miss on three consecutive sessions and it cuts 10% and rebuilds; anything else repeats. Repeating is a valid outcome.
- 03 · Logging survives one thumb, mid-set56px targets with 44px as a floor, tabular figures so columns don't jitter, and a keyboard that is opt-in: it appears only after a deliberate tap on the number, never on entering the screen.
- 04 · A crew joined by a code somebody reads outNo account and no password anywhere in the product. What a crew sees is who trained on which day and a photo they chose to share. There is no weight and no ranking in the crew, and the database has no column for one.
- 05 · Every lift teaches itselfAll 53 carry a form cue, three or four ordered steps and at least two named mistakes, enforced by a test rather than by diligence. Shown once, on the set where it usually goes wrong.
- 06 · The week is built from her, not from a catalogueGenerated from level, the days she can actually keep and the equipment she has. "Something hurts today" rebuilds the day and changes only today.
Most gyms are a dead spot. Weight rooms are in basements. Everything the app knows already lived on the phone, but it still could not open without a network, because the page itself had to be fetched. A service worker now caches the shell at install, so one visit at home is enough. The document is still fetched network-first, which is the rule that stops this becoming the usual installed-app failure of serving a build from three weeks ago.
Underground, the plan, logging, the timer and the record all work. Two things need a signal, so two things say so: the crew screen used to report "Just you, for now." to somebody with five people in her crew.
Three things the 2023 page promised, now real. User Flow B above lists Spotify integration as an intention. It is not an intention any more.
- Spotify at workout startPaste a playlist link once; starting a workout opens it. No OAuth, no account, degrades to silence.
- Body-weight trackingA dated weigh-in with a line chart on Progress. No goal weight, on purpose.
- Progress chartsOne chart component for lifts and body weight, replacing a sparkline the empty state was already calling a line.
06 · Accessibility + Audit
Three audits.
Each audit ended in a commit that records what was measured and what changed. The point of logging a set one-handed between working sets is that you should be able to correct a mis-logged one the same way, so every target size and contrast ratio in the app was checked with a tool before it shipped.
.tap utility grows the target and subtracts the same amount in margin, so no layout moves. Contrast was computed for all 21 token pairs in use; every text pair passes AA, most at AAA.One knowing deviation is written down rather than hidden: the consistency grid's missed cells stay below 3:1 on purpose, because raising them makes every skipped day as loud as every completed one, and the whole product exists to stop that being the feeling.
07 · Reflection
What I learned.
Cross-industry research changed everything.
Studying sobriety apps was an odd move for a fitness project. But I Am Sober had already cracked the retention problem I was working on; it just talked about it in recovery terms. Looking outside fitness showed me fixes the six-app audit never would have. Three years on, "why do you lift?" is still the second screen.
The mascot did real UX work.
The bull started as decoration. By the end he was doing the work: he gives the app a voice, a reason to celebrate a PR, and enough presence that skipping a workout feels like letting someone down. In the build he also had to survive 48px, which is how a grin became a smile and a bunny became a bull.
Lo-fi testing changed the hierarchy.
My first prototype opened with goal-setting, which felt logical and tested badly. People wanted to log a workout first and set goals later, once they'd seen what the app could track. I had built from the product's logic instead of from the first thing you actually want to do.
Some findings only bite when the data is real.
The 2023 research said beginners quit when they feel ranked, and the leaderboard survived that finding on paper for three years. It did not survive a week of real sessions flowing through the screens. A design that contradicts its own research can look fine right up until it runs. That is the strongest argument I have for designers building the thing.