Back to Projects

Personal Training Studio

DjangoDjango REST FrameworkPostgreSQLCeleryRedisAstroVue 3TypeScriptFlutterStripeFirebaseDocker

Overview

A booking, training and coaching platform for a personal-training studio in Italy. Members use the Flutter app (iOS and Android) to book shared or private sessions with credits, follow weekly training plans with video exercises, log workouts and meals, and talk to their coach. Trainers and admins use an Astro + Vue web panel to manage the calendar, appointment requests, clients, services, credit packages, subscriptions and the exercise library. Both run on one Django REST API with Celery workers for reminders, notifications and syncing with the gym's management system.

Screenshots

Personal Training Studio — screenshot 1Personal Training Studio — screenshot 2Personal Training Studio — screenshot 3
Personal Training Studio — screenshot 4Personal Training Studio — screenshot 5

Objectives

  • ▸ Replace phone and chat-based booking with self-service booking in an app
  • ▸ Give trainers one place to manage schedule, clients, packages and training content
  • ▸ Let members follow their training plan and track progress between sessions
  • ▸ Keep members engaged through reminders, a community feed and a points leaderboard

Architecture

Monorepo with three apps behind one API. Backend: Django 4.2 + Django REST Framework split into domain apps (booking, scheda/training plans, training, nutrition, payments, subscriptions, chat, community, leaderboard), JWT auth, PostgreSQL (migrated from MySQL), Redis and Celery with beat for scheduled jobs, OpenAPI docs via drf-yasg. Admin panel: Astro 4 (SSR) with Vue 3 + TypeScript, Tailwind, FullCalendar and i18n routes (Italian, English, French). Mobile: Flutter with Provider, Freezed models, GoRouter and a repository layer with Hive caching. Deployed with Docker Compose behind nginx on a VPS.

Key Features

  • ▸ Calendar booking for shared and private sessions, paid with credits, plus an appointment-request approval flow for staff
  • ▸ Staff calendar with week, 3-day and day views, per-trainer filtering and Google Calendar sync
  • ▸ Credit packages, subscriptions and in-app payments with Stripe
  • ▸ Weekly training plans with a library of 350+ exercise videos, set/rep/weight logging and workout history
  • ▸ Per-exercise 1RM tracking with bulk updates by muscle group, used to suggest working weights
  • ▸ Meal logging by text or photo with AI-assisted nutrition analysis and Open Food Facts data, plus AI-generated workout plans
  • ▸ Points leaderboard based on logged reps, sets and weight
  • ▸ Community blog with likes and comments, and real-time coach chat
  • ▸ Push notifications (Firebase), and SMS/WhatsApp messages for sign-up, password reset and appointment reminders
  • ▸ Sync of members and memberships with the gym's existing management system (Sportrick)
  • ▸ Admin dashboard with customer, booking, revenue and engagement metrics

Challenges

  • ▸ Keeping the API contract, user roles and feature flags consistent across the Django, Astro and Flutter codebases
  • ▸ Modelling credits, packages and subscriptions so shared and private sessions consume the right balance
  • ▸ Syncing members with an external gym-management API without making booking depend on it
  • ▸ Running reminders and notifications on schedule with Celery across timezones
  • ▸ Caching data in the mobile app for speed without showing stale bookings or balances
  • ▸ Migrating the production database from MySQL to PostgreSQL

Outcomes

  • ▸ Studio runs bookings, packages and training plans from one system instead of chat and spreadsheets
  • ▸ Members book, train and track progress from a single app on iOS and Android
  • ▸ Trainers manage schedule, clients and the exercise library in one web panel
  • ▸ Feature flags let the same codebase be deployed for other studios with different modules enabled