UX Design · Product Build · Fitness AppWork in progress

HabitaBull Lifting

I designed a lifting app for logging workouts and returning after a break. I began with a student research project in 2023 and shipped an installable app in 2026.

ToolsFigma · InDesign · Photoshop · Next.js · React · TypeScript · Tailwind · Supabase · Vitest

The four strongest screens

Onboarding screen asking Why do you lift, with a free-text answer and five suggested reasonsJump to 02, then and now
Why do you lift? Borrowed from I Am Sober; your answer comes back on the days you do not feel like it.
Logging a set: weight and reps steppers, last time's numbers, and a Log set buttonJump to 04, build
Logging. Steppers you can hit one-handed between sets. Last time is right there.
Today screen after a gap: your reason is shown with the line Still true. The gap does not undo it.Jump to 05, come back
Comeback beat. After a gap, the app says the gap does not undo anything.
Progress: You show up on Wednesdays, a 12-week grid of trained, comeback and missed days, and session countsJump to 05, come back
Progress. Consistency first. Comebacks are counted on purpose.
Problem, jump to 01, research

Most people quit within three months.

71–80%abandon their fitness app within 3 months

90%quit their fitness goals entirely

Role · time, jump to role, process and impact

Designer and Developer

Fall 2023 research and design. Aug–Sep 2026 build.

Numbers, jump to the numbers in 04, build
6interviews
92commits
824tests passing
3audits
2023 · 2026, jump to 02, then and now

The leaderboard is gone.

Research, jump to the research in 01

Every app I audited had the same problems.

6 apps, sobriety apps, 6 interviews.

Brand, jump to 03, brand

The mascot carries the brand.

Accessibility, jump to 06, audits

Three audits.

Every control clears 44 by 44.

Outcome, jump to the impact

Log first, goals later.

The leaderboard retired. Shipped as an installable app.

Learned, jump to 07, what I learned

What I learned.

  • Cross-industry research changed everything.
  • Lo-fi testing changed the hierarchy.

Role, process and impact

Role, process, impact and timeline
Role
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: 39 React components, 824 tests, a Supabase backend, and three accessibility audits.
Process
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.
Impact
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
  1. Research Apr 8
  2. Empathy & Definition Apr 22
  3. Ideation May 3
  4. Design May 12
  5. Implementation May 19
2026 · Build and ship
  1. Redesign + installable PWA Aug 30–31
  2. Crew backend Sep 1–3
  3. Oxide brand + mark Sep 6–8
  4. Workout features Sep 6–9
  5. Audits + fixes Aug 31 → Sep 10
Context
IMA · UX Studio, 2023
Shipped as a PWA on Vercel, 2026
Tags
  • UX Research
  • App Design
  • Figma
  • Next.js
  • Supabase
  • Accessibility
  • 2023–2026

01Research

Most people quit within three months.

  • 71–80% of users abandon their fitness app within 3 months of installing it (Dr. Muscle, StriveCloud, 2024).
  • I audited 6 fitness apps, studied sobriety apps, and ran 6 in-person interviews across three cohorts.
  • Every app I audited had the same problems. Lapsed, active and new users hit the same friction zones.
Read more

71–80%of users abandon their fitness app within 3 months of installing it

90%quit their fitness goals entirely after 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

That is the brief's problem statement (Fig. 01, problem framing). The brief itself carried a mockup of the 2023 goal-setting onboarding screen.

I audited 6 fitness apps (Strava, NTC, Sworkit, Freeletics, 7min and RunAway) for how they hold users, where they overcomplicate, and what they leave out. I 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.

  • Interview participants. 6 people, Vancouver. Formerly used, currently active, never used: different question branches per cohort.
  • Habit building framework. 6 principles from Atomic Habits translated to app features: identify, schedule, flex, set a goal, repeat, reward.
  • Core design thesis: habit infrastructure is the product. Incorporating habit-building is crucial for consistent exercise routines.

What they wanted

  • 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

What pushed them out

  • 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
Interview insight clustering: sticky notes organized by theme: things they find important, info, habits, thoughts about apps
InterviewsFig. 02: Insight clustering across all 6 participants.
Top Findings: 6 findings based on insights clustering, with user quotes
FindingsFig. 03: Top 6 findings from interview clustering.
Desk research: I Am Sober cross-industry motivation analysis
Cross-industry researchI Am Sober: CBT-based motivation loops applied to fitness habit design.

02Then and now

Lo-fi testing changed the hierarchy.

  • I wrote six How Might We questions, mapped two core flows, and tested lo-fi prototypes against four tasks in Figma.
  • The first prototype opened with goal-setting and tested badly. People wanted to log a workout first.
  • Three years later I rebuilt the app against the same research. One 2023 idea did not survive the build.
Read more

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.

Six questions set the direction. How might we…

  1. Make it easy for new users to navigate through the app?
  2. Ensure that new users feel confident and informed when starting their fitness journey?
  3. Incorporate community support within the interface?
  4. Motivate youth to be disciplined and create healthy habits?
  5. Incorporate additional features and ensure a more engaging and supportive platform?
  6. Cater specifically to individual fitness goals and needs?

Kept from 2023

  • 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.

Changed in the build

  • 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.”

The 2023 lo-fi screens

  • Leaderboard (2023, later cut). Community competition by exercise. It tested fine on paper; in the 2026 build, ranking people by absolute load read as the beginner shame the research warned about, so a monthly challenge replaced it.
  • Exercise tutorial. Animated demonstration plus a list of common mistakes, so beginners know what to watch for.
  • Account setup. Name, past weights, favourite exercises, preferred workout days. Sets the “why” before day one.
  • Routine builder. Full flow from profile to goal display to muscle group to exercise selection, minimal taps.
  • User Flow A. Creating a new lower-body workout routine: muscle group selection, exercise picks, animation previews.
Lo-fi prototype: auto-generate workout by equipment, muscle group, and duration
2023 lo-fi: Auto-generateEquipment → body part → duration → editable generated routine. Lower barrier for beginners.
2026
Week setup: describe your week in a sentence, or pick how often and which days you can train
AI week setup. Describe your week instead of tapping it out. “Three is the number beginners actually keep.”
Lo-fi prototype: calendar streak view and photo album for past workout photos
2023 lo-fi: Streak calendarWorkout calendar with a 6-day streak indicator and a photo album, so progress shows up as pictures, not only numbers.
2026
Calendar: five weeks running, progress photos, and buttons to add training days to Google Calendar or Apple and Outlook
Calendar. The 2023 streak calendar, with progress photos and reminders that go into the calendar you already look at.
User flow: auto-generate a workout based on equipment, muscle groups, and time
User Flow B. Auto-generate: inputs equipment, target muscles, and available time. Outputs an editable routine with sharing and Spotify integration.
Opportunities mapped to 6 findings, plus Ideas and Features brainstorm (green = implemented in Figma)
Fig. 04: Opportunities per finding, and feature ideation (green notes = built in Figma).
Lo-fi prototype from 2023: leaderboard with community competition by exercise, later replaced by a monthly challenge
2023 lo-fi: Leaderboard
2026
Crew screen before joining: Just you, for now. No rankings. No weights. Just who turned up. A monthly challenge of 13 sessions in October.
Monthly challenge. What replaced the leaderboard. The target is your own schedule counted, and it says so when the month can no longer fit it.
Lo-fi prototype: workout tutorial with animated figure and common mistakes listed
2023 lo-fi: Exercise tutorial
2026
Form cue screen: the bull with a speech bubble about knees caving in, above movement steps and common mistakes
Form cue. The 2023 tutorial idea, rebuilt: the bull speaks once, on the set where the mistake usually happens, not every set.
Lo-fi prototype: account setup: name input, weight entries, favourite exercises, workout days
2023 lo-fi: Account setup
2026
Onboarding screen asking Why do you lift, with a free-text answer and five suggested reasons
Why do you lift? Borrowed from I Am Sober, per the 2023 research. Your answer comes back to you on the days you do not feel like it, and it is never rewritten.

03Brand

The mascot carries the brand.

  • 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.
  • The mark had to survive 48px. The horns were re-curved twice because the first silhouette read as a bunny.
  • The Oxide pass matched every colour in chroma to the brand cyan. One action colour per screen.
Read more

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.

Barlow Condensed · DisplayHeadlines, numbers on the logging screen, the wordmark. Condensed so a weight like 147.5 lb fits a 390px screen at a size you can read mid-set.

Barlow · BodyEverything else. One family at two widths, so the app has one voice and the type scale collapsed from 19 ad-hoc pixel sizes to 9 steps.

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 in the palette 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.

HabitaBull mascot, 2026: a slate-grey bull with pale horns and a closed, easy smile
MascotThe 2026 bull. A closed, easy smile.
Welcome screen: the bull on the cyan field above the wordmark and a name field
WelcomeWelcome. The 2023 cyan field, kept for exactly one screen. Dark ink on it measures 8.1:1; the old white wordmark was 2.23:1.
Personal record screen on terracotta: the bull above the words 2.5 lb more than you have ever done
Personal recordPersonal record. The one screen that goes full terracotta. “Only your own numbers. Nobody else is in this.”

The Oxide palette

Ground #16181DThe app field.
Card #1F232BRaised: cards, rows, panels.
Action #D57E5CInk on it: 5.89:1.
Done #6BB88D7.50:1 on ground, 6.65 on card.
Cyan #8EB4BDThe 2023 field, kept for the welcome screen.
Horn #B8B898Sampled from the horns. 8.75:1 on ground; never on orange.
Fault #D9746D5.64:1 on ground. Softer than a browser red.

04Build

I built it in 2026.

  • 92 commits between Aug 30 and Sep 10, 2026: Next.js 16, React 19, TypeScript, Tailwind v4, Supabase, Vitest, an installable PWA.
  • Phone-only on purpose. Every screen is designed at 390 by 844.
  • 824 passing automated tests across 42 files. No retention numbers are claimed: it has not launched to users yet.
Read more

92Commits between Aug 30 and Sep 10, 2026, on one branch, one person with Claude Code

39React components, plus API routes for the crew and for AI week setup, and a schema for Supabase

824Automated tests passing across 42 files (checked 9 October 2026), plus a smoke test that runs the crew routes against a stand-in Supabase

0Retention or usage numbers claimed. It has not launched to users yet, so there are none, and this page will not invent any

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.

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 structural. Exactly 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 it. Clear 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-set. 56px 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 out. No 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 itself. All 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 catalogue. Generated 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.

Show up. Log. Come back.

Download video
Your reason for lifting stays in view. Log a set with large, simple controls, rest, then continue. Your training history counts comebacks too. A 10-second edited walkthrough using app screens and demo data. No sound needed.

Log a set, in order

From the one button on Today to the rest between sets.

  1. 01 SHOW UP
    Today screen: Full body A, the reason you lift, a Start workout button, this week's ring strip, and the goal

    Today. One button. Your reason, this week, and the goal sit underneath it, in that order.

  2. 02 LOG
    Logging a set: weight and reps steppers, last time's numbers, and a Log set button

    Logging. Steppers you can hit one-handed between sets, or type the number. Last time's numbers are right there.

  3. 03 NEW BEST
    Set-logged confirmation on a green field: a check mark and the words New best, 150 lb by 6

    Set-logged beat. A confirmation with haptics that escalates by result. A best holds a second longer than a plain set.

  4. 04 REST
    Rest timer: a 2:00 ring, what is next up, and a Start next set button

    Rest timer. Rings and buzzes when rest ends. Rest pace is chosen at signup, with a card explaining why yours differs.

05Come back

Comebacks are counted on purpose.

  • When you return after a gap, the app says the gap does not undo anything.
  • Progress shows consistency first, then lift charts and body weight. No goal weight, by design.
  • A crew sees who trained on which day and a photo they chose to share. No weights and no ranking.
Read more

Three things the 2023 page promised, now real. User Flow B lists Spotify integration as an intention. It is not an intention any more.

  • Spotify at workout start. Paste a playlist link once; starting a workout opens it. No OAuth, no account, degrades to silence.
  • Body-weight tracking. A dated weigh-in with a line chart on Progress. No goal weight, on purpose.
  • Progress charts. One chart component for lifts and body weight, replacing a sparkline the empty state was already calling a line.

And two more

  • Copy a workout. Open a friend and take their lineup without taking their numbers, such as copying a friend's Push day into your own week. Their lifts, your weights.
  • Export and import. Everything lives in the browser, with Save a copy and Restore from a file: one file holding every session, note and photo. Your data lives on your device and nowhere else.
Today screen after a gap: your reason is shown with the line Still true. The gap does not undo it.
After a gapComeback beat. When you return after a gap, the app says the gap does not undo anything. Comebacks are counted on purpose.
Progress: You show up on Wednesdays, a 12-week grid of trained, comeback and missed days, and session counts
ProgressProgress. “You show up on Wednesdays.” Consistency first, then lift charts and body weight. No goal weight, by design.
Crew feed: what Maya, you and Sam posted this week, with likes and replies, and a code to add someone
CrewCrew. Shared days, photos, likes and replies on a real backend. Never what anybody lifted, and never in order.

06Audits

Three audits.

  • Each audit ended in a commit that records what was measured and what changed.
  • Every target size and contrast ratio in the app was checked with a tool before it shipped.
  • One knowing deviation is written down: the consistency grid's missed cells stay below 3:1 on purpose.
Read more

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.

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.

Deliberately no maximumScale: locking zoom on a fixed layout is a WCAG 1.4.4 failure.

Three orange markers next to an orange “Got it” made four orange things on a screen allowed one.

AUDIT 01 · PWA LAUNCH

Every control clears 44 by 44.

The set segments were the worst offender at 107 by 6 pixels. A .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.

AUDIT 02 · APPLE HIG

Regressions the palette swap caused.

The PR celebration's secondary text passed against the old brighter orange and fell to 4.39:1 on Oxide, under Apple's 4.5:1 for text up to 17pt. Raised to 5.17:1. Crew member rows were 26px-tall bare buttons; padded to 44px with a matching negative margin.

AUDIT 03 · 3 P1s, 5 P2s, 4 P3s

A modal that claimed aria-modal.

The crew post overlay said aria-modal while 218 elements outside it stayed tabbable. Focus is now trapped both ways, the scroll region is inert, and closing returns focus to the thumbnail that opened it. Control boundaries were re-measured per surface: 3.97, 3.52 and 3.00 to 1.

07Reflection

What I learned.

The full story, in order, lives in the deck.

View the slides PDF ↗

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.