Sous le capot d'Amphitryon : pourquoi nous avons construit l'app comme ça

29 août 2026
l'écran de connexion
Journal de développeur · 01

Sous le capot d'Amphitryon : pourquoi nous avons construit l'app comme ça

Premier épisode d'un carnet de bord ouvert. Aujourd'hui : les trois ou quatre décisions d'architecture qui décident, en pratique, de ce que vous voyez — et surtout de ce que les autres ne voient pas.

21 août 2026 / L'équipe technique /8 minutes

Amphitryon est une application de rencontre pour le milieu libertin : profils, soirées, messagerie, réputation, carte. Dit comme ça, c'est un produit comme un autre. En réalité, c'est un produit où une fuite de données n'est pas un incident technique — c'est un accident de vie. Cette phrase a orienté à peu près toutes nos décisions d'architecture, et c'est le sujet de ce premier journal.

Le socle : Next.js 16 (App Router) avec React 19 côté interface, et Supabase — Postgres, authentification, stockage de fichiers, temps réel — côté données. Rien d'exotique. L'intérêt n'est pas dans la liste des outils, il est dans la façon dont on répartit la confiance entre eux.

1. La règle vit dans la base, pas dans l'écran

Une soirée impose des conditions : profil certifié ou non, palier de réputation minimum, quotas par catégorie de profil. Nous aurions pu écrire ces règles une seule fois, dans l'interface, et masquer les boutons interdits. C'est plus rapide. C'est aussi la faute classique : masquer un bouton n'empêche personne d'appeler l'API directement.

Nous les écrivons donc deux fois, et volontairement. Côté serveur, la décision d'accepter une inscription est prise par une fonction Postgres (accept_soiree_registration) qui applique les quotas et refuse le reste ; l'accès aux lignes est verrouillé par les politiques de sécurité de la base. Côté navigateur, un module dédié ne fait qu'une chose — décider ce qui s'affiche — et son commentaire d'en-tête le dit sans détour : il n'écrit jamais en base.

Ce que ça change pour vous : quand une soirée disparaît de vos résultats parce qu'une catégorie est fermée, ce n'est pas un affichage. La porte est fermée à la serrure, pas au rideau.

La pile technique, en clair
Next.js 16 · React 19Les pages, la navigation, le rendu.
Supabase / PostgresDonnées, comptes, médias, temps réel.
VitestLes tests qui tournent à chaque contribution.
PWA + notifications pushL'app s'installe sur l'écran d'accueil.

2. Vos photos privées ne sont pas « des fichiers en ligne »

Un média privé n'est pas un fichier public dont on cacherait l'adresse. Les galeries privées vivent dans un espace de stockage fermé, servi par des adresses signées et temporaires, et l'autorisation de regarder est une donnée à part entière : une table de droits d'accès accordés, révocables. Un partenaire lié voit ce qui lui est explicitement ouvert ; le reste du monde n'obtient même pas une adresse valable.

Même logique pour le texte : tout ce que vous écrivez en mise en forme riche — bio, description de soirée, article — passe par un nettoyage à liste blanche avant affichage. On n'interdit pas ce qui est dangereux, on n'autorise que ce qui est prévu. C'est plus strict, et c'est le seul sens qui tient dans le temps.

Galerie privée d'un profil : albums Soft et Eros, actions Partager et Tout partager
L'accès à un média privé est une décision explicite, visible et révocable — pas un lien qui traîne.

3. Le couple est une entité, pas deux comptes côte à côte

C'est la décision la moins visible et la plus structurante. Sur beaucoup de plateformes, un couple, ce sont deux profils qui se ressemblent. Chez nous, un couple lié possède un identifiant commun, et une notification qui le concerne est adressée à ce couple : une seule ligne en base, lue par les deux. Marquer un message comme lu depuis un compte le marque lu pour l'autre.

Un couple qui reçoit deux fois la même invitation, ce n'est pas un doublon d'affichage. C'est une conversation qu'on lui fait recommencer.

Les invitations, les quotas, les évaluations, les débriefings du lendemain : tout descend de ce choix. Il coûte cher en complexité — chaque nouvelle fonctionnalité doit répondre à « et pour un couple ? » — et c'est un coût qu'on assume.

4. Réputation : de la logique lente, pas un score magique

Les paliers — Initiation, Bronze, Argent, Or, Platine, Diamant —, les évaluations, les tendances, la certification, les signalements et leur escalade : ce sont des dizaines de migrations de base de données successives, écrites, corrigées, durcies. Nous préférons cette lenteur à un algorithme opaque qui ferait « à peu près » l'affaire. Une réputation qui pèse sur l'accès à une soirée doit être calculable, explicable et rejouable.

Le corollaire discret : les notifications push sont désactivées par défaut. Vous les activez, catégorie par catégorie. Personne n'a envie que son téléphone parle de sa vie privée sans y avoir été invité.

Paliers Voyageur et Hôte au niveau Diamant, et succès Fondateur, Complétionniste, 1ère organisation
Deux paliers distincts — Voyageur et Hôte — et des succès attribués par des règles écrites côté base, pas par une intuition côté interface.

5. Ce qu'on n'a pas encore réglé

Autant le dire ici plutôt que de le laisser deviner : quelques pages de l'app sont devenues énormes — plusieurs milliers de lignes pour un seul écran. On les démonte progressivement, en extrayant la logique pure dans des modules testés plutôt qu'en réécrivant tout d'un coup. Un exemple concret de ce que ces tests attrapent : dans la hiérarchie des paliers, « Initiation » vaut zéro. Une valeur zéro, en JavaScript, se fait remplacer silencieusement par une valeur par défaut si on écrit la condition un peu trop vite — et un nouveau membre se retrouve promu Bronze sans rien avoir fait. Ce genre de bug ne se voit pas à l'œil. Il se voit dans un test.

Côté méthode : personne ne pousse directement sur la branche principale, chaque sujet passe par une proposition de modification, et une chaîne automatique vérifie le style, les types, les tests et la compilation avant tout regroupement. C'est austère. C'est ce qui permet à plusieurs personnes de travailler en parallèle sur les mêmes gros fichiers sans effacer le travail de l'autre.

La suite

Ce journal continuera au rythme du développement : un épisode par chantier. Au programme des prochains — la carte et le calcul des distances, le débriefing du lendemain et sa fenêtre de 48 h, et le moteur de réputation expliqué palier par palier.

Si vous êtes parmi les premiers membres : le bouton de retour d'expérience dans l'app arrive directement chez nous. Il n'y a pas de service intermédiaire. On lit tout.

Journal de développeur · 01 Amphitryon — l'art de recevoir

Questions fréquentes sur l'architecture d'Amphitryon

Pourquoi les règles d'accès à une soirée sont-elles écrites deux fois, côté serveur et côté navigateur ?

Masquer un bouton dans l'interface n'empêche personne d'appeler l'API directement. La vraie décision est prise côté serveur par une fonction qui applique les quotas et verrouille l'accès aux lignes ; l'affichage côté navigateur ne fait que refléter cette décision, sans jamais écrire en base.

Comment sont protégées les photos privées sur Amphitryon ?

Elles vivent dans un espace de stockage fermé, servi par des adresses signées et temporaires, et l'autorisation de les voir est une donnée à part entière, révocable à tout moment : le reste du monde n'obtient même pas une adresse valable.

Pourquoi un couple est-il traité comme une seule entité plutôt que deux comptes ?

Pour éviter qu'un couple ne reçoive deux fois la même invitation ou notification comme si c'était deux conversations séparées : un couple lié possède un identifiant commun, et marquer un message comme lu depuis un compte le marque lu pour l'autre.

Les notifications push sont-elles activées par défaut ?

Non, elles sont désactivées par défaut et s'activent catégorie par catégorie, pour que personne n'ait son téléphone qui parle de sa vie privée sans y avoir été invité.

Pour aller plus loin

Rejoignez le Cercle

Amphitryon est le Cercle privé, sur invitation et validation, de celles et ceux qui savent recevoir, dans l'exigence, la confiance et la discrétion.