Loading
About the Project

A Real Coach, Followed Day by Day

QuFit is built on a deliberate refusal: no generated programs. A trainee browses real trainers, sees the services each one offers and what they charge, and requests a course. From there the trainer writes the program day by day — exercises, sets, reps and weights — and plans the meals against a daily calorie target. Nothing in the app invents a plan; a person wrote it, for one client.

What makes it work is that both sides see the same course change in real time. The trainee starts a session and ticks off sets as they finish them, with the current exercise held on the iOS Lock Screen and in the Dynamic Island so the phone stays in a pocket between sets. Meals and workouts are logged as they happen. The trainer requests the progress data they actually need — weight, photos, measurements — and adjusts the program against what comes back. Money stays where it already was: course fees are agreed and paid in cash, hand to hand, and the trainer confirms receipt in their own app.

Three surfaces sit on one Laravel API: the trainee app, the trainer app, and a React admin portal for users, content, payments and trainer subscriptions. Arabic is the default language rather than a translation, so right-to-left is the normal case throughout — mirrored navigation and icons, not just mirrored text.

  • Browse Trainers and Their Services
  • Course Requests and Approval
  • Day-by-Day Training Programs
  • Set-by-Set Session Logging
  • Live Activity on the iOS Lock Screen
  • Coach-Planned Meals and Calorie Targets
  • Meal and Workout Logs
  • Progress Requests — Weight, Photos, Measurements
  • Posts and Reels Community Feed
  • Cash Course Fees Confirmed by the Trainer
  • Trainer Subscriptions Recorded by Admin
  • Arabic-First Interface with Full RTL
  • Light and Dark Themes, Contrast-Checked
  • Admin Portal for Users, Content and Money
QuFit

How It Was Built

Our process
Course Lifecycle Modelling Icon
01 .
Course Lifecycle Modelling

Mapping how a coaching relationship actually runs — request, approval, program, logging, progress review — and modelling the courses, payments and subscriptions that carry it.

One Design System, Three Surfaces Icon
02 .
One Design System, Three Surfaces

A single palette shared by both apps and the portal, built from contrast-measured role tokens rather than raw colours, with a script that re-measures every pairing.

API, Caching and Two Auth Models Icon
03 .
API, Caching and Two Auth Models

A Laravel API serving device-scoped tokens to the apps and session auth to the portal, with a versioned cache layer that invalidates only after a transaction commits.

Trainee and Trainer Apps Icon
04 .
Trainee and Trainer Apps

Two Expo apps on one design language: discovery, sessions, nutrition and progress on one side; clients, program building, logs and revenue on the other.

Admin Portal and Production Deploy Icon
05 .
Admin Portal and Production Deploy

The React admin portal for users, community moderation, payments and subscriptions, then a deploy pipeline that ships to production on every merge.

QuFit preview
Project Insights

Behind the
decisions we made.

A Person Writes the Plan

It would have been cheaper to generate programs and cheaper still to ship a template library. The product refuses both, because the thing being sold is a trainer's judgement — and a plan nobody chose is the one clients stop following in week three.

Arabic Is the Default, Not the Option

Direction follows the chosen language rather than the platform flag, so switching mirrors the interface immediately instead of at the next launch. Navigation and icons mirror too — the common failure is an app where only the text flipped and every row still reads the wrong way.

A Cache That Cannot Serve a Rolled-Back Row

Invalidation runs after the transaction commits, never inside it, so a concurrent read cannot cache a row that a rollback then erases. Freshness lives on the models rather than the repositories, which means a write from a seeder or a queued job invalidates exactly like a write from the API.

View the Project

See it live.

Get In TouchStar

Get In TouchStar

Get In TouchStar

Get In TouchStar

Get In TouchStar

Get In TouchStar

Get In TouchStar

Get In TouchStar

Get In TouchStar

Get In TouchStar

Get In TouchStar

Get In TouchStar

Contact Us

Contact Us

Contact Us

Contact Us

Contact Us

Contact Us

Contact Us

Contact Us

Contact Us

Contact Us

Contact Us

Contact Us