Gym Vault
What It Is
Gym Vault is a Django-based web application that serves as a workout tracking system for strength training. It allows users to create, track, and manage their gym workouts with a focus on exercises, sets, reps, and weights. The application features a mobile-first design with an intuitive interface that lets users start workouts, add exercises in real-time, track their progress, and maintain a complete history of their fitness journey. It includes user authentication, workout templates for quick setup, and detailed analytics to help users understand their progress over time.
Why I Built It
After over a decade of using various gym tracking apps with my wife – logging weights, reps, and workouts consistently – we kept running into the same problem: the apps would eventually shut down or become unsupported, forcing us to start over and migrate our data (when possible). When our latest app was discontinued a couple of months ago, I’d had enough. I decided to build and host our own solution – one we could rely on long-term, hence Gym Vault was born. I wanted something that was fast, simple, and reliable – just a tool that does the job and keeps doing it.
How It Works
1. Users create an account and log in to access their personal workout space
2. They can start a new workout session, optionally naming it or using previously saved workout templates
3. During the workout, users add exercises by name (with auto-complete from their exercise history)
4. For each exercise, they track individual sets by logging reps and weight used. Previous reps and weights are shown if applicable
5. The system automatically creates templates from used exercises and workouts for quick future access
6. Users can complete their workout, which moves it to their workout history
7. The application provides detailed historical views showing progression over time
8. A profile page displays analytics including total workouts, average duration, and monthly trends
Tech & Implementation
Backend: Django with PostgreSQL for production and development
Frontend: HTML/CSS with Tailwind CSS for responsive, mobile-first design. JavaScript for some interactive elements
Authentication: Django's built-in user authentication system with custom forms
Database: PostgreSQL with proper relationship modeling between users, workouts, exercises, and sets
Deployment: Docker containerization with docker-compose for development, Railway for production hosting
Security: CSRF protection, secure session management, environment-based configuration
Mobile Optimization: PWA-ready (Progressive Web App) with touch-friendly UI and bottom navigation.
Development Tools: WhiteNoise for static file serving, Gunicorn for WSGI, dj-database-url for database configuration
What Stands Out
The application emphasizes user experience through thoughtful design choices like template systems that learn from user behavior, creating reusable workout and exercise templates automatically – also featuring auto-population of previous exercises. The mobile-first approach includes a bottom navigation bar, large touch targets, and smooth animations that make it feel like a native mobile app. The dark interface with neutral colors and subtle accents provides optimal readability in various gym lighting conditions. The data model is designed to capture workout progression with historical comparisons, showing users how their current performance compares to their last session. The application also features a clean separation between active workouts and completed history, allowing users to focus on their current session while maintaining easy access to their entire fitness journey to make quick checks and comparisons.
What I Learned
Early on I settled on building Gym Vault as a Web App with PWA support to get is as close as possible to a native-like mobile app experience, without going through the hassle and cost of enrolling into the Apple Developer Program ($99/year). I learned valuable lessons about mobile-first web development, particularly around touch interaction design and progressive web app principles. The experience taught me the importance of considering the user's context - in this case, someone actively working out in a gym environment where simplicity and speed are crucial. I also got to try out deploying an application to Railway and deploying my Docker application was really straightforward and easy. Most importantly, I learned how to balance feature richness with simplicity, creating an application that's powerful enough for serious fitness tracking while remaining accessible and quick to use during actual workouts.
Resources
Django Documentation: https://docs.djangoproject.com/
Tailwind CSS Documentation: https://tailwindcss.com/docs
PostgreSQL Documentation: https://www.postgresql.org/docs/
Docker Documentation: https://docs.docker.com/
Railway Deployment Guide: https://docs.railway.app/