Skip to content
Pierre JonkerResume
← All work

Fitness training platform

Fit Track Hub

A gym trainer with many clients kept getting asked “what's my next exercise?”. Fit Track Hub lets trainers build a plan for each client, track progress and attendance, and lets clients log in to see their own programme.

Role
Solo: React frontend and Node.js API
Context
Built during my Compuways internship, 2024
Code
Frontend code ↗Backend code ↗Watch the demo ↗

The problem

A personal trainer with a full client list was answering the same question all day: what's my next exercise? Plans lived in their head and in chat messages, and nobody tracked attendance or progress properly.

Fit Track Hub gives every client their own programme to log in and check, and gives the trainer one place to plan, track and keep in touch.

What I built

  • Workout plans per client, with progress tracking and attendance records
  • Role-based access for super admins, admins, trainers and clients, each with their own dashboard
  • Welcome, reminder, birthday and news emails sent through a background queue
  • In-app notifications, with a Socket.io connection for live messages
  • Progress exports to CSV and PDF, and a password-reset flow with single-use tokens

How it works

Email through a background queue

Emails don't send inside the web request. The API adds them to a Bull queue backed by Redis, and a worker delivers them through Resend, so a slow email provider never holds up the person using the app.

Role checks in middleware

Every protected route goes through a protect middleware that verifies the JWT and loads the user, then admin or super-admin guards where needed. Permissions live on the server, so hiding a button in the UI is never the only safeguard.

Scheduled jobs

node-schedule runs the recurring work: reminders at 09:00 every day, birthday messages at midnight, and monthly resets of attendance and calorie data.

Real-time updates and reports

A Socket.io server runs beside the Express API for live messages. Progress data exports to CSV with json2csv, or to a PDF generated on the server with pdfkit.