Lightweight, stateless and privacy-first analytics system
  • Go 87.6%
  • Nix 6%
  • JavaScript 4.7%
  • HTML 1.7%
Find a file
NotAShelf 993e47e603
internal/aggregate: add HyperLogLog unique visitor tracking
Extracts IP from X-Forwarded-For/X-Real-IP/RemoteAddr. Only active
when `config.Site.SaltRotation` is set.

Signed-off-by: NotAShelf <raf@notashelf.dev>
Change-Id: Ieef93b81e9894fc2e9e129451bf2dfdf6a6a6964
2026-03-02 22:37:58 +03:00
cmd/watchdog various: HTTP server; migrate to cobra pattern for repository 2026-03-02 22:37:56 +03:00
internal internal/aggregate: add HyperLogLog unique visitor tracking 2026-03-02 22:37:58 +03:00
nix nix: initial tooling 2026-03-02 22:37:46 +03:00
testdata internal: add bounded path registry to prevent cardinality explosion 2026-03-02 22:37:52 +03:00
web web: Javascript beacon for client-side tracking; custom event API 2026-03-02 22:37:57 +03:00
.envrc meta: add direnv support 2026-03-02 22:37:48 +03:00
.gitignore initial commit 2026-03-02 22:37:45 +03:00
config.example.yaml various: HTTP server; migrate to cobra pattern for repository 2026-03-02 22:37:56 +03:00
flake.lock nix: initial tooling 2026-03-02 22:37:46 +03:00
flake.nix nix: initial tooling 2026-03-02 22:37:46 +03:00
go.mod internal/aggregate: add HyperLogLog unique visitor tracking 2026-03-02 22:37:58 +03:00
go.sum internal/aggregate: add HyperLogLog unique visitor tracking 2026-03-02 22:37:58 +03:00
main.go various: HTTP server; migrate to cobra pattern for repository 2026-03-02 22:37:56 +03:00
README.md docs: improve introduction paragraph; tiny cleanup 2026-03-02 22:37:49 +03:00

Watchdog

Watchdog is a privacy-preserving web analytics platform similar to Plausible, where data visualisation is deferred to a Prometheus-compatible dashboard such as Grafana. It is designed to be as simple and lightweight as possible, without any additional web components to worry about. You, in turn, get to use your existing monitoring stack to also collect information about your web applications tracked by Watchdog.

Design

  • No raw event storage
  • No persistent identifiers
  • Bounded cardinality by design
  • Aggregate at ingestion
  • Prometheus-native export

Quick Start

# Build the prıject
$ go build -o watchdog ./cmd/watchdog

# Start the Watchdog daemon with your own config
$ ./watchdog --config config.yaml