Build or buy, when building takes an afternoon

Two halves of a golden biscuit hanging in mid air above a pale surface, a shower of crumbs falling between them

"We are asking if you would like to be tracked because we value your choices."

No, you don't. Nobody has ever read that sentence, considered it properly, and decided that yes, they would like to be followed around the internet. The answer is always 'No'. The "cookie consent" banner exists because the law says you have to ask before you track people, and asking turned out to be cheaper than not tracking them.

So every website now opens with a small wall. Accept, reject, manage preferences, 847 partners. They're in the way, every time, on every site, forever. They should die.

But nobody adds one of those for fun. Every banner you've ever closed is the far end of a decision somebody made about their own website, and it's the oldest decision in software: build it, or buy it.

The oldest question in software

Website owners want to know whether anyone is reading. How many people came, which pages they opened, roughly where in the world they are, whether a link somewhere actually sent anyone here. Those are reasonable questions.

Buying the answers takes five minutes. Paste in somebody else's script, accept that it needs consent, add the banner, and you're done. Building them yourself meant standing up storage, writing the code to make sense of it, and then building a page to show the result. Weeks of work for a question you were only mildly curious about.

Put like that, everybody buys. That's why the wall is on every site you visit, including the ones run by people who hate it.

I built my system instead. So you don't have to see an annoying banner. There is no JS running on your machine to track you, no cookies, no tracking preferences to manage. All the info I want is in the server logs anyway.

Setting it all up, working with AI, took an afternoon, and only an hour or two of that was actually my time.

The server already wrote it down

Every time someone opens a page, the server that delivered it writes a line. Which page, at what second, from which address, using which browser, and which link they arrived from.

That happens whether or not you ever look at it. It's a delivery record. Nothing is planted on the reader's machine, so there's nothing to ask permission for.

So the building option is smaller than it looks. Most of the data collection was already done, by the server, for free, before I even asked myself "I wonder if anybody is reading this blog". I had eleven days of those lines, I just needed a way to read them.

The dashboard overview: cards reading 606 total page views, 443 human, 136 bot and 27 unclassified, beside a daily traffic chart and a globe listing 33 countries

Nobody knows this blog exists (I haven't told anyone, anyway). Still, somehow it has 606 page views. 443 of them people, 136 crawlers, 27 I can't confidently call either way. 357 visits from 310 different readers, 29 of whom came back on another day.

33 countries. Twice as many phones as computers. The busiest hour is 23:00 UTC, which is a polite way of saying people read this in bed.

Two dashboard panels: where readers came from, led by direct with 257 and Google with 7, and a bar chart of page views by hour of the day that peaks sharply at 23:00 UTC

Not one line of tracking code, and not one banner.

What it can't tell me

The people selling tracking scripts aren't wrong about the gaps, so here they are.

Two people reading from the same office look like one reader, because they share one address. The same person on a phone and then a laptop looks like two.

I can't tell how long anyone actually spent reading. All I see is the time between one page and the next, so a reader who works slowly through a single post and then leaves is a visit I have to record as unmeasurable. That's most of them. I'd like to believe that's because the blog is new.

And I can't follow anyone anywhere else. I have no idea what my readers do on other websites, what they buy, or what they searched for last Tuesday. That's the part I mind least.

A tracking script would hand me all of it. It would follow the scroll, notice when the tab goes to the background, and join what happens here to what the same person does on a thousand other sites.

I don't want any of that

You might assume I give a shit, and you would be wrong.

This blog is almost two weeks old, and I haven't posted a link to it anywhere. I haven't mentioned it to my friends. The single promotional act of my career so far was sending the address to my wife.

That's roughly how much energy I'm putting into building an audience, so you can imagine how much I'm putting into profiling one. What I want is to know the thing works, and that somebody, somewhere, opened it. Which pages get read, whether the visitors are real, what time of day they show up. That's curiosity rather than marketing, and curiosity is fully served by the delivery record.

Two things a script would have missed

There's a whole category of visitor a tracking script can't see, because a crawler never runs your JavaScript.

The crawler activity table listing Googlebot, MJ12bot, ClaudeBot, GPTBot, OAI-SearchBot and others, with request counts and first and last seen timestamps

ClaudeBot arrived 21 minutes after I turned logging on. OpenAI's search crawler came that same evening, GPTBot the next morning. Googlebot took three days, which I'm choosing to take personally.

For a blog written in 2026 that's the more useful table, because those crawlers are how anything here ends up inside somebody's AI assistant answer.

The second thing is a broken link, and it was mine.

The broken links panel, listing two post addresses that end in a slash, one having failed 42 times and the other once

One of my own post addresses, the version with a slash on the end, had failed 42 times. A tracking script would never have mentioned it, because the script that reports a problem only runs on the pages that work.

What two hours buys now

The AI wrote the log parser, the visit grouping, the country lookup and the page in these screenshots, while I was happily doing something else. My hour or two went on saying what I wanted and reading what came back. It runs on the same storage the site already uses and costs somewhere around a dollar a month, most of which I was paying anyway.

Set that against buying. Pick a vendor, paste their script into your pages, and watch the site get slower. Accept that ad blockers will throw away a chunk of the data anyway. Sign a data processing agreement, add the consent banner so you're allowed to use the thing at all, and pay every month for as long as the blog exists.

Or don't pay in money at all. Several of the popular options are free, because your visitors' behavior is the payment. That's a pretty shitty thing to do to somebody who came here to read a blog post.

What you get back either way is a dashboard built for an e-commerce team, where your actual questions sit three menus behind the ones somebody else decided you should have.

Now, mine wasn't flawless either. The first version reported zero page views for a solid week, and its own test agreed that zero was correct. The code and the test had been built on the same wrong idea about what the logs contain, so they confirmed each other beautifully.

It took three rounds to get right.

Which means we should double-check the output of AI-generated software, rather than trusting it blindly.

A bought script has its own bugs, obviously. You just don't get to see them. You can't read the code, you can't fix it, and you can't hand it to an AI and ask whether it really does what the sales page claims. When mine counted zero for a week, I could go and look. I asked ChatGPT to look, but still.

Built for exactly one user

Build or buy used to answer itself, because building meant weeks and buying meant five minutes. Those two numbers have moved close enough together that the question is worth asking again, and most people are still answering it out of habit.

What I got for the afternoon was a thing that answers my questions instead of somebody else's.

I wanted to know which AI crawlers had been through, and when each of them first appeared, because that's the question I care about this year. No vendor ships that panel, because none of their other customers have asked for it. I described what I wanted and it existed before dinner.

The two hours of my own time were also good fun, which I hadn't expected. And I came out of them knowing how these logs are really shaped, which I guess may be useful one day.

The main thing is: there is no cookie consent banner on this site. Nothing to accept, nothing to reject, no preferences to manage, no 847 partners.

And look at it. There are floating particles drifting across the dashboard, for no reason whatsoever. That was six extra words in the prompt, so why the hell not.

The dashboard header: a glowing green orb wrapped in orbiting rings, under the words "Who is reading, and how they got here", with small particles drifting across the dark background