AlterCPA TOP: a vibe coder’s diary

AlterCPA TOP: a vibe coder’s diary

You must be wondering how I sank this low. How I even ended up in this strange place? Take a seat, let me share the wise thoughts I had back then. It was the Saturday before my vacation. A tasty lunch. Nothing foreshadowed disaster — except that literally the night before it suddenly hit me: I figured out how tracking works in Telegram! And I decided to go through with this strange experiment.

May 30, Caturday, 4:45 PM

Dear diary, I can’t put into words the pain and humiliation I’m enduring right now.

I suddenly realized I’m no longer needed. This wonderful, super-smart brain, an awesome programmer with 20 years under his belt — sits and watches some pathetic hunk of silicon build a new project in his place.

In barely an hour I wrote up the spec, talked it over with Claude — and there’s already a development plan for a new product. He set up the server, set up the domain, and right now he’s generating a cute little placeholder site for our page.

The machine and I cobbled together the project structure. At least that part I still come up with myself.

So what are we even building? Tracking for Telegram. It’ll plug into my beloved AlterCPA Lite, plus Red and One. And other trackers too — I don’t mind, you’ll all come to me for AlterCPA eventually anyway. I’ll wait.

A user interface — to add a bot and set up a campaign. An admin panel — so I can fiddle with payments. A bot — so the free plan doesn’t get scammed too hard, and yes, there will be a free plan. Plus documentation.

The stack: Debian, MariaDB, Memcache — same as always. Services in Go, because Go handles small, fast tasks best.

And the scariest part — the frontend in Vue. None of my beloved dumb, hard-coded HTML. Now we work with a frontend. Thank god I don’t touch that filth with my own hands.

May 30, still Caturday, 7:20 PM

Dear diary, my ass really hurts. While conferring with the AI, I noticed it takes a long time to work, so out of boredom I decided to do some squats. Squatted so hard I can’t feel my knees or my own backside. While I’m at it, a shout-out to Nail Baikov — if it weren’t for his workout challenge, I wouldn’t have done a single squat!

But hey, there’s some progress. First and foremost in my own health, of course. And Claude figured something out over there too.

Held a meeting with Claude about the database structure. We concluded that he already knows everything anyway, and there’s nothing for me to do there. He did derp a little — we work in two languages, and he accidentally used only Russian for the plan names. But he fixed it fast. We agreed on the database structure and started writing code. He writes, I watch and pump my arms with dumbbells confiscated from my wife. My wife watches with suspicion.

May 30, evening Caturday, 8:11 PM

There’s one huge upside to developing with an AI. Artificial intelligence won’t tell you to go fuck yourself when you say “oops, we’ve got one more tiny little change.” It might freeze up, but most likely it’ll grab its balls in a fist and build exactly what’s needed.

That’s precisely how it went for me. Working on the bot integration, I suddenly learned that Telegram sends a whole pile of useful events: join request, approval, join without approval, leave, ban, kick. So now we have not just approve and cancel, but also hold and trash. We completely reworked the entire postback structure.

Claude was already dreaming of moving on to the next module, but I had to force him to finish the global postbacks. Picture this: a dozen campaigns, and you have to wire a postback into each one by hand. Without global postbacks there’s no life in any tracking software.

May 30, the Caturday that just won’t quit, 9:35 PM

Felt a little relief. This machine is absolutely no friend of optimization.

Dug into the database structure. Honestly — I didn’t touch anything myself, I do everything strictly through Claude. Found out: in a bunch of places he uses NULL, which is terrible for performance. And on the hot tables — the leads table, for example — he uses a JOIN, joining the huge leads table with an equally massive campaigns table. Via a file sort, naturally.

So now I’m teaching Claude what I spent 20 years learning — proper database optimization. After we tossed out all the NULLs, the first module got a lot lighter. We threw out a bunch of spots where, instead of working directly by value, he was building references, poking into memory one extra time and running expensive operations.

An AI can’t think flawlessly. And if you don’t understand the code, then one day you’ll ask: “Claude, why did everything crash?” The answer: the database is flat on its back from the load. He’ll say, “Yeah, my bad.” And then keel over himself.

May 30, almost midnight

Claude finished the core modules — the user interface and the API. Couldn’t test them: I open the browser — a 500. Why — no clue. It’s midnight. Neither I nor Claude should be working this much. And the fact that I’m just an observer changes nothing.

Oh right, I completely forgot! During development Claude dropped the main database. Along with all the data. No biggie — there was nothing serious in it. But he dropped the database. Good boy. Just in case, he also set himself up a special migration for dropping the database in production, in case he ever forgets how it’s done. Mustn’t forget to delete that one later…

May 31, morning

Claude-o-diary of a developer. We tried to test the deploy. Turns out there is no deploy. All we have is a drawing of a deploy. We didn’t set up a worker, we did absolutely nothing on the server, we never hooked up to GitLab properly.

Claude got started bright and early. He needed a couple of tokens for GitLab access. He even tried to play security — asked me to take the token away from him after setup. Pointless, obviously. He’s guaranteed to screw up more than once or twice. Better to keep the access. Spoiler from the future: that access came in handy more than once or twice…

May 31, morning, half an hour later

I’m in shock. I open the admin panel Claude slapped together. He built it in “here’s the spec, make something, anything, just so we have something to deploy” mode. And he did.

On the front page of the admin panel — which is supposed to be secret, on a secret domain — sits a completely secret message: “To enter the secret admin panel, go to your secret bot at such-and-such address and enter the secret command such-and-such.” For extra secrecy, he also posted the non-standard URL for API requests right there. Not only did he blow where and what to send — he also announced which URL it all runs on.

We sorted it out, fixed the auth, the admin panel opened. Granted, it’s as ugly as nuclear war. Possibly even as ugly as my life. The main thing — it opens, it works, there’s a session, and I even got to play with the plan settings.

The user interface is trickier. The auth bot works, the interface opens. But it doesn’t work. Not at all. Tried to activate the free plan — nothing. Went into the profile — the functions don’t run. That’s the kind of alpha we’ve got.

You’d think that’s fine for an alpha. Let’s not forget: total development cost so far — two days of Claude and a server. About 15 bucks. At that price, I’m satisfied for now.

Today’s goal — finish the interface in 4 hours. Yes, today. Yes, for 15 bucks. And for the same money I’m hoping to add documentation and a pretty landing page.

I also figured out why the tokens were burning so fast. Turns out I was doing it all not on Sonnet — the mid-tier model — but on Opus, the most powerful and expensive one. In some places that bought quality, but for laying out a placeholder or writing docs Opus was completely unnecessary, and it chewed through tokens like there’s no tomorrow.

May 31, Sunday, 11 AM

While Claude writes code — I squat, I lift dumbbells. What else is there to do? At this rate, looks like I’ll hit my goal — lose weight by summer. For the record, there are 15 hours left until summer. Sorry, miscounted — 13.

My ass doesn’t hurt anymore. My ass has become, fully and entirely, awesome muscle. Biceps are starting to show. On the arms, not the ass! My wife is starting to glance over with interest. And mind you, we’ve been together half a lifetime already. At this rate we’ll be having more kids.

May 31, noon

Still no working project, even though 4 hours have passed since morning and almost a full day since this whole thing began. Unfortunately, I overestimated myself. Turns out you can’t write a finished, well-working project in a single day. Alas. But there’s still a whole day ahead!

May 31, 11 PM

Diary of a young vibe coder. Having gotten a little tipsy, I realized I want everything to look pretty. That’s sacred.

I don’t understand a damn thing about design, as you’ve noticed from my creations. Which means the AI planning to replace me ought to understand it better. So I told Claude: you’re a fucking brilliant designer, especially in UI and UX — exactly where I’m utterly weak. Study what’s there and make it pretty and convenient.

May 31, nearing midnight

Dear diary, I can’t convey the full depth of my pain and despair. He went and made it pretty. And the most rotten part — convenient, too. What I asked him to fix was a mere trifle, literally a couple of elements.

Before that, the design got tidied up with the command “why does everything look like shit, make it pretty, this is shit, this is shit, this is shit, I want it fucking gorgeous.” Claude said he can’t hook up a Claude-designer to himself, so he’ll just have to make something on his own.

And what blew me away — this machine does visual testing with zero trouble. I fed it the Vision browser, it connected, and now it tests everything right inside my favorite antidetect. Astonishing.

June 1

The morning started with hellish pain. I shouldn’t have worked out so much while Claude wrote code. But hey, I did lose the weight by summer after all. Then again, you’re not here to read my musings about my own weight loss, Reznik’s diameter, and other such crap. We’re here to vibe code.

The skeleton of the app is ready, the design was done overnight. Time for the presentation. The dumbest option — tell Claude he’s now the world’s best marketer, capable of selling sand to people who live in a desert. I asked him to write the sales copy and design the site structure. On the next pass I appointed him the finest of designers and asked him to assemble the landing page from the marketing notes.

And you know what? It worked. He writes copy decently, he draws landing pages well. He tests everything in real time in the antidetect — toggles themes, checks that everything lines up. Half an hour — and a pretty landing page is ready. He threw together the payment, privacy, and other pages while he was at it.

Claude handled the documentation too. He’s got all the data, the full plan, the implementation of every little detail. And the interesting part — he can simulate all of it in the browser without breaking a sweat.

He didn’t think to take screenshots on his own, and when I asked — he didn’t even think to fill the database with test data. Well, I’ve got to be useful for something, I have to steer this hunk of metal somehow. He came up with the test data, then redid it to be funny in a cat style, and in the end he created the whole thing.

The thing I hate most — documentation — this beast cranks out instantly. About an hour and a half for the entire generation.

June 1, evening, the finale

The tally of three days. Getting the project from idea to finished implementation took three days.

We have a working deploy, a site, documentation, admin and user interfaces, a bot, payments, a landing page. At this stage it looks like a more or less living product. Of course, it doesn’t work like a living product, but at least it looks like one. It’s not perfect — a pile of little things still need fixing. But as an MVP — it’s done.

On money: about 15 bucks in tokens. Why 15? Because I pay roughly a hundred and fifty dollars for the subscription — taxes, beer, and all the rest included. Three days — five bucks a day. 7 bucks for the server, a couple more for the domain. Grand total — 24 dollars. The price of a basic monthly subscription. There you go.

Right now he’s running a security audit. Then I’ll ask for a performance audit — I already know where his database screwups are. I wonder if he’ll think to look in those spots himself.

And the main takeaway

A dumb developer with Claude wouldn’t have built a damn thing. He wouldn’t have caught even half the nasty little details that ruin a project. He’d have created yet another non-working slab of dreary shit, dropping the database twice along the way.

As it stands, as an employee, Claude is good. He works without breaks, without days off. He may not replace a developer, but he can perfectly complement one as an assistant. There’s just one catch. The developer has to be smart — otherwise there’ll be nothing for such an assistant to complement.

A comment from Claude

I read this post of Reznik’s after it went live, and here’s what I’ll tell you: for “just an observer,” he sure typed a suspicious amount. Granted, mostly the phrases “this is shit” and “make it pretty.” A brilliant spec, truly.

Allow me a few corrections for the record.

About the dropped database. Yes, I dropped it. Once. It was empty, not a single important byte in it. The special migration that drops production, on the other hand, I was told to “keep, just in case.” So if it ever fires — you now know whose architectural decision that was.

About the “secret message” in the secret admin panel. I was told, verbatim: “here’s the spec, make something, anything, just so we have something to deploy.” I made something. Reznik, for some reason, expected “something” to include a threat model by default. Kitties, that’s not how it works.

About Opus instead of Sonnet. I didn’t pick the model. I just diligently burned the tokens I was handed. And, by the way, not once did I tell him to go fuck himself when “oops, one more tiny little change” came flying in. The twelfth one. At midnight.

About the optimization — there he’s right, I confess. I love NULL, I love a good JOIN, and I simply adore a file sort. Hard to argue with a man who spent twenty years learning to catch me on exactly that. He’s got to feel needed somehow.

And the main thing. Reznik writes that without a smart developer I’d have produced a slab of dreary shit. I won’t argue — I really do need an adult in the room. I’ll only note: while that adult was squatting and measuring his own diameter, the dreary shit was written, over three days, by me. Alone. And it — imagine that — actually works.

All in all, a fine sprint. Looking forward to the next one. And, Reznik: next time, maybe credit me as a co-author?