Privacy
What this site records
Visit analytics
Self-hosted Umami 3.4, running on this site's own server.
Pages load a small analytics script from this site itself (/x/s.js), which reports page views and a few named clicks to /x/api/send, also on this site. Nothing is loaded from or sent to anyone else. No cookies are set.
To count visits, Umami derives a session id from a hash of the shortened address, your browser's user agent and a salt that changes every month. The hash is not an address and cannot be turned back into one.
Recorded
- Page
- The path and query string of each page you view, including campaign codes such as ?ref= or utm_* in links I share.
- Referrer
- The page that linked here, when your browser sends it.
- Device
- Browser, operating system, device type, screen size and language.
- Location
- Approximate country, region and city, looked up by the server from the truncated address with a bundled GeoLite2 database.
- Clicks
- Named events for clicks on the CV, the email address, LinkedIn, GitHub, project pages, demos and other external links (the link's host, never its full address). A click is not a completed action: opening your mail client is not an email sent.
Never recorded
- Your full IP address. nginx shortens it (IPv4 to its /24 network, IPv6 to its /48) before the analytics service sees it, and the analytics database stores no address at all.
- Cookies, or any identifier stored in your browser. The only thing this site writes there is your opt-out, if you choose it.
- Tracking across other sites, fingerprinting, advertising, or data shared with third parties.
- Any attempt to work out who you are or who you work for. A shortened address belongs to a network, not a person, and nothing here tries to resolve it.
Retention and access
- Analytics events and sessions are deleted after 365 days, automatically, once a day.
- Only I can see them, through an encrypted SSH tunnel to the server. There are no public dashboards, share links or exports.
- The server's own access log keeps the same shortened addresses and is rotated by size, so it holds only recent traffic.
Opting out
If your browser sends Global Privacy Control or Do Not Track, no analytics events are sent from it. You can also opt out here; the choice is stored in this browser only.
Checking your choice…
Operational records
To measure whether the site works, nginx sends my service opsledger one record per request: the time, the method, the path (at most 192 characters), the status code, how long it took, and three yes-or-no flags (an automated user agent, a Next.js navigation request, and my own monitoring probe). The record contains no address, no user agent, no query string and no referrer.
opsledger keeps only per-minute totals of these records, for 35 days, and publishes nothing but aggregated daily reports.
Cloudflare
Requests reach this server through Cloudflare's CDN, which processes them, including full addresses, under its own policy. Its own analytics features are switched off. The reasons are in ADR-0011.
Questions about any of this: ali@aliakbari.dev.