Privacy
This is a static-first personal blog. It serves no ads, does no cross-site tracking, and loads no third-party analytics that use cookies or collect personal data. Below is everything that happens with data, and which parts are opt-in.
Anonymous counters (default)
The site keeps public page-view, like, and site-visitor counts in Cloudflare KV. Visitor counting deduplicates on a SHA-256 hash of a random id generated in your browser — no identity attached. When the consent bar is shown and you have not chosen "Accept all", requests omit that id entirely and only count page views.
Performance & traffic measurement (always on, cookieless)
The site uses Cloudflare Web Analytics for page performance (aggregate Core Web Vitals) and traffic counts. It is injected automatically at Cloudflare's edge, sets no cookies, writes nothing to browser storage, collects no personal data, and does no cross-site tracking; data is only ever shown in aggregate.
Optional analytics (consent required)
The site can be configured with Google Analytics 4 and Microsoft Clarity. They load only when both are true: the environment variables are configured, and you explicitly chose "Accept all". With "Essentials only" (or no choice) these scripts never load.
Comments (GitHub)
Comments are powered by Giscus (GitHub Discussions) via a giscus.app iframe; interaction requires a GitHub login and is covered by GitHub's privacy policy.
x402 paid articles (when enabled)
Unlocking a paid article stores the paying wallet address, article path, transaction hash, and timestamp server-side (return visits and revocation), sets an HttpOnly cookie scoped to that article path, and keeps the on-chain receipt in localStorage for display. Wallet interaction happens entirely through your own browser wallet extension; this site never touches keys.
Browser storage inventory
- blog-theme
- Light/dark theme preference
- blog-consent
- Your consent choice (all / essential)
- blog-visitor-id
- Random anonymous visitor id (used only after "Accept all")
- blog-liked:<path>
- Articles you liked (prevents double-likes)
- x402-paid:<path>
- On-chain receipt for a paid article (display only)
- Cookie x402_<hash>
- Paid-article return-visit credential (HttpOnly, path-scoped, 1 year)
Your choices
The consent bar only appears when optional analytics are configured. To change your mind, clear this site's browser storage (or just the blog-consent key) and reload — you will be asked again. Everything works fully in essentials-only mode.