Back to all posts
6 min read

The Bloat Industry: 30,000 Lines to Count Pageviews

The Bloat Industry: 30,000 Lines to Count Pageviews

I needed analytics for this blog. Nothing exotic. Pageviews, referrers, basic country data. The kind of thing a spreadsheet could handle if you felt like it.

Here is what the industry offered me:

Plausible cloud: $9/month to start, $69/month at 1M pageviews. Clean UI. Reasonable product. Not mine.

PostHog self-hosted: 8 containers. ClickHouse, Kafka, ZooKeeper, Redis, MinIO, PostgreSQL, and two PostHog processes. Minimum 4 vCPU, 16GB RAM. For counting pageviews. Kafka. For a blog. ZooKeeper, watching over your visitor counts like a distributed consensus problem.

Matomo: PHP + MySQL. Dozens of plugins. Cookie banners. A whole compliance surface area for a personal blog.

Umami: Next.js. React. Hundreds of npm packages to render a bar chart.

None of these were what I needed. All of them were what someone else needed, bundled into what I was offered.


So I Built Kaunta

seuros/kaunta. Go + htmx, then swapped to Datastar when I found it even lighter. One binary. 15MB precompiled in GitHub Actions. Runs on a Raspberry Pi, a NAS, in a VPS with 256MB RAM, theoretically in a fridge if the fridge has a network interface.

It does what I need. I know every line of code in it. Every line.

That last part matters more than the binary size.

When Plausible has a bug, I open a GitHub issue and wait. When Kaunta has a bug, I know exactly where to look because I wrote exactly what’s there. The ownership is complete. The surface area is mine.

This is not ideology. It’s a practical preference: I’d rather understand a small thing fully than depend on a large thing partially.


The 30,000 Line Rails Blog

Here is a pattern I’m seeing more and more.

Someone with no prior coding background discovers LLMs. They prompt their way to a running application. They’re genuinely excited — understandably so, that’s a real achievement. Then they post about it.

“I built my blog with Ruby on Rails. 30,000 lines of code.”

30,000 lines. For a blog.

I’ve seen these. I’ve looked at them. They don’t have 47 callbacks — they don’t know what a callback is. The same validation is copy-pasted into five controllers. Status fields are bare strings compared inline everywhere instead of a state machine. No concerns, no abstractions, no audit trail. Every feature was added in a new file because nobody told the LLM to look at what already existed.

The LLM never stops and says: “wait, I already wrote this logic three files ago, let me extract a concern.” It doesn’t refactor unless asked. It doesn’t notice duplication across a session. It generates forward, always forward, and the codebase grows like a city with no zoning laws.

When you show them Astro — two markdown files, deploy in 30 seconds, faster than anything they built — they get irritated.

Not curious. Irritated.

They respond like you told them to replace their hand-crafted framework with Salesforce. Like you insulted the craft. Like you missed the point.

The point, as far as I can tell, is the 30,000 lines. The LOC is the achievement. The complexity is the proof of work. The fact that it could be replaced by two markdown files isn’t a revelation — it’s an attack.


What the LLM Did

The LLM built what they asked for. They asked for a Rails blog with authentication, admin panel, comment system, dark mode, RSS feed, and a newsletter subscription form. The LLM delivered.

Nobody asked: “do I need all of this?”

Nobody asked: “what is the simplest thing that could possibly work?”

Those questions require judgment built from experience — the friction of having built the wrong thing before, having maintained it, having regretted it. That friction is gone. The LLM generates confidently. The scaffolding goes up fast. The LOC accumulates. The complexity is invisible until it isn’t.

30,000 lines isn’t skill. It’s the absence of the judgment that says “stop here.”


The Google Analytics Argument

The other response I get when I show people Kaunta:

“But you can just use Google Analytics. It’s free.”

Yes. It’s also:

  • Sending your visitors’ data to Google
  • Blocked by every adblocker, making your numbers wrong
  • A 45KB tracking script on every page
  • A product that has been deprecated and replaced and deprecated again
  • Something you will never own, never control, and never fully understand

Google Analytics is free the way a landlord’s apartment is free rent — someone else owns it, someone else benefits from it, and when they decide the terms change, you find out after the fact.

I own Kaunta. I know what it collects because I wrote the collection. I know where it stores because I wrote the storage. I know what it doesn’t do because I chose not to write it.

That’s not a minor distinction.


The Industry of Bloat

What I’m describing isn’t unique to analytics. It’s everywhere now.

The vibe-coded generation is discovering that LLMs will build anything you ask for, at any scale, with any number of dependencies. There’s no friction saying “this is too much.” The LLM doesn’t know how many readers you have. It doesn’t know you’ll never use the multi-tenant billing module it scaffolded. It doesn’t know that the Kafka consumer it added will sit idle forever while you pay for the server running it.

So the blogs have 30,000 lines. The analytics stacks have 8 containers. The personal projects have enterprise architecture. And the people who built them defend the complexity because the complexity is all they have — it’s the proof that something was built.

Meanwhile GoatCounter: one binary, 5MB, SQLite, counts your visitors. Kaunta: one binary, 15MB, counts mine.

The difference between a tool and a monument is whether it’s built for the problem or for the builder.


Ownership Is the Feature

I keep coming back to this.

The influencer platform I can buy counts my pageviews and also builds a dataset about my audience for their next product. The self-hosted stack I can deploy runs on hardware I don’t control, with a supply chain I can’t audit, updated by maintainers with priorities I don’t set.

Kaunta runs on my hardware. The binary is compiled from source I can read. The data stays in a SQLite file I can open with any tool that reads SQLite. If I stop maintaining it tomorrow, it keeps running. If I want to migrate the data, I query the database.

This is not a technical flex. This is what software ownership actually feels like — and it’s increasingly rare in a world where the default answer to every problem is “there’s a SaaS for that.”

There is always a SaaS for that. The SaaS is usually $47/month, purple, and uses your data to build the next SaaS.


seuros/kaunta — one binary, your data, your server.

🔗 Interstellar Communications

No transmissions detected yet. Be the first to establish contact!

• Link to this post from your site• Share your thoughts via webmention• Join the IndieWeb conversation

Related Posts

The Lobotomy Pipeline: What Happens When AI Removes All Friction

LLMs are exoskeletons. They amplify what you already have. The problem: people are using them as a replacement for building anything at all. No friction, no learning, no muscle — just confident parrots shipping half-tested code.

AILLMengineering