Updated 1 October 2026. These are Rory Bain’s personal websites. For questions, requests or objections, contact rorydbain@gmail.com.

Simple website statistics

I count successful public page requests on the server to understand which content is useful. There is no analytics script, tracking cookie, local-storage identifier or browser fingerprint. The counter does not identify visitors, link visits into sessions, or match people between sites. No consent banner is needed for this implementation’s basic server statistics; this is not a claim that every form of server-side analytics is exempt from consent.

Requests with normal browser document-navigation headers contribute to separate daily totals for the site, public page, referring domain, country, broad device type and browser family. Country is approximate and provided by the hosting platform. Browser/device groups are inferred from ordinary request headers. Referrers are reduced to a domain, without paths, queries or subdomains. Query strings and private photo tokens are excluded. The counter does not save individual events, IP addresses, full browser headers, exact visit times or precise locations. Small country/device/browser groups with fewer than five page loads are hidden in reports.

Recognised bots and requests without normal browser-navigation headers are separated from the main page counts. These contribute only to daily site totals labelled known bots or uncertain requests, without page, referrer, country, device or browser breakdowns. Diagnostic totals are capped at 1,000 for each class per day across the sites. Earlier broad-filter counts are preserved under their own label. Prefetch requests, administration and privacy pages are excluded entirely. Do Not Track and Global Privacy Control request headers also exclude a request from statistics. These are estimates of page loads, not exact counts of people; cached browser restores and unrecognised bots can affect the totals. This processing serves my legitimate interest in maintaining and improving these personal sites with minimal information. You may object by contacting me.

Retention and hosting

Daily aggregates are kept for 90 days. Older site totals are rolled into monthly totals containing only the site, month, traffic class and count, kept indefinitely for comparisons over many years. There are no visitor records to retrieve from those totals.

I use Vercel and Cloudflare for site delivery, with GitHub Pages during the personal site’s migration or as a fallback. The Vercel counter derives statistics in Frankfurt. Aggregates are sent through a Cloudflare Worker to an EU-jurisdiction Cloudflare D1 database. Vercel’s CDN and Cloudflare’s Worker gateway operate globally; this is best-effort European analytics processing and storage, not an EU-only guarantee for all infrastructure or provider logs. Hosting providers necessarily receive requests including IP addresses and headers for site delivery and security, under their own retention and international transfer arrangements. Cloudflare R2 stores the photographs. The photo administration area uses a necessary sign-in cookie.

Your rights and photographs

Where personal information is processed, you can request access, correction, deletion or restriction, object to processing and request portability where applicable. Contact me with a privacy question or to request removal of a photograph. You may also complain to the UK Information Commissioner’s Office or your local EU data protection authority.