I Replaced Google Analytics with a CSV File and an AI Agent

By Joel Dare ⟡ Written October 24, 2025

I still want to know who’s visiting my sites, but I refuse to run surveillance scripts or consent popups. So I built Consentless: the simplest counter imaginable. Every request just writes a line to a CSV—URL,timestamp. No cookies, no IDs, no JavaScript. It’s exactly what I loved about hit counters in the 90s, only stripped back even further so there’s nothing to violate a reader’s privacy.

Every Visit Becomes One CSV Line

https://joeldare.com/the-14kb-problem,2025-08-24 13:09
https://neat.joeldare.com/,2025-08-24 13:25
https://joeldare.com/subscribe,2025-08-24 13:33

Go Collector Streams Straight to Disk

The collector is a tiny Go program that streams those lines to stdout. I compile it, drop the binary on a low-end VPS, and let SupervisorD keep it running. Because it just prints CSV rows, I can redirect the output anywhere—a file, a pipe, even a pub/sub queue if I ever want to get fancy. Right now I point it at a simple file on persistent disk. It’s dull, it works, and I don’t have to think about it.

Daily Stats Arrive Via a Plain SSH Sync

Getting the data is just as boring. I keep a one-liner that copies the CSV down to my laptop through SSH. Sometimes I kick it off by hand; other times a daily cron job runs it for me. That’s the entire “dashboard”—one file sitting alongside my other notes: consentless-data/consentless.log.

Codex Generates Local Scripts on Demand

Here’s where it gets fun. Instead of writing a UI, I open Codex (an LLM agent that runs locally) right inside the repo. I load the CSV, ask questions in plain language, and Codex writes the Python or shell snippets to answer them. Looking for the top referrers this week? “Codex, show me the top utm_source values from the last 30 days.” Wondering whether my email moved the needle? “Codex, compare traffic on /newsletter yesterday versus the seven-day average.”

Codex CLI Showing Top Pages

Local CSV + AI Means No Extras to Maintain

Every script runs locally against that CSV. Nothing leaves the machine. When I need something Codex hasn’t written before, it generates a quick helper inside _tools/, and I can reuse it next time. No dashboards to maintain, no privacy compromise, and no SaaS bill.

Old, Owned Tech Lets Me Focus on Shipping

It’s the same philosophy as the rest of my stack: keep the tech old, boring, and owned; keep the data plain; let the AI help only when it actually saves me time. If you want more privacy-first, evergreen workflows like this, I break them down in my newsletter.

Send Me Fast, Privacy-First, Evergreen Playbooks


JoelDare.com © Dare Companies Dotcom LLC

Terms - Privacy