Self-hosted analytics

Your data.
Your servers .
Your rules.

Tally is a lightweight, privacy-first analytics engine you run on your own infrastructure. Single Docker container. SQLite database. Zero external dependencies. No monthly bill.

Deploy in 30 seconds Read the docs
# Pull and run — that's it
$ docker run -p 3000:3000 -v tally-data:/app/data tally

# Add the tracker to your site
< script src = "https://your-server/t.js" data-site = "yoursite" ></ script >

# Done. Data flows to your SQLite. You own it.

Everything you need.
Nothing you don't.

No dashboards full of metrics you'll never use. Tally gives you clear, actionable insights about your traffic — and nothing leaves your server.

Data Sovereignty

Your analytics data lives on your server. Not our cloud. Not a third-party database. Yours. Inspect the database file anytime.

No Cookies Required

Cookie-free tracking. No consent banners needed. Tally uses a first-party session identifier — no GDPR headache.

Single Binary

One Docker container. One SQLite file. No PostgreSQL, no Redis, no Kafka. Zero infrastructure complexity.

Real Analytics

Page views, unique visitors, referrers, UTM tracking, scroll depth, focus time, geo location, device breakdown, and a realtime dashboard.

Built-in Dashboard

Server-rendered dashboard with zero JavaScript frameworks. Fast, accessible, works everywhere. Protected by password auth.

REST API

Full JSON API for every metric. CSV export for pageviews, sessions, and pages. Build your own reports or pipe data wherever you want.

Lightweight Tracker

~3KB tracking script. Respects <code>sendBeacon</code>. Tracks scroll depth, focus time, and SPA navigation out of the box.

GeoIP Built-In

Optional MaxMind GeoLite2 integration for country/city/region breakdowns. Downloaded automatically on container start.

Why self-host?

SaaS analytics tools talk about privacy. We built a tool where privacy isn't a promise — it's an architectural guarantee.

Google Analytics Simple Analytics Tally (self-hosted)
Data stored on your server
No cookies required
No monthly bill
Works behind firewalls
Full data export (CSV + API) Limited
Single binary deploy
Audit the source code
No vendor lock-in

Dead simple stack

Tally runs on Bun with a SQLite database in WAL mode. The tracker is a single <script> tag (~3KB). The dashboard is server-rendered HTML — no React, no Vue, no build step for the UI. The API returns JSON. Export gives you CSV. Everything you need to understand your traffic, nothing more.

  • Runtime: Bun
  • Database: SQLite (WAL mode, single file)
  • GeoIP: MaxMind GeoLite2 (optional)
  • Container: ~50MB Docker image (Alpine)
  • Tracker: ~3KB minified, no dependencies
  • Requirements: 1 CPU core, 256MB RAM
# docker-compose.yml
services :
   tally :
     image : tally
     ports :
      - "3000:3000"
     volumes :
      - tally-data:/app/data
     environment :
      - ADMIN_PASSWORD = your-secure-password
      - SITES = {"yoursite.com":{"token":"secret"}}

Built for people who own their infrastructure

Personal Sites & Blogs

Track your blog or portfolio without sending visitor data to Google. One container, one password, done.

Internal Applications

Track intranet sites, internal tools, and firewalled applications. SaaS analytics can't reach behind your firewall.

Compliance-Heavy Orgs

Healthcare, finance, government — when regulations require data on-premise, Tally delivers without compromise.

Developers & Homelabbers

Self-hosters who want analytics without the overhead. Runs on a Raspberry Pi. Seriously.

Deploy Tally in 30 seconds

Because it's stupidly simple

Get started