This Privacy Policy explains how Mini's Blog (blog.minipasila.eu) collects, uses, stores, and protects your personal data when you use our blog and comment system.
The data controller for the personal data collected on this blog is the operator of blog.minipasila.eu (the "controller"). The blog is operated as a personal, non-commercial hobby project. For any privacy-related inquiries, data subject requests, or questions about this policy, please contact us at blog@minipasila.eu.
The controller is based in Finland. Where this policy requires a contact address for legal purposes, the email address above serves as the contact point.
We collect only the personal data necessary for the operation of the blog and comment system. The categories of data we collect are:
| Data | Purpose | Legal Basis |
|---|---|---|
| Username | Identify you in comments and on the platform | Contract performance (Art. 6(1)(b) GDPR) |
| Email address | Account verification, password recovery, and communication | Contract performance (Art. 6(1)(b) GDPR) |
| Password (hashed) | Secure authentication — we never store your plain-text password | Contract performance (Art. 6(1)(b) GDPR) |
| Account creation date | Record-keeping and account management | Legitimate interest (Art. 6(1)(f) GDPR) |
You may post comments either as a registered user (logged in) or as a guest (no account required). The data collected is the same in both cases, except that guests do not provide an email address.
| Data | Purpose | Legal Basis |
|---|---|---|
| Username / Nickname | Display with your comment. Guests may provide an optional nickname; if none is given, "Anonymous" is used. Guest nicknames are checked against existing usernames to prevent impersonation. | Contract performance (Art. 6(1)(b) GDPR) for registered users; Legitimate interest (Art. 6(1)(f) GDPR) for guests |
| Comment content | Display on the blog post | Contract performance (Art. 6(1)(b) GDPR) for registered users; Legitimate interest (Art. 6(1)(f) GDPR) for guests |
| IP address | Security, abuse prevention, IP-based banning, and moderation — logged identically for registered users and guests | Legitimate interest (Art. 6(1)(f) GDPR) |
| Timestamp | Display when the comment was posted | Contract performance (Art. 6(1)(b) GDPR) for registered users; Legitimate interest (Art. 6(1)(f) GDPR) for guests |
Guest comments: When you comment without an account, your IP address is stored alongside the comment exactly as it is for registered users, so that abusive guests can be banned by IP or CIDR range.
Automated AI moderation (all comments): Every comment — whether posted by a registered user or a guest (excluding comments posted by administrators) — is processed by our automated AI moderation system before being published. The comment text, the commenter's username or nickname, the blog post title and content, and recent existing approved comments on the same post are sent to NanoGPT (nano-gpt.com), which acts as a data processor on our behalf solely for the purpose of classifying the comment as "allow" or "hold". Comments classified as "hold", or submitted when the moderation API is unavailable, are saved with a pending status and held for manual administrator review; they are not displayed publicly until approved. The data sent to NanoGPT is processed in accordance with NanoGPT's own privacy policy; the specific retention period applied by NanoGPT to the submitted data is governed by their terms and is not contractually fixed by us. Because NanoGPT is an aggregator, the request may be routed to a downstream model provider (such as OpenAI, Anthropic, or Google, among others) depending on which provider fulfils the request, and that downstream provider's logging and retention practices may also apply. The legal basis for this processing is our legitimate interest in preventing unlawful, abusive, or spam content from being published on the blog (Art. 6(1)(f) GDPR). See also section 9 regarding the international transfer involved and section 7.1 for the sub-processor details.
Note on automated decision-making (Art. 22 GDPR): The AI moderation step produces only a preliminary "allow"/"hold" classification. A "hold" result simply queues a comment for ordinary human (administrator) review and never results in an automatic, final rejection with legal or similarly significant effect on you. We therefore consider Art. 22 GDPR not to be engaged; the classification is an administrative aid, not an automated decision producing legal effects.
When you visit a blog post, we record anonymous view statistics. The raw visitor IP is used only in-memory to resolve the country code and is never persisted:
Country code resolution: The country code is resolved entirely locally on our server using an on-disk GeoIP database (MaxMind GeoLite2 format, sourced from the sapics/ip-location-db project). No external API call or third-party lookup is made — your IP address is never sent anywhere to determine your country. The local database is refreshed at least twice per week, as required by the GeoLite2 end-user licence.
| Data | Purpose | Legal Basis |
|---|---|---|
| IP address hash (salted SHA-256) | Deduplicate views from the same visitor per day — the raw IP is never stored | Legitimate interest (Art. 6(1)(f) GDPR) |
| Country code | Aggregate statistics on reader geography | Legitimate interest (Art. 6(1)(f) GDPR) |
| Post slug | Track which posts are viewed | Legitimate interest (Art. 6(1)(f) GDPR) |
| Date and timestamp | Limit counting to one view per visitor per day | Legitimate interest (Art. 6(1)(f) GDPR) |
Requests identified as bots or crawlers (via the User-Agent string) are counted separately from human views and never inflate post view counts:
| Data | Purpose | Legal Basis |
|---|---|---|
| Bot name (from User-Agent) | Identify which crawler accessed a post | Legitimate interest (Art. 6(1)(f) GDPR) |
| IP address hash (salted SHA-256) | Deduplicate bot views per day — the raw IP is never stored | Legitimate interest (Art. 6(1)(f) GDPR) |
| Post slug, date and timestamp | Admin statistics on crawler activity | Legitimate interest (Art. 6(1)(f) GDPR) |
To deter automated abuse of registration, login, and comment submission, a CAPTCHA challenge may be presented on certain forms. Our CAPTCHA is a fully self-hosted, custom-built system running on the same host as this blog. It does not use any third-party service (such as reCAPTCHA or hCaptcha), does not perform any external network request, and does not log or store any personal data. The challenge image is generated on demand and discarded immediately after verification; no IP address, user identifier, or behavioural data is collected by the CAPTCHA component. Because it is self-hosted and local, it involves no sub-processor and no international data transfer.
To protect accounts from brute-force attacks, we track failed login attempts:
| Data | Purpose | Legal Basis |
|---|---|---|
| Lowercased login identifier | Associate attempts with the target account | Legitimate interest — security (Art. 6(1)(f) GDPR) |
| Attempt count, timestamps | Enforce lockout after repeated failures | Legitimate interest — security (Art. 6(1)(f) GDPR) |
Login attempt data is automatically cleared when you successfully log in.
When you are logged in, a server-side PHP session is maintained. To keep you logged in reliably on shared hosting, sessions are stored in our database (not in ephemeral files) along with an explicit expiry timestamp. The session record stores your user ID and admin status and is automatically deleted when it expires or when you log out.
When you like or dislike a blog post or a comment, we record your reaction. Reaction counts are public and visible to everyone; which reaction you gave is visible only to you and to administrators. You do not need an account to react — both registered users and guests (non-logged-in visitors) can like or dislike posts and comments.
Registered users are identified by their user ID. Guests are identified by a salted SHA-256 hash of their IP address (the salt is derived from our server configuration and is not published, so the hash cannot be reversed to recover the raw IP). The raw IP address is never stored for reactions — only the salted hash, exactly as for view tracking (section 2.3). This deduplicates reactions so that one IP address can have at most one reaction (like or dislike) per post or comment.
VPN / shared-IP caveat: Because guest reactions are keyed on the IP hash, visitors sharing the same public IP address — for example, users behind the same VPN exit node, the same corporate NAT, or the same household router — will share a single reaction slot per item. This means a guest may see a like or dislike they did not personally set, or may be unable to react because someone else on the same IP already did. This is an accepted limitation of IP-based guest reactions. If this matters to you, return to the blog and use the Login / Register option in the top bar to react under your own account instead.
| Data | Purpose | Legal Basis |
|---|---|---|
| User ID (registered users) | Enforce one reaction per user per post/comment and display your active reaction to you | Contract performance (Art. 6(1)(b) GDPR) |
| IP address hash (salted SHA-256, guests only) | Deduplicate one reaction per IP address per post/comment for non-logged-in visitors — the raw IP is never stored | Legitimate interest (Art. 6(1)(f) GDPR) |
| Post slug or comment ID | Associate the reaction with the item | Contract performance (Art. 6(1)(b) GDPR) for registered users; Legitimate interest (Art. 6(1)(f) GDPR) for guests |
| Reaction type (like / dislike) | Display aggregate counts and your own reaction | Contract performance (Art. 6(1)(b) GDPR) for registered users; Legitimate interest (Art. 6(1)(f) GDPR) for guests |
| Timestamp | Record-keeping | Legitimate interest (Art. 6(1)(f) GDPR) |
Registered-user reactions and guest reactions are stored in separate database tables and their counts are summed for public display. A registered user and a guest on the same IP address count as two separate reactions.
To protect the platform from abuse, administrators can ban IP addresses (or CIDR ranges) and user accounts:
| Data | Purpose | Legal Basis |
|---|---|---|
| Banned IP / CIDR ranges | Block abusive visitors from commenting or interacting | Legitimate interest — security (Art. 6(1)(f) GDPR) |
| Account ban flag | Prevent banned users from logging in or interacting | Legitimate interest — security (Art. 6(1)(f) GDPR) |
When an administrator sends an email broadcast to users, an audit record is kept. Email broadcasts are used only for important service announcements — for example, privacy policy changes or significant changes to how the blog operates. They are not used for marketing or commercial promotion. The legal basis for sending broadcasts is our legitimate interest in keeping users informed of significant, service-affecting changes (Art. 6(1)(f) GDPR); where any broadcast could be considered direct marketing, it is sent only on the basis of your consent, which you may withdraw at any time. You have an absolute right to object to such emails under Art. 21(2) GDPR — to opt out, reply to any broadcast or contact blog@minipasila.eu and we will exclude you from future broadcasts.
| Data | Purpose | Legal Basis |
|---|---|---|
| Subject, body, recipient count, send/fail counts, sender, timestamp | Audit trail of mass communications sent from the platform | Legitimate interest (Art. 6(1)(f) GDPR) |
The audit log stores aggregate counts, not the list of individual recipients.
We retain your personal data for as long as necessary to provide our services:
As a data subject, you have the following rights under the EU General Data Protection Regulation (GDPR):
To exercise any of these rights, contact us at blog@minipasila.eu. We will respond within one month of receiving your request, as required by Art. 12(3) GDPR. Where requests are numerous or complex, this period may be extended by a further two months; we will inform you of any such extension and the reasons for it within the first month.
You can delete your account at any time by visiting the Account Management page and using the "Delete Account" option. This will permanently remove:
Not removed automatically: your past likes/dislikes on posts and comments are not deleted by self-service account deletion (they are not linked to your username once the account is gone, only to your user ID). If you want your reactions removed as well, please email us (see 6.2) and we will delete them for you.
Guest reactions: If you reacted to a post or comment while not logged in, your reaction is tied to a salted hash of your IP address, not to an account. To request deletion of a guest reaction, email us (section 6.2) with the blog post, whether it was a like or dislike, and an approximate timestamp. Because we store only a salted hash of the IP (not the raw IP), we may ask you to confirm the IP address or CIDR range you were using so we can match and verify the reaction before removing it.
This action is irreversible.
If you cannot access your account, or if you wish to request deletion of view tracking data, bot tracking data, or your past reactions, send an email to blog@minipasila.eu with your username and/or email address. We will process your request promptly.
Guest comment deletion: If you posted a comment as a guest (no account), there is no account to identify you by. To help us locate and verify your comment, please include in your email: the blog post it was posted on, the nickname you used (or that you posted as "Anonymous"), and a rough timestamp of when you posted it. Because we store the IP address alongside every comment, we may ask you to confirm the IP address (or a CIDR range you were using) so that we can verify you are the author before deleting the comment. This verification step exists to prevent third parties from impersonating you to have your comments removed.
Human and bot view tracking data is anonymized (only a salted IP hash, country code, and/or bot name are stored — the raw IP is never persisted). If you wish to have your view tracking data deleted, please contact us at blog@minipasila.eu and we will remove the relevant records.
This blog is hosted on OVHcloud infrastructure. OVHcloud acts as a data processor on our behalf and processes personal data only under our instructions in accordance with their Data Processing Agreement and applicable law.
OVHcloud's data centers are secured with industry-standard physical and technical safeguards. For more information about OVHcloud's handling of personal data, please refer to:
As described in section 2.2, comment data is sent to NanoGPT (nano-gpt.com) for automated content classification. NanoGPT acts as a sub-processor for the sole purpose of moderating comments. The data transmitted is limited to what is necessary for classification (comment text, username/nickname, post title, post content excerpt, and recent approved comments on the same post). The retention and processing of that data by NanoGPT is governed by NanoGPT's own privacy policy and terms of service, and is not fixed by a data processing agreement between us and NanoGPT — we therefore do not assert a specific retention period and instead refer you to NanoGPT's documentation. Because NanoGPT is an API aggregator, a given request may be fulfilled by any one of several downstream model providers (for example OpenAI, Anthropic, or Google), depending on availability and routing. The specific downstream provider for any given request is not known to us in advance. Each downstream provider may apply its own logging and retention practices as set out in its respective privacy policy. For more information, see NanoGPT's privacy policy and terms of service.
As described in section 2.5, the CAPTCHA challenge used on this blog is a custom, self-hosted system running on the same host as the website. It is not a sub-processor: it involves no third party, stores no personal data, and performs no external network calls. No separate transfer or sub-processor disclosure is required for it.
As described in section 2.3, country codes are resolved locally on our server from an on-disk GeoIP database. No third-party sub-processor is involved in the resolution itself. The database file is periodically downloaded from the open-source sapics/ip-location-db project on GitHub; this download is a file fetch and does not transmit any personal data (in particular, no visitor IP is ever sent). The database is refreshed at least twice per week in accordance with the GeoLite2 end-user licence terms.
This blog uses a single PHP session cookie (PHPSESSID) to maintain your login state. The corresponding session data is stored server-side in our database (not in browser cookies or third-party services). No third-party analytics, advertising cookies, or tracking pixels are used. The session cookie is deleted from your browser when you log out or when it expires; the server-side session record is deleted at the same time.
Your data is stored on OVHcloud servers located in the European Union. OVHcloud acts as our hosting processor within the EU/EEA.
International transfer to the United States (NanoGPT and downstream providers): When your comment is processed by the automated AI moderation system (section 2.2 / 7.1), the comment text, your username or nickname, the post title and content, and recent approved comments on the same post are transmitted to NanoGPT, a service operated from the United States. NanoGPT's terms of service specify that the service is governed by the laws of the State of California, USA, with courts in San Francisco, California. This constitutes a transfer of personal data outside the EU/EEA to a third country (the United States).
Transfer safeguard: We rely on Standard Contractual Clauses (SCCs) — the European Commission's standard data protection clauses for the transfer of personal data to third countries — as the safeguard for this transfer under Chapter V GDPR. We have not been able to verify that NanoGPT is certified under the EU-US Data Privacy Framework, and we therefore do not rely on such certification; if NanoGPT or a downstream provider is in fact DPF-certified, that certification supplements, but does not replace, the SCCs. Because NanoGPT is an aggregator, the transferred data may in turn be routed to a downstream model provider (such as OpenAI, Anthropic, or Google) located in the United States or elsewhere; the specific downstream provider for any given request is not known to us in advance. Each downstream provider that comes into contact with the payload should be regarded as an additional (sub-)transfer, and the SCCs are intended to flow down to such sub-processors. We do not have direct contractual visibility into NanoGPT's downstream providers; their respective privacy policies and any DPF certifications they hold govern their handling of the data, and we refer you to those documents for details.
What is transferred, and minimisation: Only the data described in section 2.2 is sent, and only at the moment a comment is submitted for moderation. No account email addresses, no password hashes, and no IP addresses are sent to NanoGPT or its downstream providers. The transfer is limited to what is necessary to obtain a content classification.
No other international transfers: Apart from the AI moderation transfer above, we do not transfer personal data outside the EU/EEA. The CAPTCHA (section 2.5/7.2) and the GeoIP lookup (section 2.3/7.3) are fully local and involve no transfer. View tracking, bot tracking, session, login-attempt, reaction, and ban data all remain on our EU-hosted infrastructure.
We may update this Privacy Policy from time to time. When we do, we will update the "Last updated" date at the top of this page. Significant changes — particularly changes to what data is collected, to retention, or to international transfers — may also be communicated to affected users via an email broadcast (see section 2.10) in addition to being posted on the blog.
By using this blog, you acknowledge that you have read this Privacy Policy and agree to the collection and processing of your personal data as described herein.
If you have any questions about this Privacy Policy or how we handle your personal data, please contact us at:
Email: blog@minipasila.eu
© 2026 minipasila. All rights reserved.