I couldn't figure out what to do at the gym

Not the motivation part. I was there, ready to go. But standing in front of a squat rack trying to program a workout from scratch? Every single day? I had writer's block for workouts

So I did what any engineer would do. I opened ChatGPT and said "build me a workout generator"

That little annoyance is the reason everything else in this story exists. I just didn't know it yet

The First Version Was Barely a Thing

October 2025. Vite + React. A movement library, a randomizer, some CSS. It would spit out a CrossFit WOD so I didn't have to think. Deployed to GitHub Pages. Done

Except it wasn't done. It was never done

I showed it to a couple friends

"Only CrossFit?"

That one question changed everything. Because the answer was obvious - the template system I'd built wasn't CrossFit-specific. It was a workout structure. AMRAP, EMOM, Tabata, For Time - those are just formats. Swap the movements and you've got a gym workout. Or a home workout. Or yoga. Or calisthenics

Same engine. New templates and movements for each type. By November I had seven workout types and the thing had a name - WodSpark

The Workouts Were Meh Though

Generating random workouts is easy. Generating good ones is a completely different problem

I'd get a workout and it would be all pull. Deadlifts into pull-ups into rows. My lats were filing a restraining order. So I built a push/pull balancing algorithm - track what the workout is loading and distribute it

Then grip. Two consecutive grip-heavy movements in the same workout and your forearms are toast by round three. Nobody programs like that in a real gym. So the generator shouldn't either

These weren't features on a roadmap. They were problems I found by actually using the thing every morning. The app got smarter because I kept showing up

01What daily use taught
GENERATE
BALANCE
REFINE

Then It Took Over My Life

The timer came next. Once you're using your own app for real workouts, you need a real timer. Then the Morning Storm - a daily challenge with a global leaderboard. Then workout history. Then shareable workout cards. Then a dual-skin CSS system because desktop and mobile needed completely different vibes

By December I was 82 commits deep in a single month. Here are some actual commit messages:

"Millions of updates."

That was the whole message. What updates? Who knows. Not me, apparently

"Zustand updates. Woof!"

I was migrating state management mid-feature while building a timer, redesigning the desktop layout, and fixing a GPU crash. At the same time

"Before social flare. Major UI updates. It's so pretty :)"

"Finally fixed the horrible regenerate issue."

"Massive desktop redesign." "Massive desktop redesign."

Two commits, same message, same day. Two completely different redesigns

The app was legitimately good. The way I was building it? Absolute mess. And that mess wasn't a side detail. It turned out to be the whole point

Swipe Animations While Grocery Shopping

One of my favorite moments though - I wanted chained swipe animations. Workout cards that cascade into each other for a single visual wow. The timing had to be perfect or the whole thing felt janky

Getting that right manually would have been a nightmare. But Claude Code with Chrome MCP could see the browser. So I added a few timing logs to the terminal, told Claude what I wanted, and left to go grocery shopping

Came back with groceries. The animations were done. Flawless timing, every transition chained exactly right

That's when I realized the tools had leveled up. But my process hadn't. And the gap between those two things was about to get painful

Vibe Coding Was Killing Me

Here's the thing nobody tells you about AI-assisted development. It's not the speed that gets you. It's that you can't trust what comes back

Vibe coding is throwing things over the wall to see what sticks. You ask for something, you get something back, and it's almost never what you asked for. So you fix it. Then you fix the fix. Then you fix what the fix broke

I was building a page and it was endless. The brown color came back, so I said swap it to the grey glass. Then I said it again. Same message, over and over.

The alignment is off.
This button does nothing, why is it even there? I like the intent but I didn't ask for it.
The workout card doesn't show everything I asked for, can you change this?

Fix this. Fix that. Fix this again. Every single thing was after the fact. I wasn't building. I was babysitting

And then it hit me. I shouldn't be fixing all of this. If I planned everything up front - if I prepared for all the stuff I keep having to fix afterward - I'd never have to fix it in the first place

Something had to change

The Power Upgrade

So I tried it. Instead of throwing a prompt over the wall and cleaning up the mess, I spent 30 minutes planning an entire feature in detail. Every chunk. Every file. Every acceptance criteria. All the stuff I'd normally catch after the fact, decided up front

Then I let the AI build it

And it came back right. The first time

That's the whole insight. Stop babysitting. Start planning. The back-and-forth disappeared because I'd already answered the questions before the AI ever had to guess

I built a system around it - one that breaks features into stories, stories into chunks, and chunks into implementation specs detailed enough that an AI agent can build them autonomously. Validation gates catch quality issues. Checkpoints track every change. Tests gate every build

02What replaced vibe coding
PLAN
BUILD
VALIDATE

The first time it touched WodSpark was February 18th. And the git history changed overnight

Before:

"Millions of updates." "Fixed mobile center load." "Lots of bug fixes!" "CSS updates"

After:

"checkpoint: before chunk 1 - fix-desktop-shuffle-overflow" "checkpoint: before chunk 3 - premium-history-cards" "complete: enhance-history-empty-state (story 5/8)"

Every change tracked. Every feature planned. Every commit meaningful

The Numbers

PeriodCommitsVibe
Oct 202538"first commit" energy
Nov 202568feature avalanche
Dec 202582beautiful chaos
Jan 202681great features, messy process
Feb 202644structured, intentional, shipped

February had fewer commits than any other month. And it shipped more. Desktop polish cycle - 9 stories, all completed. Shareable workout cards. Premium history cards. App Store and Google Play submission. Privacy policy. Bug fixes with actual test coverage

44 commits that did more than the 82 in December. That's the part that still gets me

WodSpark Is on the App Store Now

The app that started because I couldn't figure out what to do at the gym is on the App Store. 7 workout types. 75+ formats. Push/pull balancing. Grip-aware generation. A daily challenge with a global leaderboard. A timer with haptic feedback. Offline support. Push notifications

All 7 native features passed device testing on the first try

WodSpark - workout builderWodSpark - generated workoutWodSpark - Morning Storm challengeWodSpark - workout timer
Download WodSpark on the App Store

From One Project to All of Them

Here's what's wild though

When I was building WodSpark, that was it. One project. All my attention. And I still couldn't keep it organized. That's the whole tell. The mess wasn't because I was spread thin. The mess was the process

The system changed the math completely. Plan a feature in detail, let agents build it, use that time to plan the next one. Everything staggered, everything spinning

Since building craft I've shipped a personal site with scroll animations and a blog. A knowledge mining system with RAG pipelines and creator personas. An expert council that routes technical questions across domains. A memorial chatbot built from 27,263 of my mom's text messages. Even the way I train now runs through the same shift. And the plugin itself keeps getting better with every project that runs through it

All of it managed through the system that started as "please stop me from committing 'Millions of updates'"

Not because I found more hours. Because the hours I had started compounding

I look at that git log now and the whole story is right there. "Millions of updates" was me building blind. The clean commits after are just what it looked like once I stopped