Project: Gym Vault

By Martin Moyér 4 min read July 11, 2025
Project: Gym Vault

From Frustration to Function: How I Built Gym Vault, My Own Workout Tracker

 

Over the past decade, my wife and I faithfully logged every strength training session at the gym, only to loose our data and workout history each time an app we relied on shut down. A couple of months ago when our latest tracker disappeared, I decided to build something we’d never have to leave behind.

Enter Gym Vault, a web app with Progressive Web App (PWA) support that feels at home on the phone and keeps workout history safe.

Why I Built It

We’d grown tired of switching between services and migrating data was a hassle at best or impossible at worst. When our latest tracker closed down, I realized that if I wanted a workout tracking app for the long haul, I’d have to build it myself. I wanted a tool that was straightforward, fast to load, and reliable, whilst having all the data under my control. The fact that I can expand and add new features whenever needed and completely customize every part of the experience was an added bonus – a flexiblity we didn't have before. 

How It Works

  1. Register & Login: A simple sign‑up via Django’s authentication.
  2. Start a Session: Choose a new workout or pick one of your own templates.
  3. Log in Real Time: Add exercises with autocomplete, record reps and weights, and see your last session’s numbers for quick reference.
  4. Review History: Completed workouts are saved in your archive and examine the anlytics under your profile for deeper analysis.

Under the Hood

Gym Vault is built on Django and PostgreSQL, with a mobile‑first interface using Tailwind CSS, vanilla JavaScript and PWA enhancements. For development I use Docker Compose, and I host the app on Railway which ensures consistent environments and straightforward deployments.

Security is handled by Django’s CSRF protection, secure session cookies, and environment‑based settings. The data model captures every set and rep, enabling simple analytics and historical comparisons without cluttering the UI.

Reflection

My initial gut reaction was to build this as a native iOS app in Xcode using Swift, but after some early research I realized the cost and learning curve were too steep for what I wanted – and I needed something up and running quickly. I settled on building Gym Vault as a web app with PWA support to get it as close as possible to a native mobile experience. By using Django and dockerizing the app, I had a working version deployed to Railway in less than two days. It was rough and not very fluid on the iPhone, so the next iterations focused on deeper PWA enhancements, touch‑interaction optimizations, and smoother transitions. Once navigation and core interactions felt solid, I added reusable workout and exercise templates, autocomplete search, analytics, and inline display of previous‑set data for quick reference.

Using Docker from day one made development, testing, and deployment hassle‑free, and hosting on Railway costs me less than $1/month.

This was a fun project – building something for myself and my wife that we’d actually use regularly, tailored exactly to our preferences. It was a great exercise in human‑centered design: every feature had a clear purpose tied to our gym workflow.

What's Next? 

The app is stable and in regular use. Since I managed to get hold of an export of our past five years of workouts from our previous tracker app, I'll add an import function to consolidate that history in Gym Vault. I'm also planning to add an export function and more advanced analytics.

Down the road, I might rebuild this app completely as an iOS app if additional mobile app development projects come my way and it makes sense to pay the annual fee for the Apple Developer Program. 

See the full project description with images and more info here: Gym Vault

Share: