Self-host GoatCounter
The smallest serious web analytics server: a single statically compiled Go binary (or the project's own Docker image) writing to a SQLite file, with PostgreSQL optional for big sites. It counts unique visits without cookies or identifiers, tracks referrers, campaigns, browsers, locations and screen sizes, and offers a JavaScript-free tracking pixel, a backend API, and log-file import. Its own README says it doesn't need a GDPR notice. Licensed EUPL-1.2; the same author runs a free hosted service.
Key facts
Pick GoatCounter when the whole point is to run as little as possible: one Go binary or one container, a SQLite file, no cookies, no consent banner by its own account, and a JavaScript-free tracking pixel for readers with scripts off. It counts visits, referrers, campaigns, browsers, locations and screen sizes, plus named events — and stops there. Want funnels, retention, event properties or a team dashboard? Umami is the next step up; Rybbit and OpenPanel are two more.
What you need
- Any VPS with at least 256 MB of RAM
- A domain you control — most self-hosted setups need HTTPS in front of them
- Under an hour if you've used Docker before
Paid link — we earn a commission if you shop through it.
Install
Run these commands on your server:
# GoatCounter — the project's Docker Hub image; one container, SQLite in a named volume, nothing else to run
docker run -d --name goatcounter --restart unless-stopped -p 8080:8080 -v goatcounter-data:/home/goatcounter/goatcounter-data arp242/goatcounter
# → http://SERVER_IP:8080 (the first visit runs the site-creation wizard)
# or create the first site from the CLI instead (it asks for a password):
docker exec -it goatcounter goatcounter db create site -vhost=stats.example.com -user.email=me@example.comWhat you take on
GoatCounter is deliberately small, and that is where its limits come from: