Hoe werkt het allemaal? 🐾
We leggen het zo simpel mogelijk uit — alsof je het aan je oma uitlegt (met liefde ❤️)
Stel je voor: je bent in een café. Je hebt een geheime crush op iemand, maar je durft het niet te zeggen. MySecretCrush is als een discreet hondje dat tussen jullie heen en weer loopt — alleen als jullie allebei interesse tonen, brengt het een berichtje over. Geen GPS, geen namen, geen gedeelde gegevens totdat er een match is. Punt.
Profiel aanmaken
Naam, leeftijd, foto, voorkeuren. Versleuteld & beveiligd in de EU via Supabase.
Beacon Mode aan
Je telefoon zendt een anonieme Bluetooth-code. Geen naam, geen GPS. Wisselt elke 5 min.
Stuur een crush
Zie je iemand op de radar? Stuur een geheime crush. Zij weten het niet — tenzij zij jou ook crusen.
Match! Dan chatten
Alleen bij wederzijdse interesse worden jullie gekoppeld. Pas dán kun je berichten sturen.
Jij blijft de baas
Account verwijderen? Één tik in Settings. Alles weg, direct. Abonnement annuleren inbegrepen.
Verwerkingsregister (RoPA) 📋
Elke wet zegt: schrijf op wat je met gegevens doet. Hier is ons eerlijke overzicht.
Stel je een dagboek voor waarin je elke dag opschrijft: "Vandaag heb ik X gedaan met Y's gegevens, omdat Z." Dat dagboek is een verwerkingsregister. De wet (AVG, artikel 30) zegt dat wij dat verplicht moeten bijhouden. Dus dat doen we. Hier is het.
| Wat | Waarom | Rechtsgrond | Hoe lang |
|---|---|---|---|
| E-mailadres, wachtwoordhash | Om je account te maken en in te loggen | Contract | Account-duur + 2 jaar |
| Geboortedatum | Controleren dat je 18+ bent | Contract | Account-duur |
| Push-token (voor meldingen) | Jou een notificatie sturen bij een match | Contract | Tot uitloggen of verwijderen |
| IP-adres bij inlogpogingen | Fraudedetectie, beveiliging | Legitiem belang | 12 maanden |
| Wat | Waarom | Rechtsgrond | Hoe lang |
|---|---|---|---|
| Naam/bijnaam, leeftijd, bio, foto's | Jouw profiel tonen aan potentiële matches | Contract | Zolang account actief |
| Geslacht, voorkeur (looking for) | Relevante matches tonen | Zolang account actief | |
| Crush-acties (sturen/ontvangen) | Wederzijdse matches bepalen | Contract | Zolang account actief |
| Wat | Waarom | Rechtsgrond | Hoe lang |
|---|---|---|---|
| Anoniem BLE-token (willekeurig, wisselend) | Jouw aanwezigheid detecteren zonder identiteit | Sessieduur (max 15 min) | |
| Beacon aan/uit tijdstempel | Wanneer je actief was in de buurt | Contract | Zolang account actief |
Je telefoon fluistert elke 5 minuten een ander willekeurig woord (token). Andere telefoons in de buurt horen dat woord, maar weten niet van wie het is — pas als er een match is, koppelt onze server de namen aan elkaar. Jij bent volledig anoniem tot het moment van een wederzijdse match. Geen GPS. Nooit.
| Wat | Waarom | Rechtsgrond | Hoe lang |
|---|---|---|---|
| Berichtinhoud (tekst, gif's) | Communicatie tussen matches | Contract | 365 dagen actief, daarna gearchiveerd |
| Leesbevestigingen, tijdstempels | Tonen wanneer bericht gelezen | Contract | Zolang chat actief |
| Wat | Waarom | Rechtsgrond | Hoe lang |
|---|---|---|---|
| Stripe klant-ID, abonnementsstatus | Beheer van premium toegang | Contract | 7 jaar (belastingwet) |
| Betaalbedragen, transactie-ID | Boekhouding en facturatie | Wettelijke plicht | 7 jaar |
Wij zien nooit jouw creditcardnummer. Dat gaat rechtstreeks naar Stripe, een gecertificeerd betaalbedrijf (PCI-DSS Level 1 — de hoogste graad). Wij slaan alleen een klantreferentie op. Als Stripe gehackt wordt, hebben ze niet jouw kaartgegevens van ons — want wij hebben ze zelf niet.
Gegevensbeschermingseffectbeoordeling (DPIA) 🔍
Een DPIA is een verplichte risicoanalyse. Wij hebben hem uitgevoerd. Hier zijn de resultaten.
Stel je voor dat je een nieuw recept wil koken, maar je vraagt je af: "Kan iemand allergisch zijn? Kan er iets misgaan met het fornuis?" Een DPIA is exact dat — maar dan voor privacy. Je vraagt: "Wat kan er fout gaan met de gegevens van gebruikers, en wat doen we eraan?" De wet verplicht dit voor apps die gevoelige gegevens verwerken — zoals een dating-app. Dus wij deden het gewoon.
We verwerken alleen wat strikt noodzakelijk is voor de dienst:
- ✅ Geen GPS — we gebruiken BLE (Bluetooth) met anonieme tokens
- ✅ Geen contacten — we lezen je telefoonboek nooit
- ✅ Geen analytics-SDK's — we volgen je gedrag niet voor advertenties
- ✅ Geen microfoon (RECORD_AUDIO permission verwijderd — april 2026)
- ✅ Profielgegevens zijn enkel wat jij zelf invult
Datalek profielen
Mitigatie: bcrypt wachtwoorden, HTTPS, Supabase RLS, cascadegewijs verwijderen bij account-delete
BLE locatie-inferentie
Mitigatie: token wisselt elke 5 minuten, geen GPS, anoniem tot match
Ongeautoriseerde admin-toegang
Mitigatie: verplichte TOTP 2FA, account lockout na 10 pogingen, volledige audit-log
Berichten als platte tekst
Mitigatie: HTTPS versleuteling onderweg, auth vereist. End-to-end encryptie staat op de roadmap.
Minderjarige gebruikers
Mitigatie: 18+ bevestiging bij registratie (frontend) + backend API-controle (age < 18 → HTTP 400). Twee-laags technische handhaving geïmplementeerd (april 2026).
Verlopen inactieve accounts
Mitigatie: zelf-verwijder knop beschikbaar, jaarlijkse beoordeling van inactieve accounts.
Na de beoordeling concluderen we dat:
- De verwerking noodzakelijk en proportioneel is voor de dienst
- Passende maatregelen zijn getroffen voor de geïdentificeerde risico's
- Geen voorafgaande raadpleging bij de AP vereist — resterende risico's zijn aanvaardbaar
- Leeftijdsverificatie is technisch geïmplementeerd (frontend + backend, april 2026) — niet langer open
- Eén openstaand roadmap-item: end-to-end berichtversleuteling — wordt in 2026 opgepakt
Volgende DPIA-review: april 2027, of eerder als de gebruikersbasis 10.000+ bereikt.
Functionaris Gegevensbescherming (FG/DPO) 👤
Hebben we een FG nodig? We zochten het uit. Hier is het eerlijke antwoord.
Een Functionaris Gegevensbescherming (FG, of DPO in het Engels) is als een interne politieagent voor privacy. Ze controleren of het bedrijf zich aan de regels houdt, zijn aanspreekpunt voor gebruikers en de toezichthouder (de AP), en mogen niet ontslagen worden voor het doen van hun werk. De wet verplicht een FG bij bepaalde organisaties — maar niet alle.
| Criterium (Artikel 37) | Van toepassing? | Reden |
|---|---|---|
| Overheidsinstelling | ❌ Nee | Privaat bedrijf |
| Grootschalige syst. monitoring | ❌ Nee | Geen tracking, geen gedragsprofilering |
| Bijzondere categorieën op grote schaal | ⚠️ Gedeeltelijk | Seksuele oriëntatie-data WEL aanwezig, maar gebruikersbasis is <1.000 — niet 'op grote schaal' |
Privacyvragen, inzageverzoeken, of klachten stuur je naar:
E-mail: info@mysecretcrush.app
We reageren binnen 30 dagen. Ben je het niet eens met ons antwoord? Dan kun je een klacht indienen bij de Autoriteit Persoonsgegevens (autoriteitpersoonsgegevens.nl).
Beveiligingsvoortgang 🛡️
Wat hebben we al gedaan, en wat staat er nog op de lijst?
Welke wetten gelden er? 📜
Elke wet die voor ons geldt, plus hoe we eraan voldoen.
| Regelgeving | Wat is het? | Status | Hoe wij voldoen |
|---|---|---|---|
| AVG / GDPR EU 2016/679 |
Europese privacywet voor persoonsgegevens | ✅ Actief | Toestemming bij registratie, RoPA, DPIA, FG-beoordeling, zelf-verwijder, dataportabiliteit |
| ePrivacy Richtlijn 2002/58/EG |
Regels voor cookies en elektronische communicatie | ✅ Actief | App heeft geen cookies. Website-cookie-toestemmingsbanner geïmplementeerd (april 2026). |
| DSA EU 2022/2065 |
Digital Services Act — transparantie voor online platforms | ✅ Actief | Transparantierapport gepubliceerd, moderatiebeleid, contactpunt voor autoriteiten |
| NIS2 / Cyberbeveiligingswet Verwacht Q2 2026 |
Cybersecurityverplichting voor bedrijven in kritieke sectoren | ✅ NIS2-aligned | Buiten verplicht bereik (<50 medewerkers, <€10M). Beveiligingsbeleid, incidentrespons, BCP/DR en leveranciersbeoordeling zijn NIS2-aligned geïmplementeerd. |
| PCI-DSS via Stripe |
Beveiligingsstandaard voor betaalgegevens | ✅ Via Stripe | Stripe is PCI-DSS Level 1 gecertificeerd. Wij slaan geen kaartgegevens op. SAQ-A voltooid (april 2026). |
| Consumentenrecht / BW ACM toezicht |
B2C-abonnement, herroepingsrecht, prijstransparantie | ✅ Actief | 14 dagen herroepingsrecht, duidelijke prijsstelling (€4,95/maand), abonnementsbeheer via Stripe Portal |
| App Store beleid Apple / Google |
Vereisten van platformen voor permissies en dataveiligheid | ✅ Actief | Overbodige RECORD_AUDIO permission verwijderd (april 2026). Data Safety formulier ingevuld. |
| EAA / WCAG 2.1 AA EU 2019/882 · In werking juni 2025 |
European Accessibility Act — digitale diensten toegankelijk voor mensen met een beperking | ✅ Actief | Schermlezer-labels (VoiceOver/TalkBack) op alle schermen. Kleurcontrastproblemen opgelost (min. 4,5:1). WCAG-auditrapport beschikbaar. |
| DSA Art. 28 Bescherming minderjarigen |
Technische maatregelen om minderjarigen te beschermen op onlineplatforms | ✅ Actief | 18+ bevestiging bij registratie (frontend) + harde leeftijdscontrole op API (backend). Twee-laags handhaving. |
| SOX Sarbanes-Oxley Act (VS) |
Financiële verslagleggingswet voor beursgenoteerde VS-bedrijven | N/A | Niet van toepassing — Nederlands privaat bedrijf, niet beursgenoteerd in VS. |
Jouw rechten 💪
Je hebt meer rechten dan je denkt. En je kunt ze allemaal uitoefenen — in de app of via e-mail.
Je kunt altijd opvragen welke gegevens wij van je hebben. Gebruik de "Download mijn gegevens" knop in de app (Settings → Jouw Gegevens), of mail ons.
Pas je profiel aan in de app, of mail ons als er iets in onze systemen niet klopt. We corrigeren het binnen 30 dagen.
In de app: Settings → Jouw Gegevens → Account verwijderen. Je account, profiel, berichten en crush-geschiedenis worden direct en permanent verwijderd. Je Stripe-abonnement wordt automatisch opgezegd.
Gebruik "Download mijn gegevens" in de app. Je krijgt een JSON-bestand met alle gegevens die we van je hebben: profiel, berichten (laatste 12 maanden), crush-geschiedenis, instellingen.
Verwerkersovereenkomsten (DPA's) 🤝
We werken samen met externe partijen die jouw gegevens verwerken. Hier is wie ze zijn, wat ze doen, en hoe we ze aan de AVG houden.
Als wij een ander bedrijf inschakelen om iets met jouw gegevens te doen (e-mails versturen, betalingen verwerken, de server draaien), dan zijn zij een "verwerker". De wet zegt: maak een afspraak op papier (of digitaal) dat zij ook netjes met die gegevens omgaan. Dat papier heet een verwerkersovereenkomst (DPA in het Engels). Hier zijn al onze verwerkers.
| Verwerker | Rol | Welke data | Certificaten | DPA-status |
|---|---|---|---|---|
| Stripe Inc. stripe.com |
Betalingsverwerking | Stripe klant-ID, abonnementsstatus. Geen kaartgegevens bij ons. | PCI-DSS Level 1 ✅ SOC 2 Type II ✅ ISO 27001 ✅ |
Geaccepteerd via ToS |
| Supabase Inc. supabase.com |
Database hosting (alle gebruikersdata) | Profielen, berichten, matchgeschiedenis, instellingen | SOC 2 Type II ✅ | Geaccepteerd via ToS |
| Railway Corp. railway.app |
Serverhosting (backend API) | Applicatielogs, omgevingsvariabelen | SOC 2 in progress | Gedekt door ToS |
| Resend Inc. resend.com |
Transactionele e-mail | E-mailadres, naam, e-mailinhoud | SOC 2 ✅ | Geaccepteerd via ToS |
| Expo / EAS expo.dev |
App-bouw & pushmeldingen | Push-tokens, meldingspayloads | – | Gedekt door ToS |
| Giphy Inc. giphy.com |
GIF-zoekfunctie (server-naar-server) | Zoektekst — geen gebruikers-IP doorgestuurd | – | Eigen privacybeleid |
Beveiliging van jouw gegevens 🔐
Welke technische en organisatorische maatregelen nemen wij om jouw data te beschermen?
Stel je voor dat jouw gegevens in een kluis zitten. Wij zorgen dat: (1) alleen jij de sleutel hebt, (2) iedereen die de deur wil openen eerst bewijst wie hij is, (3) we bijhouden wie er wanneer bij de kluis was, en (4) als er iets misgaat, we het repareren en jou én de overheid vertellen wat er gebeurde. Dat is in de kern wat beveiliging betekent.
| Maatregel | Hoe wij dit doen | Wettelijke basis |
|---|---|---|
| Wachtwoordbeveiliging | bcrypt hashing (kostenfactor 12) — wachtwoorden zijn nooit leesbaar opgeslagen | GDPR Art. 32 |
| Versleutelde verbindingen | TLS 1.2+ op alle endpoints — data in transit is versleuteld | GDPR Art. 32 · NIS2 |
| Database versleuteling | AES-256 at rest via Supabase (Frankfurt datacenter) | GDPR Art. 32 |
| Toegangsbeveiliging admin | Verplichte TOTP multi-factor authenticatie — geen uitzonderingen | NIS2 Art. 21 · GDPR Art. 32 |
| Account lockout | Account geblokkeerd na 10 mislukte inlogpogingen | GDPR Art. 32 |
| Rate limiting | Inlogpogingen, crush sturen en MFA zijn beperkt per tijdseenheid | NIS2 Art. 21 |
| Beveiligingslogboek | Alle login-activiteit, accountwijzigingen en admin-acties worden gelogd | NIS2 Art. 21 · GDPR Art. 32 |
| Minimale dataopslag | Geen GPS, geen tracking SDK's, geen advertentienetwerken | GDPR Art. 5(1)(c) |
| Leveranciersbeveiliging | Alle leveranciers beoordeeld op risiconiveau; hoog-risico leveranciers jaarlijks herzien | NIS2 Art. 21(2)(d) |
| Incidentrespons | Gedocumenteerde procedure; AP-melding binnen 72 uur bij datalek | GDPR Art. 33 · NIS2 Art. 23 |
| Continuïteitsplan | Hersteltiiddoel: 4 uur (RTO). Maximaal dataverlies: 24 uur (RPO) | NIS2 Art. 21(2)(c) |
Betaalbeveiliging 💳
Hoe beveiligen wij jouw betalingen? (Antwoord: dat doet Stripe — kaartgegevens komen nooit op onze servers)
Als jij een abonnement afsluit, sturen wij je door naar de beveiligde betaalpagina van Stripe. Jij typt je kaartgegevens in bij Stripe, niet bij ons. Het is net alsof we zeggen: "Ga je IDpas maar tonen aan de bank — wij kijken bewust niet mee." Wij zien alleen dat de betaling gelukt is, niet hoe jij hebt betaald.
Stripe verwerkt alle kaartdata en is gecertificeerd als de hoogste PCI-beveiligingsklasse ter wereld
Als merchant vallen wij in SAQ-A: wij slaan, verwerken of verzenden zelf geen kaartgegevens
Betalingsmeldingen van Stripe worden cryptografisch geverifieerd — nep-events worden geblokkeerd
iDEAL en SEPA mandaten worden verwerkt via Stripe Checkout — volledig conform PSD2
Leveranciersbeoordeling 🏢
Wij beoordelen al onze technische leveranciers op beveiligingsrisico. Hier is een samenvatting.
De NIS2-richtlijn zegt: het is niet genoeg om zelf veilig te zijn — je moet ook controleren of de bedrijven waarmee je samenwerkt veilig zijn. Wij beoordelen elk kwartaal onze leveranciers op vier factoren: hoe gevoelig zijn de data die ze verwerken, hoe kritisch zijn ze voor onze dienst, hoe gemakkelijk kunnen we overstappen, en welke beveiligingscertificaten hebben ze?
| Leverancier | Risico | Data | Kritisch? | Certificaten |
|---|---|---|---|---|
| Supabase | HOOG | Alle gebruikersdata | Ja — database | SOC 2 Type II |
| Railway | HOOG | Logs, secrets | Ja — backend API | SOC 2 (in progress) |
| Stripe | LAAG | Factureringsdata | Nee | PCI-L1 · SOC 2 · ISO 27001 |
| Resend | MIDDEN | E-mailinhoud | Nee | SOC 2 Type II |
| Expo/EAS | MIDDEN | Push-tokens | Gedeeltelijk | SOC 2 (beschikbaar op aanvraag) |
| Netlify | LAAG | Geen persoonsdata | Nee — alleen website | SOC 2 Type II |
| Giphy | LAAG | Zoektekst (server-server) | Nee | – |
Leeftijdsverificatie 🔞
MySecretCrush is uitsluitend bedoeld voor personen van 18 jaar of ouder. Wij handhaven dit op twee niveaus.
Romantische intenties, expliciete profielfoto's en betaalde abonnementen zijn niet geschikt voor minderjarigen. De Digital Services Act (DSA) en de App Store-beleidsregels verplichten ons om dit technisch af te dwingen — niet alleen in onze algemene voorwaarden te vermelden.
Tijdens de registratie moet elke nieuwe gebruiker drie vakjes aanvinken voordat het account wordt aangemaakt:
- ✅ Ik ga akkoord met het Privacybeleid
- ✅ Ik ga akkoord met de Algemene Voorwaarden
- ✅ Ik bevestig dat ik 18 jaar of ouder ben
De "Account activeren"-knop blijft uitgeschakeld totdat alle drie vakjes zijn aangevinkt. Dit blokkeert de oproep naar onze betalingsverwerker volledig — er wordt geen Stripe-sessie aangemaakt voor een onbevestigde gebruiker.
Onze API weigert profielwijzigingen als een opgegeven leeftijd onder de 18 ligt, ongeacht wat de app stuurt:
- Leeftijd < 18 ingevoerd → HTTP 400 "Je moet 18 jaar of ouder zijn om deze service te gebruiken"
- Geen leeftijd opgegeven → bestaande profielgegevens worden niet aangeraakt (bestaande gebruikers worden niet geblokkeerd)
- Leeftijd ≥ 18 → opgeslagen zoals normaal
Deze controle staat in de backend onafhankelijk van de frontend — een aangepaste app of API-client kan de controle niet omzeilen.
Toegankelijkheid ♿
MySecretCrush streeft naar WCAG 2.1 AA-naleving overeenkomstig de European Accessibility Act (EAA), die in juni 2025 van kracht is geworden.
De European Accessibility Act verplicht digitale diensten in de EU om toegankelijk te zijn voor mensen met een handicap — inclusief gebruikers van schermlezers (blind), gebruikers met een laag gezichtsvermogen en gebruikers met motorische beperkingen. WCAG 2.1 AA is de internationale maatstaf die hieraan invulling geeft.
Alle interactieve elementen in de app zijn voorzien van beschrijvende toegankelijkheidslabels die worden uitgesproken door VoiceOver (iOS) en TalkBack (Android):
- Registratie-scherm: checkboxen aangekondigd als "Privacybeleid accepteren", "Algemene voorwaarden accepteren", "Bevestig dat je 18 jaar of ouder bent"
- Inlogscherm: e-mail- en wachtwoordvelden, knop voor tonen/verbergen wachtwoord, taalwisselaars
- Profielscherm: fotoslots ("Fotoslot 1–6, foto toevoegen"), genderknoppen aangekondigd als radioknoppen
- Radar-scherm: Beacon-schakelaar met statusbeschrijving ("Beacon-modus is aan — je bent vindbaar")
- Instellingen: alle schakelaars, abonnementskaart, actieknoppen met volledige labels
Labels zijn beschikbaar in zowel Nederlands als Engels, overeenkomstig de taalinstelling van de gebruiker.
Wij hebben een volledige contrastaudit uitgevoerd op alle kleurparen in de app. Drie tekstparen voldeden niet aan de WCAG AA-eis van 4,5:1 voor normale tekst (wit op de primaire rode achtergrond #C02A37). Alle drie zijn opgelost:
| Locatie | Oud contrast | Nieuw contrast | Status |
|---|---|---|---|
| Registratie — prijsbanner subtitel | 3,23:1 (rgba 0,65) | 4,72:1 (rgba 0,87) | ✅ Geslaagd |
| Registratie — activeer-knop subtitel | 3,65:1 (rgba 0,70) | 4,72:1 (rgba 0,87) | ✅ Geslaagd |
| Juridische documenten — documentbadge | 2,70:1 (rgba 0,55) | 4,72:1 (rgba 0,87) | ✅ Geslaagd |
Alle visuele wijzigingen zijn minimaal (kleine verhoging van de opacity) en visueel nauwelijks merkbaar voor ziende gebruikers, terwijl ze een significante verbetering vormen voor gebruikers met een laag gezichtsvermogen.
legal/compliance/wcag_audit.md. Neem contact op via info@mysecretcrush.app voor inzage of voor vragen over toegankelijkheid.
How does it all work? 🐾
We explain it as simply as possible — like telling your grandma (with love ❤️)
Imagine you're in a café. You have a secret crush on someone, but you don't dare say it. MySecretCrush is like a discreet little dog running between you — only if you both show interest does it carry a message across. No GPS, no names, no shared data until there's a match. Simple.
Create a profile
Name, age, photo, preferences. Encrypted & secured in the EU via Supabase.
Enable Beacon Mode
Your phone broadcasts an anonymous Bluetooth code. No name, no GPS. Rotates every 5 min.
Send a crush
See someone on the radar? Send a secret crush. They don't know — unless they crush you back.
Match! Then chat
Only mutual interest creates a match. Only then can you send messages. No one-sided actions visible.
You stay in control
Want to leave? One tap in Settings. Everything deleted instantly. Subscription cancellation included.
Processing Register (RoPA) 📋
The law says: write down what you do with data. Here's our honest overview.
Think of it like a diary where you write down every day: "Today I did X with Y's data, because Z." That diary is a records of processing activities. The law (GDPR Art. 30) says we must keep this. So we do. Here it is.
| What | Why | Legal basis | How long |
|---|---|---|---|
| Name, age, bio, photos | Show your profile to potential matches | Contract | While account active |
| Gender, preference (looking for) | Show relevant matches | While account active | |
| Crush actions (sent/received) | Determine mutual matches | Contract | While account active |
We never see your credit card number. It goes directly to Stripe, a certified payment company (PCI-DSS Level 1 — the highest grade). We only store a customer reference. If Stripe were hacked, they would not have your card data from us — because we never had it.
Data Protection Impact Assessment (DPIA) 🔍
A mandatory risk analysis — we did it. Here are the results.
Imagine you want to cook a new recipe and you ask yourself: "Could someone be allergic? Could something go wrong with the stove?" A DPIA is exactly that — but for privacy. You ask: "What could go wrong with user data, and what do we do about it?" The law requires this for apps handling sensitive data — like a dating app. So we simply did it.
Profile data breach
Mitigation: bcrypt passwords, HTTPS, Supabase RLS, cascade-delete on account removal
BLE location inference
Mitigation: token rotates every 5 minutes, no GPS, anonymous until match
Messages as plaintext
Mitigation: HTTPS in transit, auth required. End-to-end encryption on the roadmap.
Minor users
Mitigation: 18+ confirmation at registration (frontend) + backend API guard (age < 18 → HTTP 400). Two-layer technical enforcement implemented (April 2026).
Data Protection Officer (DPO) 👤
Do we need a DPO? We looked into it. Here's the honest answer.
A Data Protection Officer is like an internal police officer for privacy. They check that the company follows the rules, are the point of contact for users and the regulator (the AP), and cannot be fired for doing their job. The law requires a DPO at certain organizations — but not all.
Which laws apply? 📜
Every regulation that applies to us, plus how we comply.
| Regulation | What is it? | Status | How we comply |
|---|---|---|---|
| GDPR / AVG EU 2016/679 |
European privacy law for personal data | ✅ Active | Consent at registration, RoPA, DPIA, DPO assessment, self-delete, data portability |
| DSA EU 2022/2065 |
Digital Services Act — transparency for online platforms | ✅ Active | Transparency report published, moderation policy, authority contact point |
| NIS2 / Cyberbeveiligingswet Expected Q2 2026 |
Cybersecurity obligations for companies in critical sectors | ✅ NIS2-aligned | Outside mandatory scope (<50 employees, <€10M). Security policy, incident response, BCP/DR plan, and supplier risk register are NIS2-aligned and documented. |
| PCI-DSS via Stripe |
Payment data security standard | ✅ Via Stripe | Stripe is PCI-DSS Level 1 certified. We store no card data. SAQ-A completed (April 2026). |
| Consumer Rights / BW ACM supervision |
B2C subscription, withdrawal rights, price transparency | ✅ Active | 14-day withdrawal right, clear pricing (€4.95/month), subscription management via Stripe Portal |
| ePrivacy Directive 2002/58/EC |
Rules for cookies and electronic communication | ✅ Active | App has no cookies. Website cookie consent banner implemented (April 2026). |
| EAA / WCAG 2.1 AA EU 2019/882 · In force June 2025 |
European Accessibility Act — digital services must be accessible to people with disabilities | ✅ Active | Screen reader labels (VoiceOver/TalkBack) on all screens. Colour contrast issues resolved (min. 4.5:1). WCAG audit report available. |
| DSA Art. 28 Protection of minors |
Technical measures to protect minors on online platforms | ✅ Active | 18+ confirmation at registration (frontend) + hard age check on API (backend). Two-layer enforcement implemented. |
| SOX Sarbanes-Oxley (US) |
Financial reporting law for US-listed companies | N/A | Not applicable — Dutch private company, not US-listed. |
Your Rights 💪
You have more rights than you think — and you can exercise all of them in the app or by email.
You can always ask what data we hold about you. Use the "Download My Data" button in the app (Settings → Your Data), or email us.
In the app: Settings → Your Data → Delete Account. Your account, profile, messages and crush history are immediately and permanently deleted. Your Stripe subscription is automatically cancelled.
Use "Download My Data" in the app. You receive a JSON file with all data we hold: profile, messages (last 12 months), crush history, settings.
Data Processor Agreements (DPAs) 🤝
We work with external parties that process your data. Here's who they are, what they do, and how we keep them GDPR-compliant.
When we hire another company to do something with your data (send emails, process payments, run our server), they are a "processor". The law says: make a written agreement (digital counts) that they also handle that data properly. That agreement is called a Data Processing Agreement (DPA). Here are all our processors.
| Processor | Role | What data | Certifications | DPA status |
|---|---|---|---|---|
| Stripe Inc. stripe.com |
Payment processing | Stripe customer ID, subscription status. No card data with us. | PCI-DSS Level 1 ✅ SOC 2 Type II ✅ ISO 27001 ✅ |
Accepted via ToS |
| Supabase Inc. supabase.com |
Database hosting (all user data) | Profiles, messages, match history, settings | SOC 2 Type II ✅ | Accepted via ToS |
| Railway Corp. railway.app |
Server hosting (backend API) | Application logs, environment variables | SOC 2 in progress | Covered by ToS |
| Resend Inc. resend.com |
Transactional email delivery | Email address, name, email content | SOC 2 ✅ | Accepted via ToS |
| Expo / EAS expo.dev |
App build & push notifications | Push tokens, notification payloads | – | Covered by ToS |
| Giphy Inc. giphy.com |
GIF search (server-to-server) | Search query text — no user IP forwarded | – | Own privacy policy |
How We Protect Your Data 🔐
The technical and organisational measures we take to keep your data safe.
Imagine your data lives in a vault. We make sure: (1) only you have the key, (2) anyone trying to open the door has to prove who they are, (3) we keep a log of who touched the vault and when, and (4) if something goes wrong, we fix it and tell you — and the regulator — what happened. That's the core of what "security" means here.
| Measure | How we implement it | Legal basis |
|---|---|---|
| Password security | bcrypt hashing (cost factor 12) — passwords are never stored in readable form | GDPR Art. 32 |
| Encrypted connections | TLS 1.2+ on all endpoints — data in transit is encrypted end-to-end | GDPR Art. 32 · NIS2 |
| Database encryption | AES-256 at rest via Supabase (Frankfurt data centre) | GDPR Art. 32 |
| Admin access control | Mandatory TOTP multi-factor authentication — no exceptions | NIS2 Art. 21 · GDPR Art. 32 |
| Account lockout | Account blocked after 10 failed login attempts | GDPR Art. 32 |
| Rate limiting | Login, crush sending, and MFA attempts are throttled per time window | NIS2 Art. 21 |
| Security audit log | All login activity, account changes, and admin actions are logged | NIS2 Art. 21 · GDPR Art. 32 |
| Data minimisation | No GPS, no tracking SDKs, no advertising networks | GDPR Art. 5(1)(c) |
| Supplier security | All suppliers assessed on risk level; high-risk suppliers reviewed annually | NIS2 Art. 21(2)(d) |
| Incident response | Documented procedure; AP notification within 72 hours of a data breach | GDPR Art. 33 · NIS2 Art. 23 |
| Business continuity | Recovery time target: 4 hours (RTO). Maximum data loss: 24 hours (RPO) | NIS2 Art. 21(2)(c) |
Payment Security 💳
How do we secure your payments? (Short answer: Stripe does — card data never touches our servers)
When you subscribe, we redirect you to Stripe's secure payment page. You type your card details directly into Stripe — not into our app. It's like we say: "Go show your card to the bank yourself — we deliberately don't look." We only see that payment succeeded, not how you paid.
Stripe handles all card data and holds the highest PCI security certification in the world
As a merchant we qualify for SAQ-A: we never store, process, or transmit card data ourselves
Stripe payment notifications are cryptographically signed and verified — fake events are rejected
iDEAL and SEPA mandates are processed via Stripe Checkout — fully PSD2 compliant
Supplier Risk Assessment 🏢
We assess all our technical suppliers on security risk. Here's a summary.
NIS2 says: it's not enough to be secure yourself — you also need to check that the companies you work with are secure. We assess each supplier on four factors: how sensitive is the data they process, how critical are they to our service, how easy is it to switch, and what security certifications do they hold?
| Supplier | Risk | Data | Critical? | Certifications |
|---|---|---|---|---|
| Supabase | HIGH | All user data | Yes — database | SOC 2 Type II |
| Railway | HIGH | Logs, secrets | Yes — backend API | SOC 2 (in progress) |
| Stripe | LOW | Billing data | No | PCI-L1 · SOC 2 · ISO 27001 |
| Resend | MEDIUM | Email content | No | SOC 2 Type II |
| Expo/EAS | MEDIUM | Push tokens | Partial | SOC 2 (on request) |
| Netlify | LOW | No personal data | No — website only | SOC 2 Type II |
| Giphy | LOW | Search text (server-server) | No | – |
Age Verification 🔞
MySecretCrush is exclusively intended for users aged 18 and over. We enforce this at two independent levels.
Romantic intent, profile photos, and paid subscriptions are not appropriate for minors. The Digital Services Act (DSA) and App Store policies require us to technically enforce this — not merely state it in our Terms of Service.
During registration, every new user must check three boxes before the account is created:
- ✅ I agree to the Privacy Policy
- ✅ I agree to the Terms of Service
- ✅ I confirm I am 18 years of age or older
The "Activate account" button remains disabled until all three boxes are checked. This fully blocks the call to our payment processor — no Stripe session is created for an unconfirmed user.
Our API rejects profile updates if a supplied age is below 18, regardless of what the app sends:
- Age < 18 submitted → HTTP 400 "You must be 18 or older to use this service"
- No age submitted → existing profile data is untouched (existing users are not blocked)
- Age ≥ 18 → saved normally
This check lives in the backend independently of the frontend — a modified app or direct API call cannot bypass it.
Accessibility ♿
MySecretCrush targets WCAG 2.1 AA compliance in line with the European Accessibility Act (EAA), which came into force in June 2025.
The European Accessibility Act requires digital services in the EU to be accessible to people with disabilities — including screen reader users (blind), low-vision users, and users with motor impairments. WCAG 2.1 AA is the international standard that gives this meaning.
All interactive elements in the app carry descriptive accessibility labels announced by VoiceOver (iOS) and TalkBack (Android):
- Registration screen: checkboxes announced as "Accept Privacy Policy", "Accept Terms of Service", "Confirm you are 18 or older"
- Login screen: email and password fields, show/hide password toggle, language switchers
- Profile screen: photo slots ("Photo slot 1–6, add photo"), gender buttons announced as radio buttons
- Radar screen: Beacon toggle with status description ("Beacon Mode is on — you are discoverable")
- Settings: all toggles, subscription card, action buttons with full labels
Labels are available in both Dutch and English, matching the user's language setting.
We conducted a full contrast audit across all colour pairs in the app. Three text pairs failed the WCAG AA requirement of 4.5:1 for normal text (white on primary red background #C02A37). All three have been resolved:
| Location | Old contrast | New contrast | Status |
|---|---|---|---|
| Registration — price banner subtitle | 3.23:1 (rgba 0.65) | 4.72:1 (rgba 0.87) | ✅ Pass |
| Registration — activate button subtitle | 3.65:1 (rgba 0.70) | 4.72:1 (rgba 0.87) | ✅ Pass |
| Legal documents — document badge | 2.70:1 (rgba 0.55) | 4.72:1 (rgba 0.87) | ✅ Pass |
All visual changes are minimal (small opacity increases) and barely perceptible to sighted users, while representing a significant improvement for low-vision users.
legal/compliance/wcag_audit.md. Contact info@mysecretcrush.app for access or with accessibility questions.