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.

I don’t think this tool is interesting because of what framework it’s written in. It’s interesting to me because I built it under the same rigor I’d bring to anything, for an audience of exactly one person whose trust I genuinely could not afford to lose, because that person is me, in the middle of trying to change something real about how I live. I still write the decision down before I write the code, not because a design doc is impressive, but because it’s the only way I’ve found to catch myself lying to myself about why I’m building something a certain way. I still do only the engineering the goal actually calls for, and skip the rest, because effort spent on a problem that doesn’t exist is effort I don’t have left for the problem that does. That discipline isn’t something I put on for a code review. It’s the same discipline that got this tool built, and so far, kept a promise.