Skip to main content
L'architecture · /security

Ce qui vous protège précisément.

Certaines promesses ici sont des propriétés du système. Les autres sont écrites noir sur blanc. Nous vous indiquons laquelle est laquelle.

Version du document 2.0Dernière révision : 1er juillet 2026 · Prochaine révision : 1er janvier 2027
Les cinq garanties
Garantie 01

Votre partenaire ne voit que ce que vous avez tous les deux accepté.

Quand les deux partenaires ont terminé, la comparaison s'exécute sur nos serveurs, dans un contexte privilégié que aucun navigateur ne peut atteindre. Ce qui revient à votre client — et à celui de votre partenaire — est l'intersection uniquement : les choses que vous avez tous les deux acceptées ou peut-être. Vos réponses non correspondantes ne sont pas stylisées et cachées, pas flouées, pas paywalled. Elles ne sont simplement jamais envoyées à votre partenaire.

révélation côté serveur · ce que reçoit chaque client
// When both partners have submitted, on the server:
async function computeReveal(partnershipId) {
  // privileged server context — no client can reach into this
  const [a, b] = await loadBothResponseSets(partnershipId);

  const overlap = sharedQuestions
    .filter(q => isMutual(a[q.id], b[q.id]));
    // mutual = yes·yes, yes·maybe, maybe·maybe

  return overlap; // the only thing either client is ever sent
}
Garantie 02

Chiffré en transit, chiffré au repos, limité à vos lignes.

Vos réponses voyagent via TLS 1.2 ou supérieur et sont stockées dans Supabase Postgres, chiffrées au repos avec AES-256 — clés gérées par la plateforme, rotées par des personnes dont le seul travail est cela. Au-delà du chiffrement, la sécurité au niveau des lignes limite chaque requête utilisateur à vos propres lignes : votre session ne peut pas lire les réponses de votre partenaire ou de quelqu'un d'autre. Ce que nous n'avons pas, c'est le chiffrement côté client, et nous ne prétendrons pas le contraire — les protections ici sont du genre classique, essentielles.

sécurité au niveau des lignes · extrait de la politique
-- row-level security · every user-facing table
alter table quiz_responses enable row level security;

create policy "own rows only" on quiz_responses
  for select using (auth.uid() = user_id);

-- in transit: TLS 1.2+ · at rest: AES-256 (platform-managed)
-- your session token cannot read your partner's rows
Garantie 03

L'exportation et la suppression se font en un clic, dans Paramètres.

Aucun courriel n'est requis. L'exportation vous donne un téléchargement JSON instantané de tout ce que nous détenons — profil, réponses, correspondances, journal. La suppression est définitive et irréversible : elle supprime votre utilisateur d'authentification, se propage à travers chaque table qui vous référence, et annule votre abonnement Stripe dans le même flux. Les données supprimées disparaissent de nos sauvegardes quotidiennes à l'expiration de la fenêtre de rétention de 30 jours. Il n'y a pas d'archive, et il n'y a pas de « au cas où vous changeriez d'avis » — si vous changez d'avis, vous vous inscrivez à nouveau.

paramètres · exportation et suppression, tel que livré
// Settings → Export my data (instant JSON download)
GET /api/account/export
// → profile, responses, matches, journal

// Settings → Delete my account (permanent, immediate)
async function deleteAccount(userId) {
  await cancelStripeSubscription(userId);
  await auth.admin.deleteUser(userId); // cascades through every table
}
// Daily backups expire on a 30-day window. No archive.
Garantie 04

Nous n'utiliserons jamais vos réponses pour entraîner des modèles d'IA.

Ce n'est pas une engagement vague que nous pourrions reconsidérer lors d'une réunion stratégique. C'est une restriction écrite dans notre accord de traitement des données — et nous voulons être précis sur le type de promesse : contractuelle, pas cryptographique. Nous ne pourrions pas changer silencieusement d'avis ; la clause survit à la résiliation et ne peut être modifiée sans notification à chaque client actif et une fenêtre de désactivation. Vos réponses sont des données produit, jamais des données d'entraînement.

clause de politique · DPA §4.2
// excerpt from the BothWant Data Processing Agreement, §4.2
// available at /legal/dpa, executed by BothWant Editorial.

PROHIBITED USES. Processor shall NOT:
  (a) use Customer Data to train, fine-tune, evaluate,
      or otherwise improve any machine-learning model,
      whether owned by Processor or by a third party;
  (b) grant any license to Customer Data that would
      permit such training by a sub-processor;
  (c) retain or repurpose Customer Data beyond the
      operational purposes described in §3.1.

// This clause survives termination. It cannot be amended
// without notice to all active customers and an opt-out window.
Garantie 05

Nous ne vendons, ne partageons ni ne transférons vos données aux annonceurs.

Aucun SDK publicitaire n'est intégré dans notre codebase. Aucun pixel Meta. Aucun tag Google Ads. Aucun pixel TikTok. Aucun tag LinkedIn Insight. Les seuls scripts tiers sur bothwant.com sont ceux que nous listons publiquement : Stripe (paiement), Resend (e-mails transactionnels) et PostHog (analyse produit avec masquage des données identifiables). Vous pouvez vérifier cela. Le code est ouvert à l'inspection dans le navigateur, et notre page des sous-traitants liste chaque prestataire que nous utilisons.

vérification · recherche des domaines des réseaux publicitaires dans la base de code
$ rg 'connect.facebook.net|googletagmanager|doubleclick|tiktok|linkedin\.com\/insight' .
# (no matches)

$ rg 'pixel|fbq|gtag|ttq|_linkedin_partner_id' --type js --type ts
# (no matches)

$ cat package.json | jq '.dependencies | keys[]' | grep -i 'pixel\|analytics\|tracking\|ad'
"posthog-js" # the only match — and PII masking is enforced in posthog.config.ts
Fonctionnement

L'architecture, étape par étape.

01 · Client (vous)
Les réponses quittent le navigateur via TLS.

Vous répondez seul(e), dans votre propre session. Tout se transmet à nos serveurs via TLS 1.2+, derrière des en-têtes de sécurité stricts (CSP, HSTS) et une porte d'âge à l'entrée.

↪ browser → wire
02 · Base de données
Stockées chiffrées au repos, avec un accès limité par ligne.

Les réponses sont stockées dans Supabase Postgres, chiffrées au repos avec AES-256. La sécurité au niveau des lignes signifie que votre session peut lire vos lignes et celles de personne d'autre. Le contrôle des débits est placé devant l'API.

↪ wire → postgres
03 · Révélation côté serveur
La comparaison s'effectue dans un contexte serveur privilégié.

Lorsque les deux partenaires ont répondu, le serveur compare les deux ensembles et calcule la superposition mutuelle — oui-oui, oui-peut-être, peut-être-peut-être. Aucun client ne participe, et aucun client ne peut y accéder.

↪ postgres → server
04 · Résultats retournés
Seule la superposition est renvoyée.

Le client de chaque partenaire reçoit uniquement l'intersection. Vos réponses non correspondantes — celles qui vous concernent uniquement, les embarrassantes — ne sont jamais envoyées à votre partenaire. Elles ne figurent pas du tout dans le payload.

↪ server → both partners
Menaces contre lesquelles cette conception se défend
La curiosité de votre partenaire

Le modèle de menace que les couples tiennent vraiment à l'esprit. Le révélateur s'exécute côté serveur et renvoie uniquement la superposition mutuelle — vos réponses non correspondantes ne figurent jamais dans le payload de votre partenaire. Il n'y a rien à trouver dans les outils de développement, car rien n'a été envoyé.

Fuite de base de données

Les données sont chiffrées au repos (AES-256) et en transit (TLS 1.2+). Les mots de passe n'existent que sous forme de hachages salés détenus par notre fournisseur d'authentification. Les numéros de carte ne touchent jamais nos serveurs — Stripe les détient. La sécurité au niveau des lignes et la limitation des taux réduisent ce que pourrait atteindre une seule credentielle volée.

La curiosité d'un employé de BothWant

Il n'y a aucun tableau de bord où l'un de nous — ingénieur, support — pourrait parcourir les réponses auxquelles les couples ont dit oui. L'accès en production est restreint à l'exploitation du service, et le DPA ci-dessus rend « nous ne regardons pas » une obligation contractuelle, pas un état d'esprit.

Ce que ce n'est pas

Nous ne vous rendons pas plus sûr que vous ne l'êtes déjà.

Quelques limites honnêtes. Nous ne remplaçons pas le jugement d'un thérapeute, et nous ne pouvons pas reconnaître un motif qui en exige un. Nous ne prévenons pas les dommages dans les relations où des dommages ont déjà lieu ; nous ne détectons pas la coercition via un quiz. Si un partenaire exige qu'un autre utilise BothWant, l'architecture ne peut le savoir.

Nous sommes une entreprise de logiciels américaine soumise au processus juridique américain, et nous répondrons aux mandats légaux de la même manière que toutes les autres entreprises de logiciels américaines. Ce qui limite ce que nous pouvons être contraints de produire, ce n'est pas la cryptographie — c'est la minimaliste. Nous collectons peu, nous le conservons uniquement tant que vous maintenez un compte, et la suppression est réelle, immédiate, et sort de nos sauvegardes dans les trente jours.

Si quelque chose sur cette page est significativement erroné, nous voulons le savoir. Il existe un chemin de divulgation de vulnérabilités ci-dessous.