Skip to content

work / gymmate · Live · daily use

GymMate

A local-first gym tracker that knows what you did last time.

Week of Claude Maxing

A friend got me started, but the itch was mine: mid-session I could never remember my rep count, my best weight on that lift, or whether I was actually pushing harder than last week. Rest was worse, I just eyeballed it. So the first build was memory and a timer. The part I am more interested in now is that gym is solo by default and does not have to be: if the app knows who else nearby is using it, you can ask for a spotter and train with someone whose plan matches yours.

Why I built it

Standing in the gym not knowing what to do next, while subscription trackers drown the basics in features.

The problem

A favourites hit-list answers "what now", a set logger shows last-session numbers beside every set, and a smart rest timer counts you back in. An 873-exercise database with muscle diagrams, a plate calculator with warm-up ramps, personal-record detection with celebrations, progressive-overload targets and a calendar heatmap round it out. Fully offline, installable, no account.

What it does
  • React 19
  • Vite
  • TypeScript
  • Dexie / IndexedDB
  • Tailwind 4
  • PWA
  • Vercel
Stack
  • Local-first: everything lives on-device in IndexedDB, with JSON export as the backup path
  • Smart rest timing by exercise category and mechanic, with haptics
  • Driven end to end with Playwright before shipping, including real touch drag-reordering
Under the hood
The lb mode silently stored kg and looked fine to a metric user. Convert at the widget boundary and assert the round-trip.
What I learned

Screenshots from the app in actual use, not mockups.

GymMate home screen: workouts, sets and total volume for the week, a seven-day volume chart, and a muscle-focus radar showing legs at 51 per cent.
GymMate exercise detail for Alternating Floor Press, with front and back muscle diagrams highlighting the chest as primary, plus add-to-plan and log buttons.

The real thing

A pure-frontend replica with mock data: nothing is saved, nothing leaves the page. The real app is richer; this is the feel of it.

loading the demo…

Play with it

The thinking

user · pains · gap · tools

Casual and returning lifters (me included) who blank on "what now?" mid-session and refuse to pay a subscription for a logbook.

Target user

  • Standing at the gym not knowing what to do next
  • Big trackers bury logging under social feeds and paywalls
  • No memory of what you lifted last time, so progression stalls

Pain points

A free, offline, no-account tracker where the favourites hit-list answers "what now" and every set shows last time beside it. Local-first means it works in a basement gym with no signal.

Gap in the market

  • Claude Code + designer/QA agents (build)
  • Playwright (verification)
  • Dexie/IndexedDB
  • react-body-highlighter
  • free-exercise-db (873 exercises)

AI + tooling

  • Progressive overload + double progression (reps first, then weight)
  • Hick’s law: a favourites hit-list kills mid-session choice paralysis
  • Operant conditioning: PR detection and celebration as reinforcement
  • Friction budget: logging a set must take seconds, or it will not happen
  • Local-first PWA (works in a basement gym with no signal)

Frameworks

  • In daily use: it does the job it was built for, tracking history and holding me to a monthly consistency streak
  • Fully offline, installable
  • Spotter matching and plan sharing are still in the making, and untested until there are enough users in one gym to try it properly
  • TBD: sessions logged per week, PR rate, spotter match rate once the social layer ships

Success metrics

Match tracker, training journal and AI coach for my own game.

← all work