Jonathan Hipolito

← All projects

Mobile app + front desk

Turnstile gym app

A member app for a boxing and strength gym and the front desk board it talks to, shown on a made-up club in Fitzroy, Melbourne, forty minutes before Tuesday night sparring. Members book classes, get in off the waitlist, check in at the door and log their lifts. The desk watches it all happen live.

Turnstile front desk board with the week's class fill, the rotating door code and check-ins by hour, next to Priya's phone counting down to sparring
Four screens of the member app: a full sparring class with Priya first on the waitlist, the countdown to tonight's class, the round timer mid-round, and a deadlift entry flagged as a new PR
Tonight's sparring roster on the desk board with members checked in and a message sent to the class, beside the list of memberships about to expire

What I built

  • A React Native app built with Expo: a countdown to your next class styled like the round clock on the gym wall, the week's timetable with how full each class is, booking and waitlists, and a member pass with a QR code
  • Check-in by scanning a code at the door with the phone's camera. The code changes every 30 seconds, so a screenshot shared in a group chat stops working almost straight away
  • A boxing round timer with sparring, bag work and Tabata presets. It vibrates on every bell, warns in the last ten seconds, keeps the screen awake, and schedules each bell as a notification so it still rings with the phone locked in a bag
  • A lifting log with steppers made for sweaty thumbs, an estimated one-rep max per set, a progress chart per lift, and new PRs flagged as you type. A PR also shows up on the desk board
  • Works without signal: bookings and lifts go into an outbox and sync later. If a class filled up in the meantime, the app says you landed on the waitlist instead of pretending you got in. The phone and the server share one set of booking rules in TypeScript
  • A front desk board with the week's class fill, each class roster with desk check-in, opening a spot that moves the waitlist along, messages to everyone booked that land on their phones, check-ins by hour against last week, and memberships about to run out
  • Live over WebSockets from one Durable Object per visitor, with the rest of the gym coming through the door on its own. Android APK built in GitHub Actions; on an iPhone or a laptop the same app runs as a web build inside the demo

Stack

React Native, Expo, TypeScript, React, Cloudflare Workers, Durable Objects

Live

gym-demo.jnathan.dev ↗