SnapShot
Étude de cas

SnapShot : chaque invité retrouve ses photos avec un selfie

SnapShot est une plateforme de photos d'événements que j'ai conçue et développée de bout en bout. L'organisateur importe en masse les photos d'un mariage, d'une conférence ou d'un match ; chaque invité prend un selfie et obtient un album personnel de toutes les photos où il apparaît — sans faire défiler deux mille images.

Le problème

Après un événement, les photos finissent dans un immense dossier partagé. Les invités défilent longtemps pour se retrouver, et l'organisateur répond pendant des semaines au même message : « tu peux m'envoyer mes photos ? »

Ce que j'ai construit

  • Pour l'organisateur — des événements avec code d'accès, lien de partage et QR code ; un import glisser-déposer avec le suivi du traitement en direct ; un album mis en avant ; des statistiques ; des crédits photo, avec un filigrane sur l'offre gratuite.
  • Pour les invités, sans compte — ouvrir le lien de l'événement, prendre un selfie dans le navigateur et retrouver un album personnel à rouvrir quand on veut. Un e-mail prévient quand de nouvelles photos de vous sont importées — regroupé, pour qu'un import massif n'envoie qu'un seul message.
  • Sur toute la plateforme — anglais, français et arabe (de droite à gauche), thèmes clair et sombre, et une vue d'administration de l'ensemble.

Les choix techniques

La reconnaissance faciale vit dans PostgreSQL. Les empreintes de visage sont stockées avec pgvector à côté du reste des données, et comparées par une requête de distance cosinus sur un index HNSW — pas de base vectorielle séparée à exploiter et à synchroniser.

Le service d'IA est sans état. Un service FastAPI (détection YuNet, empreintes SFace) reçoit des images et renvoie des vecteurs. Le back-end Spring Boot fait toutes les écritures : le service d'IA ne détient aucun identifiant.

L'import n'attend jamais le modèle. L'import répond immédiatement ; les visages sont traités en arrière-plan, et une photo en échec est enregistrée avec sa raison au lieu de disparaître en silence.

Des modèles choisis pour leur licence. YuNet et SFace sont sous licence Apache-2.0, donc le produit peut être commercialisé — contrairement aux modèles non commerciaux du premier prototype.

Les originaux ne sont jamais exposés. Les téléchargements passent par le back-end, qui ajoute le filigrane si nécessaire, et les points d'accès publics qui déclenchent l'analyse de visage sont limités en débit.

La stack

  • Java 25
  • Spring Boot 4.1
  • PostgreSQL 16 + pgvector
  • Python · FastAPI
  • OpenCV YuNet + SFace
  • Angular 22
  • MinIO (S3)
  • Docker
  • GitHub Actions

Tout tourne en conteneurs Docker derrière Caddy, déployé automatiquement à chaque changement fusionné.

Voir le projet

Vous construisez un produit qui traite des images, repose sur la recherche ou sert de nombreux clients depuis une seule plateforme ? Dites-moi ce que vous avez en tête.