Last updated: March 26, 2026
Applies to: keta.lol — operated by Nils Becker, Berlin, Germany
The controller within the meaning of the General Data Protection Regulation (GDPR) and the German Telecommunications-Telemedia Data Protection Act (TTDSG) is:
As keta.lol is operated as a non-commercial hobby project with fewer than 20 employees, there is no statutory obligation to appoint a Data Protection Officer. For all privacy inquiries, please contact the controller directly.
We process personal data only:
| Data Category | Purpose | Legal Basis | Retention | |
|---|---|---|---|---|
| Username | Required | Display profile, login | Art. 6(1)(b) GDPR (contract) | Until account deletion |
| Email address | Required | Login, password reset, security notices | Art. 6(1)(b) GDPR | Until account deletion |
| Password (bcrypt hash, cost factor 12) | Required | Authentication | Art. 6(1)(b) GDPR | Until account deletion |
| Invite code (used by whom) | Required | Abuse prevention | Art. 6(1)(f) GDPR | Indefinitely (anonymised after 1 year) |
| Account creation date | Automatic | Display, badge eligibility | Art. 6(1)(b) GDPR | Until account deletion |
| Display name, bio, profile picture, background video | Voluntary | Public profile | Art. 6(1)(b) GDPR | Until account deletion or manual removal |
Every request to our service processes the following data server-side:
Legal basis: Art. 6(1)(f) GDPR (legitimate interest: IT security, abuse detection, error diagnosis).
Retention: Access logs are automatically deleted after 30 days at most. Suspicious activity logs (attack detection) after 90 days.
When your public profile is visited, we store:
This data is used exclusively to display the profile view count to the profile owner.
Legal basis: Art. 6(1)(f) GDPR (legitimate interest of the profile owner in view statistics).
Retention: Profile view logs are deleted after 90 days at most.
With your consent, we store a randomly generated UUID (keta_vid) in your browser's local storage. This ID:
localStorageLegal basis: §25(1) TTDSG in conjunction with Art. 6(1)(a) GDPR (consent).
Without consent: An ephemeral, non-stored one-time ID is generated. Deduplication uses IP hash only.
Withdraw consent: At any time via Privacy Settings below.
The following file types may be uploaded: profile pictures, background videos, background images, cursor graphics, OG images, audio files, custom button icons.
All uploaded images are re-encoded server-side by Sharp before storage. During this process:
Legal basis: Art. 6(1)(b) GDPR.
Retention: Until account deletion or until the user replaces the file with a new one (old files are deleted immediately).
If you link your Discord account and enable the Discord presence display, our Discord bot receives and stores the following data from Discord:
This data is updated in real time and displayed on your public profile if you have enabled it in profile settings. You can disable the display at any time in your settings.
Legal basis: Art. 6(1)(a) GDPR (consent by activating the feature).
Retention: Until the feature is disabled or the account is deleted. Discord is an independent controller: discord.com/privacy.
If you enable 2FA, a secret TOTP key (Base32-encoded) is stored in our database. This key never leaves our servers in plaintext.
Legal basis: Art. 6(1)(b) GDPR.
Retention: Until 2FA is disabled or account deleted.
During a password reset, a cryptographically secure token (SHA256 hash, 32 bytes of entropy) is stored in the database. The token expires after 1 hour and is deleted immediately upon use. Expired, unused tokens are automatically purged after 2 days.
Legal basis: Art. 6(1)(b) GDPR.
The following table provides an overview of all third-party services we use, their role under GDPR, applicable transfer mechanisms, and the status of Data Processing Agreements (Art. 28 GDPR).
| Service | GDPR Role | Country | Transfer Basis (Art. 44–46) | DPA Required | DPA in Place |
|---|---|---|---|---|---|
| Cloudflare | Processor (Art. 28) | USA | EU–US DPF ✓ + SCCs Module 2 | Yes | ✅ Signed |
| Resend | Processor (Art. 28) | USA | EU–US DPF ✓ + SCCs | Yes | ✅ Signed |
| Discord | Independent Controller (Art. 4(7)) | USA | Discord's own DPF certification | No | N/A |
| Hetzner Online | Processor (Art. 28) | Germany 🇩🇪 | No transfer — EU-only processing | Yes | ✅ Signed |
Cloudflare, Inc., 101 Townsend St, San Francisco, CA 94107, USA.
Role: Data processor under Art. 28 GDPR. Cloudflare acts as a reverse proxy between the internet and our server. All visitor IP addresses and request data pass through Cloudflare before reaching our servers.
Data transmitted: Full IP addresses, HTTP request headers, requested URLs, response metadata. Cloudflare may set technically necessary cookies (e.g. __cf_bm, cf_clearance) for bot detection and DDoS mitigation — these are technically necessary under §25(2) TTDSG and do not require consent.
Legal basis for third-country transfer (Art. 44 GDPR):
Art. 28 DPA: A Data Processing Agreement has been concluded with Cloudflare via the Cloudflare Customer DPA.
Privacy policy: cloudflare.com/privacypolicy · DPA: cloudflare.com/cloudflare-customer-dpa
Resend, Inc., 2261 Market Street #5039, San Francisco, CA 94114, USA.
Role: Data processor under Art. 28 GDPR. Resend processes personal data solely on our behalf and under our instructions.
Data transmitted: Email address of the recipient and the content of transactional emails (password reset links, email verification links, security alert notifications). No marketing emails are sent.
Legal basis for processing: Art. 6(1)(b) GDPR (password reset / email verification — necessary for contract performance); Art. 6(1)(f) GDPR (security notifications — legitimate interest in account security).
Legal basis for third-country transfer (Art. 44 GDPR):
Art. 28 DPA: A Data Processing Agreement has been concluded with Resend. The DPA is available at resend.com/legal/dpa.
Privacy policy: resend.com/legal/privacy-policy · DPA: resend.com/legal/dpa
Discord Inc., 444 De Haro Street, San Francisco, CA 94107, USA.
Role: Independent data controller under Art. 4(7) GDPR. Discord determines the purposes and means of its own data processing independently. Discord is not our processor — no Art. 28 DPA is required or applicable.
When Discord is involved: Only if you voluntarily link your Discord account and/or enable the presence display widget in your profile settings. If you do not use this feature, no data is exchanged with Discord.
Data involved: Discord username, display name, avatar, online status, activity (game, Spotify), custom status. This data is received from Discord via our bot and displayed on your public profile while the feature is enabled.
Legal basis: Art. 6(1)(a) GDPR (your explicit consent by activating the feature). You can withdraw consent at any time by disabling the presence display in your profile settings.
Third-country transfer: Discord is certified under the EU–US Data Privacy Framework (DPF) for its own processing. See Discord DPF entry.
Discord privacy policy: discord.com/privacy
Hetzner Online GmbH, Industriestr. 25, 91710 Gunzenhausen, Germany. (EU/EEA entity)
Role: Data processor under Art. 28 GDPR. Hetzner provides the physical and virtual server infrastructure on which our application and database run.
Data processed: All personal data stored in our database and on our servers (account data, profile content, uploaded files, log files) resides on Hetzner infrastructure.
Third-country transfer: None. All servers are located in Germany (Nuremberg data centre). Processing remains entirely within the EU/EEA. No Art. 44–46 transfer mechanism is required.
Art. 28 DPA: A Data Processing Agreement has been concluded with Hetzner Online GmbH. Hetzner's GDPR documentation and DPA are available at hetzner.com/legal/gdpr.
Privacy policy: hetzner.com/legal/privacy-policy · GDPR / DPA: hetzner.com/legal/gdpr
| Data Category | Retention Period | Automated Deletion |
|---|---|---|
| Account data (email, username, password hash) | Until account deletion | No — triggered by user action |
| Profile content (bio, images, videos, social links) | Until account deletion or manual removal | Partial — replaced files deleted immediately |
| Profile view logs (profile_view_log) | Maximum 90 days | Yes — nightly batch job |
| Access logs (access.log) | Maximum 30 days | Yes — nightly batch job |
| Suspicious activity logs (suspicious.log) | Maximum 90 days | Yes — nightly batch job |
| Security incident log (security_incidents) | Maximum 90 days after resolution | Yes — nightly batch job |
| Password reset tokens | Maximum 2 days after expiry | Yes — nightly batch job |
| Email verification codes | Maximum 3 days after expiry | Yes — nightly batch job |
| Visitor ID (keta_vid) | Until consent is withdrawn (client-side in localStorage) | No — deleted on consent withdrawal |
| Discord presence data | Until feature is disabled or account deleted | No — triggered by user action |
| TOTP key (2FA) | Until 2FA is disabled or account deleted | No — triggered by user action |
You have the following rights against us as the controller at any time:
GET /api/auth/export — available after login in the dashboard (once per 24 hours). Downloads a structured JSON file.DELETE /api/auth/account — password confirmation required. Deletes all database entries and uploaded files.GET /api/auth/export — returns complete JSON with all account, profile, and analytics data.To exercise your rights, contact us via our Discord server. We respond within 30 days (Art. 12(3) GDPR).
We implement the following measures to protect your data:
In the event of a personal data breach that is likely to result in a risk to your rights and freedoms, we will:
Keta.lol is not intended for persons under the age of 16. We do not knowingly collect personal data from persons under 16. If you are aware that a child has submitted data to us, please contact us via our Discord server so we can delete the data without delay.
We reserve the right to update this Privacy Policy to reflect changes to our services or legal requirements. Material changes will be announced via a notice on the website. The date of the last update is shown at the top of this page. Your continued use of the service after a change constitutes acceptance of the revised Privacy Policy.
Competent supervisory authority (right to lodge a complaint under Art. 77 GDPR):
Berlin Commissioner for Data Protection and Freedom of Information