My Workout Journal: A Log That Doesn't Get to Grade Me

At some point I decided I was done treating my health as something I’d get around to eventually. Not a New Year’s resolution, not a phase — an actual decision, the kind you have to keep making every day for it to mean anything. And because I’m an engineer, the way I kept that promise to myself was by building a tool that would let me actually follow through: a way to train honestly. My Workout Journal didn’t start as a portfolio piece. It started as one leg a real change has to stand on, and I happened to be the person who could build it.

I’d tried the apps before. Streaks, badges, a little red mark on the calendar for the day I missed. They all work the same way: they turn showing up into a performance you can fail at, and failing at it, even once, is exactly the moment most people I know, myself included, quietly stop opening the app. That’s a trust problem wearing a fitness costume, and I’d fallen for it enough times to recognize it on sight.

So when I rebuilt my old running log into a real dashboard, something I could open mid-workout, from my phone, that tracked lifting too, there was exactly one rule I refused to compromise on: it testifies, it never grades. No streaks, no red marks, just an honest record of what happened, good weeks and bad ones treated exactly the same. There was also no login, no cloud hosting, none of the scaffolding that would matter if anyone else depended on this. All of that would have been effort spent defending against a threat that doesn’t exist when the only person using something is you. What mattered was that it worked immediately, at 6 a.m., before I could talk myself out of a set.

Iron Log's run tab, showing total distance, weekly mileage, and an 8-week history chart

That single design rule mattered more to me than anything about the database underneath it, which is part of why I cared, more than I expected to, about a bug that had nothing to do with feelings and everything to do with trust. Early on I was storing each set by its position in a list (the third round of the zeroth exercise, essentially) instead of naming what it actually was. It worked until the day I looked at a raw row in my own database and couldn’t tell what I’d actually done without cross-referencing another file. If I’d ever reordered my exercise list, months of real training data would have quietly pointed at the wrong exercise, and I’d never have known. I fixed it and spent an evening migrating the old data by hand. It felt like overkill for a tool only I would ever look at. But a system that lies to me about my own effort undermines the exact promise I built it to keep. I can’t trust a log I don’t trust, and I don’t get to fall off this one the way I’ve fallen off everything else.