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.
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
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.
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.
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.”

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.
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