Four Years and One Afternoon

Share X LinkedIn Facebook WhatsApp
Back to Life in ProductionFour Years and One Afternoon
TL;DR

This site ran on an aging free template for four years, barely touched, because every small change carried a manual git tax. One Claude subscription and one long conversation later, it lost jQuery, shed over 300 KB, got accessible, dropped its median page load from 1.3 seconds to 385 milliseconds, and stopped looking like a template. Same taste, a much shorter loop.

Changing my profile picture used to take three commits and two merges.

I am not exaggerating. It is in the git history. Change picture, then Merge branch 'change-profile-picture' into development, then Merge branch 'development'. A small ritual, performed by hand, to swap one image.

That was the rhythm of this site for four years.

The site that sat still

The first commit landed on March 21, 2022. It was a free HTML template. jQuery, a stack of jQuery plugins, Bootstrap 3, a parallax library, an animation library, a full screen loading spinner, and a vendor prefix baked into every single id and class.

It worked. So I mostly left it alone. Maybe that was laziness. Maybe the changes just never felt worth the time. Probably both.

The git history reads like a heart monitor on a quiet night. Sixty commits in the first month while I set it up, then long flat lines. September 2022 to March 2023, nothing. June to December 2024, nothing. March 2025 to January 2026, nothing. When a change did happen, it was tiny. "Change site title." "Fix description." "Remove unused images."

And every one of those tiny changes paid a tax. Branch, commit, merge into development, push, test, merge into main, push, sync back. Out of 319 commits in this repo, 142 are merge commits. Nearly half of everything I ever did here was just moving changes from one branch to another, by hand.

🧾 The deploy ritual for a typo

Imagine running your full production release process, change ticket and all, every time you fix a single typo. That was my workflow for a portfolio site. The ceremony was bigger than the change. So the changes stopped coming.

The result was a time capsule. A 2022 template, still loading jQuery in 2026, still shipping a 514 file flag icon library I never used, still animating things on scroll that nobody asked for. It was not broken. It was just old, and quietly heavy, and I had no appetite to spend a weekend fixing what was not on fire.

One conversation

It started on a slow afternoon, a boring World Cup group game on in the background. I had a Claude subscription I was barely using. On a whim I opened my laptop and thought: let's see what Claude Code can actually do.

I did not hand it a spec. I talked to it the way I would talk to a sharp colleague sitting next to me. "Go through the site and remove anything unused." "What do you think of the hero image?" "This feels like too much red." "The first scroll jumps to the top, what is happening?"

It went and looked. It found the dead code I had forgotten. It explained why the scroll was broken before fixing it. It pushed back when I asked for something that would hurt, and it told me when an idea was good.

That last part matters more than the typing. The bottleneck on a personal site is never the typing. It is the activation energy. It is the gap between "I should really clean that up" and actually doing it on a Tuesday night.

That gap collapsed.

The afternoon

Here is what came out of it, in roughly the time it used to take me to change a profile picture and merge it twice.

  • jQuery and its whole plugin stack, gone. The site is now two small vanilla JavaScript files.
  • Bootstrap's CSS trimmed from 134 KB down to 23 KB, keeping only the grid I actually use.
  • The animation library, the parallax, the scroll reveals, the loading spinner, all removed. The site renders instantly now, on purpose.
  • Images served as AVIF with fallbacks. A work thumbnail went from 92 KB to 26 KB.
  • Real accessibility. Skip links, focus rings, semantic landmarks, reduced motion respected.
  • Structured data, clean meta, a sitemap that updates itself on merge.
  • The vendor prefix stripped out of every id, so the URLs are finally just #about and #work.

The raw numbers from that stretch:

19 commits, 577 files changed +890 -98,722

Most of those deletions were dead weight I had been carrying for years without noticing.

The site you are reading this on is the result. It is lighter than it has ever been, and for the first time it does not look like a template.

The receipts

I did not want to just claim it was faster, so I checked. Cloudflare had been quietly measuring the old site the whole time, so I have real before and after numbers.

  • Page load time: 1.3 seconds, now 385 milliseconds. A 70.4% drop.
  • First Contentful Paint: 733 milliseconds, now 326 milliseconds. A 55.5% drop.
  • Largest Contentful Paint: 1.2 seconds, now 346 milliseconds. A 71.2% drop.

It is not a clever trick. It is what happens when there is almost nothing left to load. No jQuery, no plugin stack, no animation library, a tenth of the CSS. The browser stopped doing work, so the page stopped making you wait.

Responsiveness tells the same story. Cloudflare scores every click, tap, and keypress for how fast the page reacts, and 100% of them came back in the good range.

✈️ Not a vending machine, a co-pilot

The mistake is to picture AI as a vending machine. Insert prompt, receive code. That is not what this was. It was closer to flying with a co-pilot who knows the systems cold. I still chose the heading. I still said the red was too loud and picked the slate. I still cropped my own face. The taste stayed mine. The grind did not.

What actually changed

It is tempting to say the lesson is "AI writes code now." That misses it.

The honest lesson is about the cost of doing the right thing. For four years, the boring correct work, the accessibility, the dead code removal, the dependency cleanup, never happened. Not because I did not know it should. Because the cost was a weekend I never wanted to spend.

When that cost drops to a conversation, the math flips. Suddenly the right thing is also the easy thing. The activation energy is gone, so the work gets done.

So let me put a number on it, because I like numbers. My time runs about 100 euros an hour. Doing all of this by hand, the rewrite, the cleanup, the accessibility pass, the image pipeline, the testing, would have been a focused week. Call it 40 hours. That is 4,000 euros of my time, if I had ever found the week, which in four years I never did.

The actual cost? One afternoon. Call it six hours of my attention, so 600 euros of my time, plus a 21 euro monthly subscription. That is 621 euros against 4,000. The tool that did the heavy lifting cost less than a nice lunch.

I still make the decisions. I still own the taste, the voice, and every call about how this should look and feel. What I no longer own is the tax. The branch dance, the manual merges, the archaeology through old code to remember why something was there. The half hour lost fighting Photoshop to crop one image, then giving up and begging my wife to remove a background for me.

The illustration at the top of this post is the same trick. I described it in a sentence, generated a handful, and picked the one I liked. The taste was mine. The hours in an image editor were not.

Some of the repetitive parts I turned into my own commands. A new-post command that scaffolds the files for an article, a preview command that spins up a shareable link, a cleanup command that sweeps away branches once they are merged. The workflow that used to be a careful ritual is mostly a single keystroke now.

And funnily enough, by the end I caught myself rushing through the day job so I could get home, open my personal laptop, and talk to Claude about my own site.

My profile picture used to cost three commits. The rewrite cost an afternoon. That is the whole story, and it is also, I think, where a lot of our work is heading.


Back to Life in Production