A booking app and website for a private training studio
Dharma Gym, a private training studio, kept its agenda in a spreadsheet and sent client assessments as PDFs. With Claude Code I built a booking and training app for athletes, trainers and administration, and a website to go with it.
Updated20 Oct 2026
The problem
Dharma Gym is a private training studio in Bogotá. Athletes buy plans of one-hour sessions and book them with their trainer, who trains several people in the same hour. The studio needed booking that respects plan credits and the cancellation notice, a way for trainers to record each session, and one place for assessments and food plans.
What was out there
The trainer's agenda lived in a Google Sheet, and assessments and food plans went out as PDFs. Before building, three research agents read 24 official help pages from booking and fitness platforms such as TeamUp, Glofox and GymMaster. I borrowed their patterns (a credit ledger, a trainer closeout queue, recurring availability with exceptions) and built the rest around the studio's own rules.
What I built
The app is in Spanish, has three workspaces and installs on the phone. Athletes book one date or several at once (all or none), see their credits, progress and training calendar, and can export a session image to share. Trainers set their weekly hours, run each session in three steps (Antes, Durante, Después: before, during, after) and record exercises, photos and notes. Administration approves accounts, manages plans and publishes news, polls and challenges.
Friends react to each other's shared activity with fixed emojis; there is no messaging between members. Health fields, photos and assessments sit behind a separate consent under Colombia's data-protection law (Ley 1581), and members can download their data or ask for deletion.
The website is a Spanish marketing site with separate pages for events and partners, and every unconfirmed fact and stock photo on it is labelled.
Equipment
- Claude Code Harnesses and agents
- Claude (Opus 4.6 to 5.5) AI models
- Codex CLI Harnesses and agents
- GPT (GPT-5.5 to GPT-6.1 in Codex) AI models
- Antigravity CLI (Agy) Harnesses and agents
- Gemini (Gemini 4 Argon) AI models
- Figma Design and media
- Supabase Code and infrastructure
- Vercel Code and infrastructure
- Next.js Code and infrastructure
- Magnific Design and media
- Magnific MCP MCP servers
- Playwright Code and infrastructure
How I built it
- Designed the flows in Figma first. Revision 8 had 271 mobile frames and covered all 27 of my comments.
- Built the booking engine locally on an embedded Postgres (PGlite), then a full demo with fictional accounts on Vercel and a dedicated Supabase Postgres project.
- Stress-tested it with 40 fictional clients and a nightly reset, then load-tested it at the gym's real size.
- Turned the trainer's requests into rules (notice period, places per start, courtesy sessions, assessments in the app), each through GPT-6 Astra review rounds until the reviewer said "Safe to deploy: yes".
- Converted the demo into a pilot with real accounts, after five more review rounds.
- Built the website with Next.js and Magnific stock photos, and had Codex review it twice.
Results
- Load test with 150 listed members (100 active) and one year of fictional history (14,224 sessions): the admin screen download fell from 29.2 MB to 0.76 MB, the trainer screen from 18.4 MB to 1.07 MB, and saving a training journal from 3,431 ms to 41 to 61 ms.
- The test suite grew from 21 tests at the first booking milestone (2026-10-03) to 185 (2026-10-21).
- The pilot conversion went through five GPT-6 Astra (high) review rounds: 10, 6, 3 and 2 findings fixed, then "Safe to deploy: yes" in round 5.
- The final review on 2026-10-19 used two model families on a clean copy of the source: GPT-6 Astra high raised 10 findings and Gemini 4 Argon high raised 12.
- The app has run as a pilot with real accounts since 2026-10-18.
What I learned
On Vercel, the server code runs as plain Node ES modules, so relative imports need a ".js" ending. Missing ones crashed the hosted app on 2026-10-18; now an import check runs before the tests.
Put data that grows in tables from the start. Keeping all training in one document worked for the demo but made the admin screen a 29.2 MB download at the gym's real size.
Even confirmed rules change once people use the app. The notice for changes and free cancellations went from two hours to three once the trainer weighed in, so the booking rules now live in one shared setting that both the server and the help pages read.
Lab notes
-
I split the trainer's session screen into three steps (before, during, after) and added an in-app guide for each role. A late change inside the notice period now costs the athlete the original session after a warning, where before it moved the session for free.
-
I switched from the demo to a pilot with real accounts: admin approval, one-time recovery codes, consent screens and nightly encrypted backups.
-
I load-tested the app at the gym's real size and moved training data into tables, which cut the admin screen download from 29.2 MB to 0.76 MB. I also built the website prototype in Spanish, with stock photos and every unconfirmed fact labelled.
-
I built the booking engine (all-or-none multi-date bookings, plan credits, the cancellation deadline) and put a full demo with fictional accounts on Vercel.
-
I drew a design system from the gym's public Instagram look and built an editable Spanish booking prototype in Figma.