Trying Out GoatCounter

Published February 8, 2024

I’ve been waffling on deciding what analytics service to try out for a while and finally decided to commit and try out GoatCounter (GC) on this website. I’ve been wanting to figure out a web analytics alternative to Google Analytics (GA) for years because 1) I find I don’t leverage GA at all and 2) I’d prefer something that’s open source and more privacy focused so ideally I use it and 3) I have been idly slowly trying to De-Google myself over the years.


It’s important to call out that I’m really only interested in basic analytics: which pages and how many hits? I can appreciate a bit more data around knowing where the traffic (e.g. the Referer) comes from and by who at the most broad sense. I’m not interested in tracking richer data around how long people are on the website, what they click, and any sort of attempt at measuring conversion.”

I’ve also personally been a fan of Martin and their blog for a while. Some personal favorite posts are one on YAML as a config format and another re: hard wrapping email bodies.

For years I’ve had this chunk in my personal file, which has been copy-pasted and lightly edited:

Along with a small card on GitHub when I was trying out their classic” projects feature for some minimal kanban:

Some additional options that have caught my eye more recently:


Martin has written plenty on the what, why, how, and everything in between re: the architecture, design, and implementation of GC. Of course, it’s open source too.

My only papercut with GC so far is the need to manually create your own site code e.g. $—I’d prefer if this was abstracted away as some meaningless hash string or even offered the feature of randomly generating a string e.g. correct-horse-battery-staple. I find naming things to be hard, so given the option to simply defer that decision would be a nice improvement. I’ll reiterate this at the end, but I have the option of using a DNS CNAME record to create a vanity” URL which bypasses the need to reference the subdomain in the future.

I went back and forth on a few ideas, but eventually settled on bl0g as blog was taken, as expected.

Ideally, I was hoping to use a tracking pixel optionally wrapped in a <noscript> tag to keep this totally out of the client JavaScript. Unfortunately, Blot has no way to template in the request URL path to properly set the ?p=/page-url-slug query parameter that GC wants for the tracking pixel.

Lastly, I’ve opted to create a privacy policy page which essentially outlines the privacy policies for Blot & GC, respectively. Plus, I set some browser localStorage keys if you opt into enabling keyboard shortcuts or persisting a specific color theme. I encourage you to read more directly at /privacy.

N.B. I don’t think there’s any compatibility problems, but I do use on this site as a way to make the overall UI/UX experience faster. And uBlock Origin blocks and GoatCounter by default which is fine—neither are required for the site to function.


Some thoughts for the future:

I enabled unauthenticated dashboard viewing, so feel free to check out the stats at

Last modified February 4, 2024  #announcement   #privacy 

← Newer post  •  Older post →