Skip to content

Vibecoding Broke Me at 12,000 Lines

Stephan Birkeland 8 min read
A wall of tangled code on one side and a tidy node map of the same codebase on the other

A few nights ago I spent hours being a fucking idiot. I found myself caught in the same fckn loop, arguing in all caps with an AI about the same two bugs it kept un-fixing. I was screaming at the computer like I had no accountability in creating the fucking monstrosity that was my project. And I thought to myself, “How hard can this fucking be?”

Let me back up, I’m the kind of mess that needs an app to track his own life. I have three different calendars I can’t sync for the life of me, so I double and triple book dates all the time. I estimate time like a carnival fortune teller, full of confidence and guessing wildly blind.

Follow-ups and all the important shit I need to do outside of work? I suck at it. Meanwhile old useless trivia lives in my head rent-free.

On top of all that, I’m a social junkie, getting high off social events and jamming more shit into the week than I can handle, so I’m constantly fucking my work/life balance up the ass. Case in point: it’s 01:23 as I’m writing this, and the only thought in my head is “just a bit more and I can finish this fucking post, or else it will never get done.”

A TODO app will not fix me. Notes, lists, todo apps, I’ve churned through them all like a junkie switching dealers. I forget to use them, and when I do, they either don’t fit what I need or overwhelm me with the chaos I’ve created for myself.

So I’m building a project (and if this does not fix my shit, I will lose my fucking mind). In short, what I’m creating is an app to track my entire life: economy, appointments, follow-ups, routines, the works.

I have overengineered (vibecoded) the shit out of it. It’s written in Rust. Connect-RPC over HTTP/3, so QUIC, because HTTP/2 is apparently for peasants. Peer-to-peer sync between my devices over iroh, with a gossip protocol on top so they can whisper to each other. Capability-based auth tokens instead of a normal login. Six separate MCP tool servers, one each for calendar, email, events, household, projects and vitals, so an LLM assistant can sit on top and answer across all of it. FFI bindings so the phone app shares the Rust core.

The data model is complicated on purpose, because life doesn’t fit in a table, or so I told myself. Half of this I could not explain to you at gunpoint. I told the agent “use the latest and greatest” and nodded at the diffs. All of it, every last crate, to build a glorified todo list with a calendar stapled on.

Somewhere around the 12,000 line mark, shit goes sideways.

The Loop

Two bugs. That’s all it took. The session started as “quick fix before dinner” and ended somewhere much darker.

Sessions kept dropping after reconnect, and events kept duplicating after sync. I pointed the agent at the first one. Fixed! Then the second one surfaced. Fixed! And hello again, bug number one, you motherfucker.

fix: session drops after reconnect
fix: duplicate events after sync
fix: session drops after reconnect (again)
fix: duplicate events after sync (properly this time)
fix: session drops after reconnect (I am begging)

Round after round, same session, same two bugs trading places. Every round came with a confident explanation of the root cause and a clean-looking diff, and every round I bought it, because a few hours in I was no longer debugging.

I was at the slot machine. One more prompt. One more spin. A degenerate at 3 AM chasing losses, except the chips were my token budget and the casino lived in my terminal. And the whole time I was paying, by the token, to be told exactly what I wanted to hear, which I understand is roughly how escorts work too.

Somewhere in there I started screaming at the stupid computer, hailing down on the keyboard in all caps, telling a language model, in writing, that it was fucking with me ON PURPOSE. Until I finally lost it and just said “Fuck it, I’ll fix it myself.”

(I am getting pissed off again just writing this paragraph.)

Fuck It, I’ll Fix It Myself

I opened the editor exactly once, with the confidence of a big dick in the locker room. I sifted through a few files and folders, and about ten seconds later I felt like the dumbest motherfucker on the planet.

I had no idea where to even start.

Not “this is tricky”. These were files I had personally approved, and I could not tell you what a single one was for. Twelve thousand lines, and the honest count of the ones I understood was whatever I’d typed into the prompts myself. That was the moment it landed: the agent wasn’t the fuckwit in this relationship. I was the fuckwit, vibing away with fuck-all control, telling myself I could quit anytime. I closed the editor. One attempt. That was all it took to know.

Now, the reasonable move was obvious even mid-tilt. Scale out, get the AI to look at the bigger picture, make a proper plan, let it untangle its own mess. That would probably have fixed the loop in an afternoon. But I didn’t want the loop fixed anymore. I needed to know how the fuck this monstrosity actually works. That’s not a productivity decision. That’s pride. I’m fine with it.

For what it’s worth, the two bugs were exactly what you’d guess: both “fixes” were rewriting the same session state from different ends, a few files apart, each one silently clobbering the other. Completely obvious once you can see it. Completely invisible when your understanding of the codebase is a vibe.

Imagine two people fixing two holes in the same wall, from opposite sides, by pushing. Every time one pushes their hole flat, the other side pops out again. That was my two bugs. Nobody could see the other side of the wall. Especially not me, and I owned the wall.

So Now I’m Building a Map

For the past few days I’ve been building a way to learn how my own creation works. Not documentation, nobody reads documentation, including the guy writing it. A map. The tool leans on rust-analyzer (the thing that powers Rust support in your editor) to spit out a SCIP index, which is basically an inventory of every function and every place it gets used. From that it draws the codebase as a map I can click through: zoom out for the whole city, zoom in to one street, open a room and read a note about what it’s for. The notes are written by the same AI that wrote the code, which is either poetic or a war crime, I haven’t decided.

The part that actually got me: point at two modules and it traces the path between them. A whole evening of bug ping-pong, visible as one line through three hops. I stared at it for a solid minute, equal parts vindicated and embarrassed.

It’s rough, it’s welded to this one project, and making it a standalone thing you can run in any folder is still on the todo list, where it will probably age like everything else on my todo list. It doesn’t have a real name either. The working title is so generic I refuse to say it in public.

I made my LEGO friend draw me a treasure map of the giant castle they built while I stood next to them saying “yes, more towers”. Every room gets a sticky note saying what it’s for. Is it weird that I need a map of my own castle? Yes. Have you seen the castle? Also yes.

So where does that leave me. The todo app is still not done. The code map is also not done. I now have two unfinished projects instead of one, and slightly more insight into the first one than I had before. At least the next time something breaks in there, I’ll know which room the fire is in.

I don’t know if there is a fucking moral of the story here. It feels like there was a lesson to be learned, somewhere between the caps lock and the map. I don’t understand my own shit, and the AI let me get away with that right up until it didn’t. Or maybe it’s just a reminder to myself that I’m fucking stupid. Probably the last one. It’s late, 02:05 now, and I’m going to bed. At least I somewhat finished this post.


I’ll upload some images as an edit at a later date. Also yes, it’s been five months since the last post. Relationship ended, renovated the apartment, had a summer vacation, back at work now. No one fucking reads this far anyway, so that’s the update.

Share:
Stephan Birkeland

Stephan Birkeland

Consultant and developer based in Norway. Runs on coffee, curiosity, and a questionable number of side projects.

Keep reading

Phone controlling a terminal session on a remote computer
Up nextai

Claude Code Remote Control Killed My Phone Workflow