Self-hosted web analytics tools are not all trying to solve the same problem.
Some are simple website counters. Some are privacy-first Google Analytics alternatives. Some are product analytics suites with funnels and session replay. Some run entirely on Cloudflare Workers and never touch your homelab. One even skips the tracking script and watches requests at the edge.
This page maps the eleven tools covered on FOSS Engineer so you can pick a stack for a personal site, company site, product, or internal dashboard.
The Short Version
| Tool | Best For | Stack | Data Layer |
|---|---|---|---|
| Umami | Mature, familiar Google Analytics replacement | TypeScript / Next.js | PostgreSQL or MySQL |
| Liwan | Minimal privacy-first tracker | Rust + Astro/React | DuckDB + SQLite |
| Medama | Lightweight cookie-free analytics, portable files | Go + React | SQLite + DuckDB |
| Vince | Smallest possible deployment | Go single binary | Embedded storage |
| Tianji | Analytics plus uptime and server status | Service stack + web UI | PostgreSQL |
| Rybbit | Web and product analytics (funnels, replay) | TypeScript / Next.js + Fastify | ClickHouse + PostgreSQL + Redis |
| Swetrix | Rich event analytics | TypeScript / Nest.js + Remix | MySQL + ClickHouse + Redis |
| Kaunta | Full analytics app readable by AI agents (MCP) | Rust single binary | PostgreSQL |
| Counterscale | Cloudflare-native analytics with long-term rollups | TypeScript on Workers | Analytics Engine + R2 |
| Chickadee | Tiny Cloudflare-native analytics | Hono on Workers | Analytics Engine + KV |
| Dashflare | Edge request telemetry in Grafana | TypeScript Worker + Grafana | Loki |
Three Families
Classic self-hosted trackers Product / event analytics Cloudflare-native
(script -> small app -> DB) (script -> app + OLAP + cache) (script or edge -> Workers)
Umami Liwan Medama Rybbit Swetrix Kaunta Counterscale Chickadee
Vince Tianji Dashflare (edge, no script)
Low ops, portable More features, more services Near-zero ops, Cloudflare lock-in
- Classic self-hosted trackers run happily in Docker on a small VPS or homelab. Backups are a database dump or a couple of files.
- Product and event analytics add funnels, journeys, goals, and replay. Rybbit and Swetrix split app data from high-volume analytics data (ClickHouse) and caching (Redis), so expect several containers. Kaunta stays a single Rust binary but leans on PostgreSQL.
- Cloudflare-native tools have no server to patch, but your data lives in Cloudflare services and migrating away means exporting it yourself.
Choosing One
| If You Need… | Start With |
|---|---|
| A clean Google Analytics replacement for a website | Umami |
| A small cookie-free tracker with a simple backend | Liwan or Medama |
| The smallest single-binary deployment | Vince |
| Website analytics plus uptime checks | Tianji |
| Product analytics: funnels, journeys, session replay | Rybbit |
| A richer event analytics suite with ClickHouse | Swetrix |
| Analytics that an AI agent can query via MCP | Kaunta |
| No server at all, already on Cloudflare | Counterscale (complete) or Chickadee (minimal) |
| Request-level edge telemetry in an existing Grafana | Dashflare |
| A general BI dashboard over databases and APIs | See Web Analytics vs BI |
Classic Self-Hosted Trackers
Umami
Umami is the straightforward privacy-friendly Google Analytics alternative and the most mature option here.
Use Umami when you want:
- simple website traffic analytics with a familiar dashboard
- cookie-free tracking
- Docker deployment with PostgreSQL or MySQL
- easy integration with static sites
Useful links:
Liwan
Liwan is a lightweight privacy-first web analytics tool written in Rust, with DuckDB and SQLite underneath.
Use Liwan when you want:
- a small tracking script
- a focused, minimal Google Analytics replacement
- compact local analytical storage
Useful links:
Medama
Medama pairs a Go API server with a React dashboard and stores data in SQLite and DuckDB files.
Use Medama when you want:
- a small cookie-free tracker
- portable local analytics files that are easy to back up
- a simpler footprint than multi-database stacks
Useful links:
Vince
Vince is a small Go single-binary analytics server with an embedded UI and a Plausible-compatible direction.
Use Vince when you want:
- the least infrastructure possible
- a conventional dashboard and reporting workflow
- Docker deployment without a separate database
Useful links:
Tianji
Tianji combines website analytics with operations-style monitoring.
Use Tianji when you want:
- website analytics, uptime monitoring, and server status in one dashboard
- fewer separate tools to maintain for a small web presence
Useful links:
Product and Event Analytics
Rybbit
Rybbit targets both web analytics and product analytics with a polished UI.
Use Rybbit when you want:
- custom events, goals, funnels, and journeys
- session replay
- public dashboards
- and you are fine running ClickHouse, PostgreSQL, and Redis
Useful links:
Swetrix
Swetrix is a heavier privacy-focused analytics stack built on Nest.js and Remix.
Use Swetrix when you want:
- broad event analytics and product-style reports
- MySQL plus ClickHouse storage
- a more complete platform than a tiny tracker
Useful links:
Kaunta
Kaunta is one Rust binary that serves the no-cookie tracker, collector, dashboard, PostgreSQL-backed reports, backups, and an optional MCP endpoint so agents can read your analytics.
Use Kaunta when you want:
- full privacy analytics with goals and ingestion APIs
- built-in backups
- analytics queryable by both humans and AI agents
- and you are comfortable operating PostgreSQL
Useful links:
Cloudflare-Native Analytics
These run on Cloudflare Workers instead of your own server. Operations are close to zero, but storage, retention, and migration depend on Cloudflare services.
Counterscale
The Worker serves both dashboard and tracker. Analytics Engine handles recent queries, and a scheduled job writes Apache Arrow rollups to R2 for long-term retention.
Use Counterscale when you want:
- a complete Cloudflare-hosted analytics product
- a deployment CLI and optional password protection
- long-term retention without running a database
Useful links:
Chickadee
A browser script posts pageviews to a Hono Worker. Analytics Engine stores the datapoints, and KV manages sites and daily visitor salts.
Use Chickadee when you want:
- the smallest Cloudflare-native setup
- a simple setup page and Basic Auth
- Chart.js dashboards without extra moving parts
Useful links:
Dashflare
Dashflare is not a browser analytics dashboard. A Worker observes Cloudflare-proxied requests at the edge, hashes session-like identifiers, and ships structured events to a Loki and Grafana stack you control.
Use Dashflare when you want:
- analytics without any client-side script
- infrastructure-style dashboards in Grafana
- and you are comfortable with Loki labels, retention, and exposing a Loki push endpoint
Useful links:
Portability vs. Convenience
The practical choice usually follows the stack you already operate:
- Already on Cloudflare, want zero servers: Counterscale or Chickadee.
- Already running Grafana: Dashflare slots in next to your other dashboards.
- Want data you can back up and move: Kaunta, Medama, Liwan, or Vince. Their storage is a PostgreSQL dump or a few local files.
- Want the most features and have resources: Rybbit or Swetrix, at the cost of running ClickHouse and Redis.
Whatever you choose, an internet-facing analytics collector is another public service to scan, contain, and back up. The homelab security hardening guide covers that workflow.
Link Analytics from URL Shorteners
Sometimes the question is not “who visited my site?” but “who clicked my link?”. Several URL shorteners covered here include click analytics:
| Tool | Analytics Angle | Hosting |
|---|---|---|
| Dub | Full link attribution on Tinybird/ClickHouse | Cloud-native, heavy to self-host |
| Snapp | Per-link analytics, teams, multi-domain | Docker + PostgreSQL |
| Sink | Optional Analytics Engine binding | Cloudflare Workers + D1/KV |
| Slite | Local DuckDB analytics | Docker + SQLite/DuckDB |
| YOURLS | Basic click counts, plugins | PHP + MySQL |
Web Analytics vs BI
Web analytics tools answer questions like:
- How many people visited this site?
- Which pages performed best?
- Where did traffic come from?
- What devices, countries, or browsers are common?
- Which events or funnels happened inside the product?
BI tools answer broader data questions:
- What happened across databases, APIs, spreadsheets, and internal systems?
- Which metrics should teams track?
- How should SQL models be reused?
If your primary data source is a website tracking script, start here. If it is a database, API, warehouse, DuckDB file, CSV, or semantic model, use the BI tools guide (Chartbrew, Rill, WrenAI, Malloy, DuckDB).
Comments