Jonas ForshellSenior Product Owner
jonas@jforshell.seEmail me
Case · Exercise

Gym app check-in, fixing the moving target problem

A small mobile check-in redesign for the frustrating moment when buttons move while options load.

Context
UX redesign concept
Role
Self-initiated product exercise
Date
February 2026

The short version

Result
A working prototype in about 30 minutes, and a list of what I'd validate before building it.
What I did
Prototyped optional favourites for my gym app's check-in. Pinned buttons keep their place while the list loads.
The call
I only changed the moment that goes wrong, and the full list still loads below the favourites.

The moment this is about

I've used my gym's app for years, and checking in has always worked the same way. I open the app, wait for Bluetooth to find the nearby doors and gates, then rush to tap "GYM - Incheckning" before the list changes.

Prototype

I took screenshots of the real app, wrote the brief with Claude and had Codex build it in planned mode. Within a few minutes the prototype showed both the failure and the fix.

Before
Before, the buttons move. After, favourites stay put and show whether they're available.
View live prototype →

The prototype works best on a phone or in a narrow browser window.

Problem

Every check-in starts with a list of entrances and gates that keeps changing. As new doors come in range they're inserted into the list and the existing buttons move, so I reach for one and tap another, or wait for the whole list to settle first. It's a small annoyance, but it turns check-in into whack-a-mole at the one moment it should be quick.

Gym app searching state before entrances load
Scanning starts and the first options appear.
Gym app list changing as options load
More options load and push the buttons down.
Gym app final list with all options loaded
Loading finishes and the list settles.
View full 8-screen sequence
Gym app check-in list showing the Bluetooth searching state before any entrance is detected
Step 1
Gym app check-in list showing a single entrance, Entre, after the first Bluetooth match
Step 2
Gym app check-in list showing three entrances, Entre and two pass check-in doors
Step 3
Gym app check-in list reordered to four entrances as a new sluice door is detected
Step 4
Gym app check-in list showing six entrances including two accessibility doors
Step 5
Gym app check-in list showing seven entrances after the main gym check-in door appears
Step 6
Gym app check-in list showing eight entrances after a second accessibility door appears
Step 7
Gym app check-in list settled at eight entrances once Bluetooth scanning finishes
Step 8

Approach

The app favours accuracy over stability. The list always shows exactly what's in range, which is why you can never be sure where a button will be.

I considered three other orderings.

  • Alphabetical, which is stable but a poor fit for the action everyone uses most, "GYM - Incheckning"
  • Most recently used first, which is personal but still moves around over time
  • By time of day, which would work but is over engineered for this

I went with optional favourites. You pin the actions you use to the top of the list, and a pinned item keeps its place. It only changes state, greyed out when it's out of range and red when it's available. Everything else still loads below it.

What I would validate

This is a concept, and it wouldn't bring in any revenue. It would remove an annoyance that keeps coming back. Before pitching it to the gym chain I'd want three answers.

  1. Should favourites follow you between locations, or belong to one?
  2. Do people understand pinning at a glance, and the change from grey to red?
  3. Do enough people pin anything to justify the build, and does check-in get faster or more accurate?

What could come next

If it worked, the app could suggest a favourite once the same action keeps repeating, let you pin with a long press straight from the list, or show rough distance or signal confidence instead of only grey and red. The whole thing took around 30 minutes, including the screenshots and this write-up, and the prototype runs on Vercel.