Privacy

A small, first-party analytics system.

This website measures aggregate traffic so I can understand which portfolio pages are useful. It records the page visited, referring website, an approximate city and country, and broad device, operating-system, and browser categories.

When a page is viewed, the server briefly processes the network IP address to create an anonymous identifier that changes every day. The IP address is also sent over an encrypted connection to ipwho.is for approximate city-level geolocation. The raw IP address is not stored in this website's database.

Device categories such as desktop, mobile, or tablet and software families such as Windows or Safari are estimated from information the browser sends directly to this website, including its user-agent string and, when available, basic platform, browser-brand, and mobile-device hints. The server briefly processes this information for classification and the daily anonymous identifier. A yes/no touch-device hint helps distinguish Apple tablets that report themselves as Macs. Only the resulting categories are stored, not the raw user-agent string, exact software versions, hardware models, touch-point counts, or screen dimensions. These estimates may be inaccurate when a browser masks its identity or requests desktop sites.

The database retains daily anonymous visit records, timestamped page-view histories, and aggregate counts. Page views within a UTC day are grouped under that day's anonymous identifier so I can review which pages were explored, their order, and the first and last recorded visits. Query strings and URL fragments are removed. These identifiers change daily and are not used to link a person's history across days. The system does not use advertising cookies, cross-site tracking, browser fingerprinting, or attempt to identify individual visitors. Browsers that send the Do Not Track signal are excluded.

Request limits and retention

To limit automated requests, the server also keeps short-lived request counts keyed by a secret hash of the network address. These counters expire after 5–15 minutes and are scheduled for deletion separately from visit history. Raw addresses, passwords, and verification tokens are not stored in these counters. Unrecognized page paths are grouped as 404 traffic. Analytics history is removed manually; there is no automatic history-retention period.

Email verification

Unlocking my email address loads Google reCAPTCHA to help prevent automated scraping. Google processes browser and network information to verify the request. The email address is returned only after the server validates that verification. See Google's privacy policy.

Location derived from an IP address is approximate and can be incorrect, particularly when using mobile networks, corporate networks, proxies, or VPNs. You can contact me through the contact page with questions about this data.