Skip to content

Privacy policy

Summary

  • This page records what I collect when you use khoi.pro, why I collect it, and what you can do about it.
  • I collect only what you send me: a message through the contact form, an email address for the newsletter, a comment or a rating on a post.
  • No tracking cookies, no Google Analytics, and I do not sell data.
  • A small number of infrastructure providers process the data for me; they are listed in the table below.
  • You can ask to see, correct or delete your data at any time through the contact form.

The summary does not replace the full text below.

Contact form

When you send the form on the Contact page, I receive the need you picked, your name, your phone number or email, your organisation if you enter one, your message, the path of the page you sent from, the language and the time of submission. I use this information to reply through the channel you leave.

Technical details

The form is protected by Cloudflare Turnstile and limited to 5 submissions per 10 minutes per IP address. The data goes to my n8n workflow at n8n.ferry.vn; the IP address is not stored with the message. The version of the consent sentence is stored with the message as an audit trail.

Comments

When you comment on a post, I receive a display name, the comment body and an email address if you enter one. The email is never shown publicly and is used only to contact you about that comment. Comments are moderated before they appear.

Technical details

Comments live in the KDIGI CMS at cms.mykdigi.com and are attached to the post. The comment form uses Cloudflare Turnstile; the email address (if any) is visible only to the moderator.

Post ratings

When you rate a post, I store the number of stars and a hash of your IP address to stop duplicate ratings. The hash does not let me read your IP address back.

Email newsletter

Subscribing takes two steps: you send the address, I send a confirmation email, and the subscription starts when you click the link in it. I use the address only to send an email when a post is published, with no advertising and no sharing with anyone else. Every email carries an unsubscribe link and a List-Unsubscribe header so you can leave from your mail client. The confirmation and unsubscribe pages change state only when you press the button; opening a link with a mail scanner changes nothing.

Technical details

The email address and subscription state live in the database of the n8n workflow hosted on Ferry VN's infrastructure; n8n.ferry.vn is shared with other Ferry VN tenants. The stored fields are: email (readable until you unsubscribe), email_hash (SHA-256, the suppression key), locale, the consent version, the source path, the status (pending, confirmed, unsubscribed), the creation, confirmation and unsubscribe times, and the hash and expiry of the confirmation token. Every mail carrying an unsubscribe link has its own token; only the hash of that token is stored, one row per mail tied to an email, so old links keep working. The send counter records the kind of mail, email_hash and the time; the sent-posts ledger records the post id, locale and time. I store no IP address or IP hash for subscribers. Unconfirmed subscriptions are deleted after 7 days; when you unsubscribe, the readable email is removed and only email_hash remains. Send counters are pruned after 30 days; unsubscribe tokens of unsubscribed subscribers are pruned after 12 months. n8n execution data is saved on error only and pruned after 168 hours. Transactional mail (confirmation, unsubscribe) is sent through Cloudflare Email Service from no-reply@mail.khoi.pro. New-post mail is not enabled yet.

The keywords you type are used only to return results in that session. They are not written to server logs, not sent to analytics, and not stored in my database.

Technical details

Search runs on Meilisearch at search.ferry.vn; queries are processed to return results and are not kept. The /tim-kiem/ page does not load the analytics script.

Error monitoring

When a page fails, Sentry receives technical information about the error (error type, code trace, browser) and SigNoz receives filtered logs and traces. I configure both so that form contents, search queries and email addresses are never sent to them.

Cookies and measurement

khoi.pro sets no cookies. Visits are measured with Cloudflare Web Analytics, which uses no cookies and does not track you across other websites; Cloudflare Turnstile may set its own cookies when you use a form; your display choice is kept in localStorage.

Technical details

The two localStorage keys are khoi:theme (light, dark, follow the device) and khoi:transparency (reduce transparency); they stay in your browser and are sent nowhere. The language is part of the path (/ or /en/) and is not stored in a cookie. Cloudflare Web Analytics records the page path without the query string, the referrer, the browser and country class, and performance timings; no cookies, no tracking across sites. Turnstile loads only when you use a comment, newsletter or contact form.

Access data

Like any website, the server receives the browser's HTTP request: IP address, time, path and browser type. Server logs drop the query string and are kept only as long as needed to run the site and investigate incidents.

Technical details

Requests pass through Cloudflare (CDN, DNS, certificates) to my VPS. Application logs go to SigNoz; Sentry receives errors only. I do not build personal behaviour profiles from these records.

Service providers

Provider Service Data involved
Cloudflare Turnstile Stops automated form submissions Verification token and the IP address at verification time
Cloudflare Web Analytics Cookieless traffic measurement Page path without the query string, referrer, browser and country class, performance timings; no cookies
Cloudflare Email Service Sends the newsletter confirmation and unsubscribe mails Recipient email address, transactional mail content
Cloudflare R2 and CDN Stores and serves images, static files and backups Website files; no end-user data
Meilisearch Search Search queries, only while results are returned
KDIGI CMS (cms.mykdigi.com) Blog content, comments, ratings The content you submit
n8n (n8n.ferry.vn) Contact form and newsletter The data in the two rows above
Sentry Error monitoring Technical error data; never form contents, search queries or email addresses
SigNoz Logs and traces Redacted logs; no request bodies

Servers run in Cloudflare data centres and at the VPS provider I use; some providers may process data outside Việt Nam.

Retention

Contact messages stay in the n8n workflow inbox until I have handled them, for at most 24 months. The newsletter keeps an address until you unsubscribe; unconfirmed subscriptions are deleted after 7 days. Comments and ratings stay with the post until you ask for removal. System backups expire after 30 days.

Your rights

You can ask what data I hold about you, ask for a correction or a deletion, and withdraw consent to the newsletter at any time. Send the request through the contact form and pick "Something else"; I reply through the channel you leave.

Pages may link to other websites such as Facebook, LinkedIn, kdigi.vn or ferry.vn. Once you leave khoi.pro, that website's policy applies to the data you give it.

Changes

When the way I handle data changes, I update this page and record the date at the top once the owner has reviewed the content. Material changes are announced by email if you subscribed to the newsletter.