Femtostats is a lightweight, tiny, privacy-focused web statistics provider with no RDBMS requirement.
- Self-hostable
- Easy setup with a single
<script>
tag - Simple pageview and session tracking
- Arbitrary client-side event tracking
- Realtime visitor count
- No external database requirement (uses SQLite)
- Not blocked by common ad blockers and browsers
- No storage of personally-identifable data (PII)
- Collection of client-side performance stats and screen width
- Geographic tracking with a free Maxmind account signup
- Optional cookieless operation to abide by privacy laws
What | Why not? |
---|---|
Google Analytics | Blocked by ad blockers and feeds your site's data into the Google data machine |
CloudFlare Web Analytics | Blocked by ad blockers |
Plausible | Self-hosting requires both additional Postgres and Clickhouse databases |
Fathom Lite | The project is in maintenance-only mode and requires a Fathom account |
Server logs | Doesn't record client information or sessions |
CloudFront logs + S3 + Athena | Logs only get dumped once per day and querying requires writing raw SQL |
- Host the image
ghcr.io/statico/femtostats
wherever you want.- Check out the
docker-compose.yml
file in this repo as an example. - See below instructions on creating a Maxmind account to resolve geographic location at the country level.
- Set a
PASSWORD
env var to protect your dashboard behind a password (the username isadmin
). - Set a
DATA_DIR
env var to store the SQLite database and Maxmind database. (Default is/tmp
.)
- Check out the
- Run
pnpm knex migrate:latest
to initialize the database. - Include the tag
<script defer src="https://your-femtostats.com/data.js"></script>
on the pages you want to track. - For custom event tracking, call
window.femtostats('event name')
To record which country the user has originated from, you need a geoip database. Femtostats will automatically download a free one from Maxmind and refresh it once a week if you do the following:
- Go to https://www.maxmind.com/ and register for a free account
- Under "Manage License Keys", get a license key
- Under "Download Files", scroll to the "GeoLite2 Country" row and click "Get Permalinks". Get the database URL (it will look like
https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-Country&license_key=YOUR_LICENSE_KEY&suffix=tar.gz
) and replaceYOUR_LICENSE_KEY
with your license key. - Set this URL as an environment variable
MAXMIND_GEOLITE2_COUNTRY_URL
By default, Femtostats stores a simple cookie on the client to count unique users and user sessions. You can disable the use of cookies entirely by adding data-cookies="false"
to the <script>
tag you embed on your site. Sessions will still show in the dashboard, but without cookies, the definition of a session changes from "a user's browser session" to "a single page view."
The script tag instructions used to reference script.js
, but uBlock appears to be blocking that.
Requires Node.js 16+ and pnpm. Run pnpm
and pnpm install
.
The default database location is /tmp/stats.db
. Run pnpm exec knex seed:run
to populate the database with some sample data.
This project uses Next.js, React, SWR, Recoil, Chakra UI, and Chart.js.
- Use the better-sqlite3 driver
- Support other databases, maybe, I dunno
- Support UTM campaigns