A modern, full-stack workout tracking application built with Vue 3 and FastAPI. Designed to be self-hosted, Rep Mate gives you complete control over your fitness data while providing an intuitive, mobile-first interface to track workouts, monitor progress, and achieve your fitness goals.
- Complete data ownership - your workout data stays on your infrastructure
- Privacy-first design - no third-party tracking or data sharing
- Docker-ready with single-command deployment
- Full control over backups, updates, and data retention
- Real-time workout logging with live timer and progress tracking
- Exercise library with customizable exercises and equipment types
- Set management with weight, reps, and completion tracking
- Collapsible exercise cards for better screen space management
- Progress rings showing exercises completed and sets done
- Comprehensive workout history with detailed exercise breakdowns
- Volume tracking with automatic calculations
- Date-based organization with visual workout summaries
- Muscle group tags for quick reference
- Exercise notes for tracking form cues and observations
- Global weight unit preference (lbs or kg) configurable in profile
- Per-exercise unit selection for mixed training styles
- Automatic conversions between lbs and kg
- Consistent storage (all weights stored in lbs, converted for display)
- Smart volume formatting with decimal precision for kg
- Dedicated cardio mode for treadmill and bike exercises
- Notes-based tracking instead of reps/weight
- Time and intensity logging via exercise notes
- Pre-loaded equipment types (Barbell, Dumbbell, Cable, Kettlebell, Bodyweight, Treadmill, Bike)
- Custom exercise creation with muscle group selection
- Equipment-based organization
- Archived exercise management
- Personal settings management
- Weight unit preferences
- Secure authentication with JWT tokens
- Vue 3 with Composition API
- Tailwind CSS for styling
- Vue Router for navigation
- Vite for fast development and building
- Heroicons for UI icons
- FastAPI for high-performance REST API
- SQLAlchemy for ORM
- Alembic for database migrations
- PostgreSQL for data persistence
- JWT for authentication
- Pydantic for data validation
- Docker & Docker Compose for containerization
- GitHub Actions for CI/CD
- Multi-platform builds (amd64, arm64)
- Kubernetes-ready deployment
- Docker and Docker Compose
- Node.js 20+ (for local frontend development)
- Python 3.11+ (for local backend development)
- Clone the repository:
git clone https://github.com/brianwalborn/rep-mate.git
cd rep-mate- Start the application:
docker compose up --build- Access the application:
- Frontend: http://localhost:5173
- Backend API: http://localhost:8000
- API Documentation: http://localhost:8000/docs
See SETUP.md for detailed local development setup instructions.
rep-mate/
βββ frontend/ # Vue 3 frontend application
β βββ src/
β β βββ components/ # Reusable UI components
β β βββ views/ # Page components
β β βββ composables/# Vue composables
β β βββ services/ # API service layer
β β βββ utils/ # Utility functions
β βββ Dockerfile
βββ backend/ # FastAPI backend application
β βββ app/
β β βββ models/ # SQLAlchemy models
β β βββ schemas/ # Pydantic schemas
β β βββ routers/ # API route handlers
β β βββ crud/ # Database operations
β β βββ auth/ # Authentication logic
β βββ alembic/ # Database migrations
β βββ Dockerfile
βββ docs/ # Documentation
βββ screenshots/ # Application screenshots
βββ docker-compose.yml # Multi-container setup
Rep Mate features a sophisticated weight unit system that allows you to:
- Set a global preference for lbs or kg in your profile
- Override the unit per-exercise during workouts
- Automatically converts kg to lbs for consistent database storage
- Displays weights in their original logged unit in history
- Calculates total volume in your preferred unit
Add contextual notes to any exercise in your workout:
- Track form cues and technique reminders
- Log intensity or difficulty
- Record cardio metrics (speed, incline, resistance)
- Notes persist with workout history
Keep your workout view clean and organized:
- Collapse exercises you're not currently working on
- State persists across tab switches
- Quick expand/collapse with a single tap
The application uses PostgreSQL with the following main tables:
users- User accounts and preferencesexercises- Exercise libraryequipment- Equipment typesworkouts- Workout sessionsworkout_exercises- Exercises in a workoutsets- Individual sets with weight, reps, and unit
Once the backend is running, visit http://localhost:8000/docs for interactive API documentation powered by Swagger UI.
Contributions are welcome! Please feel free to submit a Pull Request.
This project is open source and available under the MIT License.


