Skip to content

Privacy Policy

This policy explains what data this site collects, why, and how it is handled. It covers three areas: the newsletter, site analytics, and comments.

Newsletter subscriptions

When you subscribe to the newsletter, the following data is stored:

  • Email address — used to send you new posts and a one-time confirmation link.
  • Communication language (en or uk) — the language used for confirmation, welcome, and preference-management messages. It comes from the site version where you entered your address and is separate from the languages of posts you receive.
  • Post-language preferences — separate enabled/disabled settings for independently authored English and Ukrainian posts. A newly confirmed subscription enables both languages.
  • Short-lived abuse counters — separate keyed, non-reversible hashes of your IP address and email address are used to limit repeated signups. The original IP and browser User-Agent are not stored in the subscriber record. Counter rows expire after ten minutes.
  • Subscription and consent record — whether your subscription is pending, confirmed, or fully unsubscribed; when those events occurred; and the consent version and timestamp. A partial language opt-out remains confirmed for the language that is still enabled.

An unconfirmed request retains only the email address, requested communication language, and a non-reversible confirmation-link fingerprint for up to 48 hours. Expired pending rows and intent are removed opportunistically and by operational cleanup.

No newsletter data is sold or shared with third parties. Email is sent through a transactional mail provider; that provider receives your email address in order to deliver messages. Operational Telegram notifications contain only an aggregate event type, language, and preference action; subscriber addresses and links are not sent to Telegram.

Unsubscribing

Every recurring email contains a link to a language-preference page. Opening the link does not change anything. On that page, you can immediately stop English posts, stop Ukrainian posts, or stop all posts. You can also use the same signed page to subscribe to both languages again. Submitting the public subscription form again still requires email confirmation and enables both languages only after confirmation.

When all post languages are disabled, a minimal suppression record is retained so the address is not accidentally mailed again. Abuse-detection metadata is removed. You can also send a deletion request to hello@serhiichernenko.com .

Data deletion requests

To request deletion of data associated with your email address, contact hello@serhiichernenko.com . Requests are handled manually within a reasonable time. Optional metadata will be removed; a minimal suppression and consent record may be retained when necessary to honor your opt-out and document compliance.

Analytics

This site uses Cloudflare Web Analytics . It is cookieless and does not track individuals across sites or sessions. No personal data is collected or stored by the analytics system. Cloudflare receives aggregated, anonymous page-view metrics only.

In addition, aggregate server-side product metrics are recorded for newsletter events (subscription pending, confirmed, language-preference changes, and full unsubscribe) using Cloudflare Analytics Engine. Only the following non-identifying dimensions are recorded: event type, communication language (en or uk), normalized event status, and referral source label. Email addresses, IP addresses, tokens, browser information, and any other personal data are never recorded in these metrics. Data is retained for approximately 3 months.

Usage analytics (New Relic)

To understand which posts are read and how the newsletter performs, this site also sends pseudonymous usage events to New Relic , used as an analytics and observability processor. The data is pseudonymous, not anonymous: events carry a random session identifier (described below), so the events of one visit can be grouped together.

A small script in the page sends one event when a page is opened and one when you leave it. Per page view, only the following is recorded:

  • page type (for example post, tag, or home) and a content identifier, such as the post or tag it belongs to;
  • page language (en or uk);
  • the position of the page within the visit (first page, second page, and so on);
  • referrer site category (for example search engine, social network, direct, or internal) — never the referring URL;
  • a campaign label from a fixed list (for example linkedin, telegram, or newsletter); anything else is recorded as other;
  • browser language code (for example en or uk);
  • light or dark theme;
  • country, as determined by Cloudflare;
  • device class: mobile, tablet, or desktop.

When you leave a page, the time you actively spent on it (in seconds, capped at one hour) and your scroll depth (in quarter steps) are recorded.

In addition, the following events are recorded:

  • language switches between the English and Ukrainian versions;
  • the number-of-results category of a site search — never the text you searched for;
  • the site category of an external link you click — never the address.

Newsletter outcome events record the language of the form or page and of communication, the form label, a result category, the preference action (stop English, stop Ukrainian, stop all, or re-subscribe), whether the action came from the web page or from the one-click unsubscribe link in an email, and which post languages remain enabled. No email address is included.

For dynamic (server-rendered) requests, technical health events record the HTTP method, a route template (never the actual address or its parameters), the status code, and the duration. For unrecognized addresses and newsletter endpoints, this is recorded only when the server fails with an error.

To group the events of one visit, a random session identifier is generated in your browser and kept in sessionStorage. It is sent with each usage event, is deleted when you close the tab, is not linked to your email address or newsletter subscription, and cannot be used to link separate visits. If sessionStorage is unavailable, no usage events are sent at all.

Your IP address is used momentarily by Cloudflare to rate-limit the analytics endpoint and is not stored or sent to New Relic. Your browser's User-Agent is read at the moment of the request only to filter out crawlers and determine the device class, and is not stored.

The following is never collected: your email address, IP address, User-Agent string, tokens, search queries, or full page URLs.

Events are stored in New Relic's EU data region for about 30 days. The same events are also briefly kept in Cloudflare Workers logs. No cookies are used, and no localStorage is used for analytics.

Comments (Giscus / GitHub)

Post comments are powered by Giscus , which stores discussions in a GitHub repository using the GitHub Discussions API. Commenting requires a GitHub account. GitHub's own privacy policy governs any data collected through that interaction — see GitHub's Privacy Statement .

Cookies and tracking

This site does not use advertising cookies or cross-site trackers. No third-party advertising networks are present. The only cookies that may be set are functional ones required for the site to operate (e.g. theme preference stored in localStorage, not a cookie). No cookies are used for analytics. A random session identifier is kept in sessionStorage (not a cookie) and is deleted when the tab is closed; localStorage is not used for analytics.

Contact

Questions about this policy: hello@serhiichernenko.com .