Over the weekend, I had the largest crisis of confidence I’ve experienced so far while building BrandCast and FamilyCast.

It wasn’t a funding issue. It wasn’t a customer complaint. It was just a Docker container, and it nearly broke me.

The Setup: A “Simple” Migration

Late last week, I was in the middle of a large refactor for the backend that serves both of my SaaS products. I’d made several architectural improvements and decided it was time to graduate from Cloud Run to Google Kubernetes Engine (GKE).

Why the move?

  1. Decomposition: The number of services is growing, and I wanted more discrete control over the services.
  2. Comfort Zone: I know Kubernetes. I’ve been running k8s clusters for years. Cloud Run is great, but as my infra needs grew complex, I wanted to pivot to the tool I knew best.

It should have been a standard weekend project. I spun up a local kubeadm single-node cluster for staging, set up my Cloudflare tunnels, and got ready to ship.

The Descent into Madness

I knew the migration wasn’t zero effort. Configuration injection is different, routing is different. But 36 hours later, I was screaming in all caps at my AI assistant.

My curse word ratio was approaching 1:4. It was ugly. My keyboard was definitely on the victim list.

The problem? I was stuck in dependency hell with my Node/Express backend. It was the longest game of whack-a-mole I’d ever played. I’d fix one missing library, and two more would break. I’d solve a path issue, and the build would fail.

I was asking Gemini to fix the errors. It would dutifully provide a fix. That fix would cause a new error. I’d paste that error back in. Gemini would provide a new fix.

We were looping. And because I was tired and frustrated, I didn’t see it. I was just blindly applying patches, hoping the next one would be the magic bullet. I was treating the symptoms. I tell my customers to never treat the symptoms.

Comprehension Debt Comes Due

I went to bed furious. I could run the app in dev (locally), or I could have a broken container. I couldn’t have both. What was next? Gravity becomes optional? The McRib tastes good? The world was turned upside down.

The next morning, with a fresh cup of coffee, the realization hit me.

I wasn’t pair programming.

My background is in Python and Go. I purposefully chose TypeScript for this application to force myself to learn it. But I wasn’t “learning” it right now. I was leaning on the AI to write get me through this migration.

I was deep in a rabbit hole of tree-shaking and transient dependencies that would have been obvious to a Node dev, but were opaque to me. I was suffering from Comprehension Debt.

Because I didn’t understand the fundamentals of the ecosystem I was working in, I couldn’t steer the AI. I couldn’t ask the right questions. I was building my backend service using Alpine Linux, but trying to run it in Debian.

Is that technically possible? Probably. Is it a nightmare when you have complex native dependencies? 1000%.

The Hard Truth About AI Coding

The AI didn’t catch the mismatch because I never gave it the full context. I was feeding it one error line at a time. It was optimizing for the micro-problem (the error message) while destroying the macro-solution (the architecture). Computers do exactly what you tell them to do. EXACTLY what you tell them. GenAI is great, but it’s no different at it’s core. If you tell it to fix a symptom, that’s what it does. It doesn’t make the cognitive leap to take a narrowly-focused question and understand that you need a larger perspective to actually make progress.

GenAI is a force multiplier.

  • If you are a 10x engineer in a language, it makes you a 20x engineer.
  • If you are a 0.1x engineer in a language (like I was that weekend), it makes you a fast 0x engineer.

It helps you dig the wrong hole much, much faster.

The Fix

Once I realized I was mixing OS paradigms, things started to click. I aligned my base images, and the external dependencies were soon green. A few hours later, after some additional lessons about turbo prune, and I had a functional system again.

The lesson wasn’t about Docker or Kubernetes. It was about humility. You can have 15 years of experience and still get wrecked if you skip the basics. And no amount of prompt engineering can save you if you don’t know what question you should be asking.