Case study
Loadline Web
A client-side analytics dashboard built around Hevy workout history.
Visit projectTech stack
- React
- TypeScript
- Vite
- TanStack Query
- Zustand
- Recharts
- Hevy API
- Supabase
- Vercel
- dnd kit
A better view of the training data I already had
I logged every workout in Hevy, but reviewing progress meant opening exercises one at a time or moving the data into a spreadsheet. I wanted one place to answer a few practical questions. Was I getting stronger? Which muscles was I neglecting? How consistent had I actually been?
Loadline Web pulled the same history into a configurable dashboard. It showed estimated strength trends, a training calendar, weekly volume by muscle group, bodyweight changes and a split builder that could analyse Hevy routines before I ran them. Users could also reorder, hide and collapse widgets to keep the page focused on what they cared about.
The analysis ran in the browser
This was the first version of Loadline, before the iOS app, PowerSync or an on-device database. Users connected a Hevy API key or uploaded a Hevy CSV export. TanStack Query handled requests and caching, then a shared transformation layer converted both sources into the same workout model.
All of the analysis happened on the client. React rendered the results as dashboard widgets, while Zustand kept layout and display preferences between visits. Supabase was added later for accounts and saved configuration. The calculations still ran in the browser.
- Hevy API or CSVRaw workout history
- NormalizeOne workout model
- AnalyseTrends, volume and consistency
- RenderReact dashboard widgets
Making different workouts comparable
Raw workout records were not ready for useful charts. Weighted and bodyweight exercises needed different calculations. The same exercise could have several sets on one day, custom names did not always have a muscle group, and dates had to respect the user's local timezone.
I reduced each exercise and day to its best performance. Weighted lifts used an estimated one-rep max, while bodyweight movements tracked their highest rep count. An exponentially weighted moving average smoothed the trend without hiding recent changes. Exact exercise IDs handled known movements; name matching and user overrides covered custom exercises.
The same normalized data powered weekly set counts, primary and secondary muscle contributions, consistency scores and split analysis. One processing layer kept those numbers consistent across every widget.
A dashboard people could rearrange
Each dashboard section lived behind a small widget registry with its own view and data hook. Adding a new view did not require rewriting the page. The dashboard simply rendered the widget IDs a user had enabled.
dnd kit handled reordering, and Zustand persisted widget order, visibility and collapsed state in the browser. That structure let the product grow from a few personal charts into a dashboard that different lifters could configure around their own routines.
Shipping the public alpha
I shared an early demo in the Hevy community and it reached 16,000 views. People asked to use it, so I turned the prototype into a public product. The current repository was created on July 5, 2025, and the alpha went live on Vercel on July 12.
Feedback arrived immediately. Some CSV imports produced zero weights. Imperial settings leaked kilograms into the split builder, and routines that did not follow a seven-day week exposed assumptions in the first scheduling model. The next rounds added stricter import validation, better handling for bodyweight and assisted lifts, multilingual exercise matching and cycle-based splits.
What the launch produced
- 8,938 visitors over the last 12 months
- 25,829 page views across the web product
- 218 votes on the public alpha launch in the Hevy community
The response showed that people wanted more than a workout log. They wanted help reading the history they had already collected. It also exposed a product problem: a browser was a poor place for something tied so closely to the gym.
Why I rebuilt it for iOS
The dashboard kept expanding. I added Withings, an AI coach, a split builder and plans for more integrations before the core habit was settled. People could get value from the analysis, but few wanted to open a browser while training.
I kept the analytics ideas and rebuilt Loadline as its own native workout tracker. The iOS app moved logging and analysis into the same product and added the offline foundation that the web version never had. If I revisited the dashboard, I would keep it focused on read-only analysis for people who already log somewhere else. Import should be quick, and every view should answer a question worth returning for.