Genug Analytics is a self-hosted web analytics tool built around a different interaction: a script tag on your site feeds events to a server you run, and you ask questions about the traffic from inside Claude, Cursor or any MCP client instead of building a dashboard. It is MIT-licensed, in alpha, and running in production on exactly one site: the maintainer’s own.
What you run
One Node process and one volume. A script tag sends events to /events; SQLite lives inside the same process and holds every event as a row; your own event schemas sit beside it as one JSON file each, live the moment you save them. The installer is a single command that installs Docker, puts Caddy in front for HTTPS, and asks for three things: the subdomain, the tracked site’s origin, and a cockpit password. Point the subdomain at your server first, unproxied: the certificate request depends on it.
Two readers sit on top of that data, and both go through Genug: a small cockpit at /cockpit, for configuring the setup and glancing at rejected events and tool status, and an MCP server at /mcp.
Thirty-two tools, one file
The MCP server exposes thirty-two tools, each answering one question a site owner actually asks: traffic by day, weekday or hour; top pages, entry pages, exit pages, bounce pages, referrers; sessions and new-versus-returning visitors; cohort returns; funnels; device and language breakdowns; consent coverage; and the data-quality side: orphaned events, schema errors, rejected events, bot activity. Each can be narrowed to a segment of sessions, so “where did the people who clicked the button come from” is one call. There is also a tool to delete a visitor’s data, and one to leave a note in the history log the agent reads. Connecting Claude Code is one claude mcp add line with a bearer token.
The privacy model, written down
By default Genug writes nothing to the visitor’s device (no cookie, no localStorage, no fingerprinting) and identifies a visitor with a daily-rotating hash of a truncated address and the User-Agent; only the hash reaches the database, and the project’s own backups never copy it. A built-in genugAnalytics.optOut() writes a first-party cookie holding no identifier and stops tracking for that browser. Consent, if you run a banner, upgrades to an HttpOnly first-party cookie that expires thirteen months after the last event.
The limits are stated too: you host it, so there is no analytics vendor to sign a DPA with, though your hosting provider and the model vendor behind your agent still are processors, and whether that lets you drop the cookie banner is your call, not the software’s. The full address briefly reaches the server log when the rate limiter blocks traffic, and query strings keep only the six utm_* parameters unless the operator configures otherwise.
My read
Alpha is the honest word, and the README says it before you find out. The shape is the argument: one process, one file, and a written account of what happens to your visitors’ data, limits included. Genug is German for enough, and it shows. If your analytics is a dashboard nobody opens, this is aimed at you; if you need a decade of provable behavior, it is not there yet.
Source: genug-analytics.com and the repository.

