tiny-analytics
Minimal, privacy-focused web analytics. Self-hosted, no cookies, no tracking IDs.
Quick Start
# Install
uv tool install tiny-analytics
# Configure (create a .env file or set environment variables)
export TINY_ANALYTICS_PASSWORD="your-secret-password"
export TINY_ANALYTICS_SECRET_KEY="$(openssl rand -hex 32)"
# Run
tiny-analytics
Add this to your site:
<script src="https://your-analytics-domain/snippet.js" defer></script>
That's it. View your dashboard at http://localhost:8000/.
One-liner (no install)
uvx tiny-analytics
From source
git clone https://github.com/zevaverbach/tiny-analytics.git
cd tiny-analytics
uv sync
uv run tiny-analytics
Using pip instead of uv
pip install tiny-analytics
tiny-analytics
Or from source:
git clone https://github.com/zevaverbach/tiny-analytics.git
cd tiny-analytics
python -m venv .venv && source .venv/bin/activate
pip install -e .
tiny-analytics
Features
- Privacy-first: No cookies, no fingerprinting, no personal data stored
- Lightweight: Single Python file + templates
- Bot filtering: Automatic detection and separation of bot traffic
- Time on page: Tracks actual engagement, not just page loads
- Geo & device breakdown: See where your visitors come from and what they use
- Dark mode UI: Easy on the eyes
Screenshots
Login
Logs view
How It Works
- Visitor hits your page → snippet.js fires a POST to
/t - Server hashes IP+UA → creates anonymous visitor ID (never stored raw)
- On page leave → beacon sends time-on-page to
/d - Dashboard → aggregates and visualizes the data
No cookies. No localStorage. No tracking across sites.
Configuration
| Variable | Default | Description |
|---|---|---|
TINY_ANALYTICS_PASSWORD |
changeme |
Dashboard login password |
TINY_ANALYTICS_SECRET_KEY |
change-this... |
Session signing key (generate a random string) |
TINY_ANALYTICS_ALLOWED_ORIGINS |
[] |
Restrict tracking to specific domains (empty = allow all) |
TINY_ANALYTICS_DB_PATH |
./tiny_analytics.db |
SQLite database location |
TINY_ANALYTICS_HOST |
0.0.0.0 |
Host to bind to |
TINY_ANALYTICS_PORT |
8000 |
Port to listen on |
Deployment
Systemd
[Unit]
Description=tiny-analytics
After=network.target
[Service]
User=www-data
WorkingDirectory=/opt/tiny-analytics
Environment="TINY_ANALYTICS_PASSWORD=your-password"
Environment="TINY_ANALYTICS_SECRET_KEY=your-secret-key"
ExecStart=/usr/local/bin/tiny-analytics
Restart=always
[Install]
WantedBy=multi-user.target
Behind nginx
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
Cloudflare
tiny-analytics reads cf-connecting-ip and cf-ipcountry headers automatically for accurate geo and IP data behind Cloudflare.
CLI Options
tiny-analytics [OPTIONS]
Options:
--host TEXT Host to bind to [default: 0.0.0.0]
--port INTEGER Port to listen on [default: 8000]
--help Show this message and exit
API
| Endpoint | Method | Description |
|---|---|---|
/t |
POST | Record a pageview |
/d |
POST | Update time-on-page |
/snippet.js |
GET | Tracking script |
/ |
GET | Dashboard (auth required) |
/logs |
GET | Raw logs view (auth required) |
License
MIT
Metadata
Release files for tiny-analytics 0.1.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| tiny_analytics-0.1.3.tar.gz | 13.9 kB | Without provenance | Details for tiny_analytics-0.1.3.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| tiny_analytics-0.1.3-py3-none-any.whl | Python 3 | none | any | Details for tiny_analytics-0.1.3-py3-none-any.whl |
Total release size: 30.9 kB
Release files / tiny_analytics-0.1.3.tar.gz
| Download URL | tiny_analytics-0.1.3.tar.gz |
|---|---|
| Size | 13.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
5af87a343c9f92f8f274b3e475624fda12352ac951bb9583aff26df37f6728c7
|
|
BLAKE2b-256 checksum How to use checksums |
2330748b7b9157e78b1cd604ea8e142aff5c1bc9690dfe64d68606ad5b53625e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.3
|
Release files / tiny_analytics-0.1.3-py3-none-any.whl
| Download URL | tiny_analytics-0.1.3-py3-none-any.whl |
|---|---|
| Size | 16.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e11c6f706a677f062fd89032710cbf7b4f5ff910c5407ed2921d01b837d70f27
|
|
BLAKE2b-256 checksum How to use checksums |
4f398b1aacc40e81c8a1f854186f4439bd75b07c7736f6ea937d5280afb45fc3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.3
|
Security for tiny-analytics 0.1.3
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.