Skip to content
Genug AnalyticsGitHub (opens in a new tab)

Don't build a dashboard — just ask.

Turn your web traffic into instant business insights. This lightweight, self-hosted analytics platform gives your AI everything it needs to answer your analytics questions with your own data. Free, MIT licensed and no cookies by default.

You: Did anything unusual happen on the site last week?

Agent: Interaction events were up about 35% last Tuesday — almost entirely outbound_link_click on your GitHub link, not more page views. Worth checking what pointed there that day.

An example, not a live query — but this site is tracked with Genug, and that instance is open: ask it yourself.

How it works

What you set up, in the order you set it up.

Seven things, most of them once — and what they add up to.

  1. 01

    Get a server

    Any small Linux box with Docker is enough.

  2. 02

    Install Genug Analytics

    One command builds it, puts HTTPS in front, and starts it.

  3. 03

    Define your events, if you need to

    3 built-in events: page views, outbound clicks, and file downloads. Add more if you want.

  4. 04

    Add your business context

    In your own words, so the agent isn't left guessing at what the site is for.

  5. 05

    Add the tracking script to your site

    One <script> tag, and the choice whether to enable automatic tracking.

  6. 06

    Connect your AI agent

    Claude, Cursor, or any MCP client, with one API key.

  7. 07

    Ask your analytics questions

    No login, no dashboard to build — just chat.

Steps 2 and 5 with real commands: Quick start ↓.

One process, one volume — no second service to keep alive.

Your website sends events to Genug, a single Node process, over its /events endpoint, and also serves a cockpit at /cockpit. SQLite is embedded in that same process rather than run as a separate database, and everything it keeps sits on one volume at /data: genug.db holding every event as a row, an events directory holding your schemas as one JSON file each, and a context directory holding the ground rules, business context and history log the agent reads before it answers. Two things read that data back, and both go through Genug: your AI agent, over /mcp, and you, in the cockpit the same process serves at /cockpit.

Try it

This page's own real traffic, not a sample dataset.

Genug Analytics tracks this site with itself — the cockpit and the MCP server below both point at that same real instance. It's a new site, so the numbers are small; what's there is real, including the rejected events and filtered bots.

The cockpit

A brief administration area — configure your setup and check that everything's operating normally, from rejected events to tool status.

The MCP server

Connect your own AI agent to this instance and ask it about real traffic directly — no need to open the cockpit yourself.

Claude Code

claude mcp add --transport http genug-demo https://demo.genug-analytics.com/mcp \
  --header "Authorization: Bearer demo"

Cursor (.cursor/mcp.json)

{
  "mcpServers": {
    "genug-demo": {
      "type": "http",
      "url": "https://demo.genug-analytics.com/mcp",
      "headers": { "Authorization": "Bearer demo" }
    }
  }
}

OpenCode (opencode.json)

{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "genug-demo": {
      "type": "remote",
      "url": "https://demo.genug-analytics.com/mcp",
      "enabled": true,
      "headers": { "Authorization": "Bearer demo" }
    }
  }
}

Then ask it

  • "What were the top pages on this site last week?"
  • "Where is the traffic coming from, and what converted?"
  • "Is anything being rejected — is the tracking actually working?"
Passworddemo

Features

Every question is one call, not a filter you build.

Ask, don't read

Every tool takes a segment, so “where did the buyers of product X come from” is one call, not a dashboard filter you build. Thirty-five tools, one per question a site owner actually asks — including “did tracking break?” and “is this drop real?” Want a chart? Ask for one.

How much traffic, and when?
Summary, per day / weekday / hour, one event's trend
Which pages, and where from?
Top, entry, exit and bounce pages; referrers; campaign params
What happened?
Events ranked, broken down by any prop, summed, funnelled
Screenshot from the cockpit, the built-in admin area — the MCP tools card
The tool list, as the cockpit shows it — open full size ↗

Your own events, validated on arrival

Three events come built in — page views, outbound link clicks and file downloads — each behind its own opt-in flag. Anything else is yours to define, as one JSON file or through the cockpit's own form, live the moment you save. Props are checked against your schema when they arrive, so a mistyped one shows up in the rejected counter instead of vanishing.

From JavaScript

window.genugAnalytics.track("order_completed", {
  order_total: 49.9,
  order_currency: "EUR",
});

Or straight from the markup

<button
  data-genug-on-click="cta_click"
  data-genug-props='{"plan":"pro"}'
>
  Upgrade
</button>
Screenshot from the cockpit — the schema registry card
The cockpit's schema registry, with the three built-ins — open full size ↗

A cockpit, for when you'd rather look than ask

No agent required: an Overview band counting sessions, events, rejections and filtered bots, a traffic trend, and cards ranking top pages, referrers and devices. The schema registry and the tool list above live in it too.

Screenshot from the cockpit — the Overview and Traffic areas
The cockpit's Overview and Traffic areas — open full size ↗

Radically small

One Node process, one SQLite file, no analytics platform to run. Measured, not guessed: about 2,300 events a second in Docker behind a reverse proxy, 0.4 KB stored per event — a 2 vCPU / 2 GB VPS is enough.

Built to operate

Retention defaults to 13 months, a real period rather than forever, and yours to change with one setting. Daily backups on by default, seven days kept. Erasure through a write tool that previews before it deletes. Health on /healthz.

Ground rules, context and a history log

Markdown you write tells the agent how to answer and what your site or business is for — ask instead of guessing, name the unit, go careful on small samples. Beside it, dated notes on what happened, so a drop in the chart gets explained rather than guessed at. All three editable from the cockpit, and read before the agent answers anything, not just when it thinks to ask.

Yours to change

MIT, and written to be modified: three recipes cover adding an event, adding a tool, and changing the cockpit end to end. An AI assistant pointed at the repo picks up its rules and follows them.

Every tool's description says what its number means, what it excludes and where it misleads — the documentation the agent reads.

Quick start

From nothing to answers in 6 steps.

Before you start, you'll need

  • A server with root privileges, so the script can install Docker and take care of HTTPS
  • A domain you control to create a subdomain and point it to the server
  1. 01

    Use a subdomain of the tracked site

    Point it at your server before you run anything, unproxied — on Cloudflare that means DNS-only, not the orange cloud, or HTTPS setup fails.

  2. 02

    Run the install script

    On a fresh Ubuntu server. Installs Docker and Caddy, asks for the hostname, a password and your time zone, and starts it with HTTPS already in front.

    Other ways to install →

    curl -fsSL https://genug-analytics.com/install.sh | sudo bash
  3. 03

    Add the script to your site

    <script>
      window.genugAnalyticsConfig = { enableAutoPageTracking: true };
    </script>
    <script defer src="https://data.your-domain.com/client.js"></script>
  4. 04

    Watch the first event arrive

    At /cockpit. If nothing shows up, the rejected counter says why.

  5. 05

    Connect your AI agent

    Claude Code, Claude Desktop, Cursor, or a local model on your own machine all work. This step is optional — the cockpit already shows everything without it.

    claude mcp add --transport http genug https://data.your-domain.com/mcp \
      --header "Authorization: Bearer YOUR_MCP_API_KEY"
  6. 06

    Ask it questions

    It answers from your own data.

Privacy

Nothing on your visitors' devices, by default.

In its default consentless mode Genug writes nothing to the visitor's device — no cookie, no localStorage, no sessionStorage, no fingerprinting — and builds no profile or cross-site identifier. Consent selects how a visitor is identified, not whether events are recorded — consentless events are still stored, under a daily-rotating pseudonym.

Pseudonymous, not anonymous

The hash combines a truncated address (a network block, not a full connection), the User-Agent, the site's host name and a random salt. The salt is replaced at midnight in the deployment's time zone. Until then your server holds it, so today's ID can be recomputed from a known address and User-Agent. These IDs are personal data. Once the salt is gone, an old ID can't be traced back to an address: Genug's own backups never copy it. The exception is a server snapshot taken by your host.

A working opt-out

genugAnalytics.optOut() writes a first-party cookie holding no identifier, and tracking stops for that browser on that host. Link it from your privacy policy so visitors can object without writing to you.

Consent, if you run a banner

Consent upgrades the visitor to a first-party genug_vid cookie — HttpOnly, Secure, SameSite=Lax, holding the ID and nothing else. It is set to expire 13 months after the last event that confirmed consent; Safari can cut that to 7 days, depending on hosting. Only the server can delete it. That happens with the next event after consent is withdrawn, usually the next page view, or at once when optOut() is called. optOut() also stops all counting.

Two things the guarantees above don't cover

Because you host it yourself there's no analytics vendor to sign a DPA with — your hosting provider and the model vendor behind your MCP agent still are one, though. Whether that lets you drop the cookie banner is for you and your lawyer to decide, not the software. The product's privacy document lists the questions to ask. Not legal advice.

Only the hash reaches the database, never a raw address or User-Agent. One exception: Genug's own log writes the address when it rate-limits a client or after too many wrong danger-zone passwords, IPv4 in full and IPv6 as its /48 block. Your reverse proxy usually logs every full address too. Query strings, on the page and on clicked links and downloads, keep only the six utm_* campaign parameters by default. Everything else, including ad click IDs, is stripped unless the operator configures a different list.

Everything above describes the software you would run. For this website itself, see its privacy policy.

Free and MIT licensed

One process, thirty-five tools, no analytics vendor to trust.