A modern, intelligent workout tracking app with advanced analytics for serious fitness enthusiasts.
GainStack helps you train smarter — not harder. It’s more than a workout log — it’s a smart PWA that tracks your progress, detects muscle imbalances, and optimizes rest periods automatically.
| Feature | Description |
|---|---|
| 🏋️ Smart Workout Logging | Track exercises, weights, reps, and sets with notes |
| 🧮 Integrated Plate Calculator | Auto-calculates barbell plates |
| ⏱ Context-Aware Rest Timer | Intelligent rest times based on rep ranges |
| ⚖️ Muscle Imbalance Analysis | Analyze left/right strength differences |
| 📈 Progressive Overload Tracking | Visualize strength progression |
| 📊 Strength & Volume Analytics | PR tracking, muscle group trends |
| 📱 Offline PWA Support | Works seamlessly without internet |
| 🌙 Dark Mode | Custom color palette and responsive UI |
Frontend
- React
- Tailwind CSS
- React Router
- Context API for global state
- PWA support + Heroicons + date-fns
Backend
- Node.js + Express.js
- MongoDB + Mongoose
- JWT Authentication
- bcryptjs for password hashing
git clone https://github.com/pborade90/gainstack.git
cd gainstack
npm run setupcd backend
# Add your credentials: in env
# MONGO_URI=your_mongodb_uri
# JWT_SECRET=your_jwt_secret
npm run devcd frontend
npm install
npm run dev- Frontend: http://localhost:5173
- Backend: http://localhost:4000
{
email: String,
password: String,
profile: { name, age, weight, height, fitnessLevel },
createdAt: Date
}{
title, load, reps, sets, unilateral,
leftLoad, rightLoad, notes,
user_id, completedAt
}| Method | Endpoint | Description |
|---|---|---|
| POST | /api/user/signup |
Register user |
| POST | /api/user/login |
User login |
| PATCH | /api/user/profile |
Update profile |
| GET | /api/workouts |
Get all workouts |
| POST | /api/workouts |
Create new workout |
| PATCH | /api/workouts/:id |
Update workout |
| DELETE | /api/workouts/:id |
Delete workout |
calculatePlates(100, 20);
// → [20, 20, 5, 2.5] per sideNo more math mid-workout. Supports multiple barbell weights.
if (reps <= 5) restTime = 180;
else if (reps <= 12) restTime = 90;
else restTime = 60;Scientifically backed rest logic with auto-countdown.
const imbalance = ((leftAvg - rightAvg) / Math.max(leftAvg, rightAvg)) * 100;“Your left arm is 8% stronger than your right.”
We love contributions!
- Fork the repo
- Create a feature branch
- Commit changes
- Open a Pull Request
Follow code style and use async/await.
- Push notifications
- Advanced analytics dashboards
- Rate limiting & performance caching
- Mobile native wrapper (Capacitor)
Made with 💪 by the GainStack