Personal training, without the gym.
A private in-home training service in Tampa Bay needed a platform that felt more like a members' club than a booking app. We shipped a Next.js 15 portal, an Express API, and a Stripe-billed membership system with an editorial design language its owner could send to a magazine.
The founder had built a private, in-home personal training business in Tampa Bay. The offering was premium — trainers coming to your home, working around your schedule, tracking progress across weeks — but the software category she had to shop for looked nothing like the offering.
MindBody clones. Booking widgets. Receipt-style interfaces. The competition treated the trainer-client relationship like a taxi ride: pick a slot, get billed, move on. That's not what her business was.
She needed a platform that would onboard trainers with real legal weight — signed acknowledgments, credential tracking, PDF modules gated behind scroll-to-bottom and legal-name signature. She needed a progress tracker clients would actually open — not a chart, something they'd want to look at. And she needed billing that felt like a membership, not a subscription — three tiers, pause/downgrade/cancel flows that respected the relationship.
Above all: the whole thing had to feel like her brand. Editorial. Considered. Not templated. The existing tools failed her not on features but on tone.
We built a Next.js 15 monorepo with three surfaces sharing a design system: a client portal, a trainer portal, and an admin.
The design language came first. Canela as the display face, Matter as the body, no border-radius on anything, no drop shadows anywhere. Four color tokens — ink, cream, stone, warm — and a single accent used sparingly. It reads like an editorial page, not an app. Every micro-decision defended the aesthetic.
Stripe billing at three tiers ($520 / $980 / $1,380), with pause, downgrade, and cancel flows on the client side. Supabase as the database with row-level security on every table — a trainer can only see their own clients, an admin can see everything, a client can only see themselves. Not enforced in code — enforced in Postgres.
Trainer onboarding is the credential system in disguise. Thirteen locked PDF modules, each requiring the trainer to scroll to the bottom before the "acknowledge" button unlocks, type their legal name to sign, and pass a timestamped acknowledgment that lands in the audit table. Substitute trainers can be onboarded in half a day instead of three.
The before/after progress slider is the moment we knew the design was working. Two photos, a draggable divider, three key numbers below. Trainers pull it up during check-ins. Clients screenshot it and post to Instagram. The slider does the marketing.
What we built it with.
The intelligence layer.
From brief to production.
What shipped.
The platform doesn't feel like software. It feels like part of the brand. Clients open it — that never happened with the last tool. Trainers get through onboarding in a day. This is what I asked for.
More from the studio.
Building something similar?
If your problem lives at the intersection of AI, product, and real business constraints, let's talk.
