Self-hosted product & web analytics. One container + MongoDB. Your data never leaves your servers.
188
Self-hosted product analytics. Your apps send events. Mixdive counts them and gives every event its own report screen, on your servers, with nothing defined up front.
mixdive.com · Documentation · Free throughout the beta
The console, running on your own server. Watch it in motion on mixdive.com.
That is the trade most analytics tools ask you to make. Send your users' behaviour to somebody else's servers, or fly blind. Mixdive is the third option: the same reports, running on a machine you control.
Your usage data never leaves your infrastructure. Nothing calls home, and there is no vendor holding a copy of who your users are and what they did. Teams in regulated industries, EU public sector work, and anyone whose data simply cannot go to a third party tend to arrive here for exactly this reason.
Nothing to configure before you get value. Send an event and its report screen exists. Properties register themselves the first time they appear, so a new field becomes a breakdown you can look at instead of a ticket for somebody. No schema, no event definitions, no dashboard to assemble first.
One container and a MongoDB. That is the entire architecture. No Kafka, no ClickHouse, no warehouse to feed, nothing to keep in sync. The queue is a Mongo collection, which is why a small VM handles more than you would expect.
You don't need a data team. The screens answer the questions a product person actually asks. Which features get used, by whom, how often, and what people did before they stopped.
Free throughout the beta. Paid plans arrive with 1.0, and the plan is for a basic version to stay free even then. Early teams keep preferential terms. The current thinking is on mixdive.com.
Docker, and nothing else:
curl -O https://docs.mixdive.com/compose.yaml
docker compose up -d
That brings up Mixdive, a MongoDB with a persistent volume, and Caddy in front
of both. Open http://localhost:8080, or your server's address, and a one-time
wizard asks for a project name, the address your apps will use, and an owner
account. Then you are looking at the console.
Already running a MongoDB? Skip Compose:
docker run -d --name mixdive -p 8080:8080 \
-e MONGODB_URI="mongodb://..." \
mixdive/mixdive:latest
Four modules over a core you cannot switch off. Each one is on or off in Settings, so an installation that only wants web traffic never grows a users table.
| Module | What it does |
|---|---|
| Event analytics | Every event gets a report: totals, trends, top users, breakdowns by any property it carries. Add measures and an event counts revenue, duration or quantity as well as occurrences. |
| Web analytics | Visitors, sessions and pages from a one-line script tag, with device and session identity handled for you. |
| User analytics | Profiles, per-user activity, and relations with roles, so "likes given" and "likes received" are two different numbers rather than one ambiguous one. |
| Data models | Records that merge and increment. A product, an order, a support ticket, each with its own screen and its own counters. |
Ingestion answers straight away, because the request path writes to a queue and stops there. A worker then applies events oldest first and counts each one exactly once, so a retry or a double delivery never inflates a number.
A report for every event. Totals, average per day, unique users, and a breakdown by any property the event carries. Nobody assembles it first.

Website traffic too. One line on your site, and visitors, sessions and pages start counting themselves.

The people behind the numbers. Every count goes back to somebody: what they did, and when they were last around.

Your own things, counted. A product, an order, a support ticket, each with its own screen and its own counters, merged from whatever your apps send.

More screens, including the received log and the storage panel, are on mixdive.com.
Give the setup wizard an https:// address, point that name's DNS record at
the machine, and leave ports 80 and 443 open. The bundled proxy gets the
certificate the first time somebody opens the address and renews it on its own.
It asks Mixdive first, and Mixdive only ever approves the one name you
configured.
How it works.
| Variable | Default | Meaning |
|---|---|---|
MONGODB_URI | mongodb://localhost:27017 | the one database Mixdive uses |
PORT | 8080 | HTTP port |
Two variables, and that is the list. The project name, the server URL, how long raw events are kept, how often the worker runs and which modules are on all live in the database, with a screen each under Settings.
latest moves to whatever was released last. Version tags such as 0.1.1 stay
put, so pin one when you want to choose your own upgrade moment. Every tag is
built for linux/amd64 and linux/arm64. Upgrading is
docker compose pull && docker compose up -d, with collections and indexes
ensured at startup and nothing to migrate by hand.
Which version an installation runs is never a guess: Settings → Storage shows
the version and the commit it was built from, and so does GET /health.
A web tag you paste once, React, a Go SDK, a Google Tag Manager template, and an HTTP API that needs no SDK at all.
More SDKs are coming. If the one you need is missing, write to [email protected] and it moves up the list.
Mixdive is a commercial product and not open source. It is version 0.1.1, which is honest about where it is: the ingestion and reporting core is stable, and screens still move between releases.
Content type
Image
Digest
sha256:0d025fa38…
Size
6.1 MB
Last updated
22 days ago
docker pull mixdive/mixdive