Essay · Products (live, real users)
Workout Logger
A workout logger that's as fast as a notepad to log, and as rewarding as a year-in-review to look back on. Local-first, installable, works offline.
I have years of gym logs and I have tried most of the apps. They all make the same trade: the ones that are fast to log are joyless to look back on, and the ones that are rewarding to look back on are too slow to use mid-set. I wanted both, so I built it.
Try it at lift.built-by-bobby.com — it installs to your home screen and runs entirely on your phone.
The idea
Two screens, two jobs, and they never get in each other's way. The log screen is deliberately calm and notepad-fast: it is session-first, and it prefills your last set for an exercise so repeating it is a single tap. All the personality — streaks, records, a Wrapped-style year-in-review — lives on a separate Progress tab, so it is a reward you go and look at, never noise on top of the thing you are doing between sets.
The approach
It is local-first. Your data lives in the browser (IndexedDB), so logging works instantly and fully offline — in a basement gym with no signal, it does not care. It is an installable PWA, so it sits on the home screen and behaves like a native app without an app store in the way.
The data model stays deliberately dumb — weight times reps times sets, with a timestamp per set — and the cleverness is layered on top of it. Supersets are inferred from how close sets are in time rather than baked into the schema. Personal records use a repeat-to-confirm rule, so a fluke entry or a mislabelled machine does not mint a fake PR. Strength is shown relative to your own baseline for each lift, and venue-sensitive cable and machine lifts are excluded from records so that simply changing gyms does not look like a sudden jump.
Your data stays yours, and that is a feature rather than an afterthought. CSV import and export are first-class, and there is an optional one-tap backup to your own Google Drive — it lands in your Google account, not a server I run. There is no backend and no account on my side: nothing for me to see, lose, or leak. Clear your browser or pick up a new phone, and your training is one sign-in away.
The stack
Preact + TypeScript, built with Vite, with a hand-written service worker for offline and updates — the whole JS bundle is around 31KB gzipped. State persists to IndexedDB, with the Google Drive backup running entirely client-side (no server, no secrets). Each build stamps its own version, and the app quietly checks for a newer one on load so there is never any manual cache-busting.
Where it is
It is live and open, built primarily for me but free for anyone to use. The public version starts you on a clean slate — your own history, your own records — rather than seeding mine.
The history this is built to capture is the same one I cleaned up and plotted in Five Years Under the Bar — five years of training across two countries and two apps, turned into interactive charts of consistency, strength and volume. The logger is the front end of that story: the dashboard is where it ends up.