A web app for planning your weekly gym split. Pick a training template, customise your exercises, and save your schedule — all in one place. No spreadsheets, no notes app, no forgetting what day is leg day.
- Google Sign-In — one click, no passwords
- Training templates — choose from PPL, Upper/Lower, Full Body, or Bro Split as a starting point
- Fully editable schedule — rename splits, add/remove exercises, tweak sets and reps inline
- Drag to reorder — drag exercises up and down within a day to reorder them
- Rest day toggle — mark any day as a rest day; rest cards show a personalised message using your name
- Today highlight — your current day is always visually marked on the schedule
- 1RM Calculator — estimate your one-rep max using the Epley formula
- Calorie & Protein Estimator — calculates daily calorie and protein targets using the Mifflin-St Jeor formula, with support for different goals (cut / maintain / bulk) and cm or ft/in height input
- BMI Calculator — animated semicircular gauge showing your Body Mass Index across WHO-standard zones (Underweight / Normal / Overweight / Obese), with kg/lbs and cm/ft+in input support
- Multiple saved programs — save and switch between named training programs (e.g. "Bulk — PPL", "Cut Phase") via a program bar at the top of the schedule page; programs can be renamed, deleted, and created from scratch or a template
- Auto-save state — edits stay in memory until you explicitly save
| Layer | Technology |
|---|---|
| Frontend | React 19, Vite, Tailwind CSS v4, React Router |
| Backend | Node.js, Express 5 |
| Database | MongoDB (Mongoose) |
| Auth | Google OAuth 2.0, JWT |
- Node.js 18+
- A MongoDB Atlas account (free tier works fine)
- A Google Cloud project with OAuth 2.0 credentials
git clone https://github.com/TechGenius-Karan/Gym-Scheduler.git
cd Gym-Scheduler# Install server dependencies
cd server
npm install
# Install client dependencies
cd ../client
npm installCreate a .env file inside the server/ folder. Use server/.env.example as a reference:
MONGO_URI=your_mongodb_connection_string
PORT=5000
GOOGLE_CLIENT_ID=your_google_client_id
GOOGLE_CLIENT_SECRET=your_google_client_secret
JWT_SECRET=any_long_random_string
CLIENT_URL=http://localhost:5173MongoDB — get your connection string from Atlas: Connect → Drivers → Node.js. If you run into DNS issues with the mongodb+srv:// format on Windows, use the standard connection string (there's a "connecting behind a firewall" link in the same Atlas dialog that gives you the direct format).
Google OAuth — go to Google Cloud Console, create a project, and set up an OAuth 2.0 Web Client. Add http://localhost:5000/auth/google/callback as an authorised redirect URI.
Also create client/.env:
VITE_API_URL=http://localhost:5000Open two terminals:
# Terminal 1 — server
cd server
npm run dev# Terminal 2 — client
cd client
npm run devOpen http://localhost:5173 in your browser.
Gym-Scheduler/
├── client/ # React frontend
│ └── src/
│ ├── api/ # Fetch wrappers (authApi, scheduleApi, templateApi, programApi)
│ ├── components/ # UI components
│ ├── context/ # AuthContext, ScheduleContext
│ ├── pages/ # LoginPage, SchedulePage, ToolsPage
│ └── utils/ # dateUtils
│
└── server/ # Express backend
├── config/ # MongoDB connection
├── data/templates/ # Static JSON split templates
├── middleware/ # JWT auth middleware
├── models/ # Mongoose models (User, Schedule, Exercise, Program)
└── routes/ # auth, schedule, templates, programs
| Method | Route | Auth | Description |
|---|---|---|---|
| GET | /auth/google |
No | Redirect to Google consent screen |
| GET | /auth/google/callback |
No | OAuth callback, issues JWT |
| GET | /auth/me |
JWT | Returns current user |
| GET | /api/schedule |
JWT | Returns user's schedule or null |
| POST | /api/schedule |
JWT | Save or overwrite schedule |
| GET | /api/templates |
JWT | List all template summaries |
| GET | /api/templates/:id |
JWT | Full template with exercises |
Drop a .json file into server/data/templates/. It gets picked up automatically — no code changes needed. Follow the same shape as the existing templates:
{
"id": "your-template-id",
"name": "Template Name",
"description": "Short description.",
"days": [
{
"day": "Monday",
"isRest": false,
"splitName": "Push",
"exercises": [
{ "name": "Bench Press", "sets": 4, "reps": 8 }
]
}
]
}- AI coach — a side panel powered by Google Gemini that suggests a revised weekly schedule when you miss a session, with before/after preview and one-click apply
- Mobile app