You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
MemoryLane est une plateforme de gestion de médias familiaux permettant de stocker, organiser et partager photos, vidéos et documents pour votre famille.
Technologies
Backend
Laravel 11 - Framework PHP
PostgreSQL 16 - Base de données (UUID primary keys)
Redis 7 - Cache & Queues
Inertia.js - Bridge Laravel-Vue (SPA sans API séparée)
Filament v3.3 - Panel d'administration
Google Cloud Vision API - Détection de visages et labels IA (provider swappable)
Panel famille interactif sur la fiche personne (RelationshipPicker)
Page profil d'une personne avec ses médias associés
Page listing de toutes les personnes
Tags
Création, édition, suppression de tags
Tagging de médias avec autocomplete
Filtrage par tags dans la galerie
Tags colorés affichés sur les cartes médias
IA & Reconnaissance visuelle (Vision AI)
Architecture provider-swappable : interface unique (VisionServiceInterface) avec implémentation Google Cloud Vision et possibilité de basculer vers une alternative locale gratuite (DeepFace/InsightFace)
Détection de visages : bounding boxes positionnées en % sur l'image, overlay interactif
Matching de visages : associer un visage détecté à une personne existante ou en créer une nouvelle
Détection de labels : catégorisation automatique des photos (Nature, Famille, Animaux, etc.)
Auto-tagging : les labels IA créent automatiquement des tags de type ai (violet)
Traitement asynchrone : job en queue déclenché automatiquement après upload
Suivi du statut : badge temps réel (pending → processing → completed/failed) avec polling
Re-analyse : possibilité de relancer l'analyse IA sur une photo
Arbre Généalogique
Import GEDCOM (format standard Geneanet/MyHeritage/Ancestry)
Parseur GEDCOM custom (INDI + FAM, gestion des dates, encodage)
Matching intelligent à l'import : score 0-100 (nom, dates) avec auto-match >= 80%
# Tous les tests
podman-compose exec app php artisan test# Une suite spécifique
podman-compose exec app php artisan test --filter=AlbumControllerTest
podman-compose exec app php artisan test --filter=VisionControllerTest
# Avec couverture
podman-compose exec app php artisan test --coverage
Routes API
Médias (/media)
Méthode
Route
Description
GET
/media
Liste (Inertia ou JSON)
POST
/media
Upload
GET
/media/{id}
Détail + éditeur
PUT
/media/{id}
Mise à jour titre/description
DELETE
/media/{id}
Suppression
Albums (/albums)
Méthode
Route
Description
GET
/albums
Liste des albums
POST
/albums
Créer un album
GET
/albums/{id}
Détail + carousel
PUT
/albums/{id}
Modifier
DELETE
/albums/{id}
Supprimer
POST
/albums/{id}/media
Ajouter des médias
DELETE
/albums/{id}/media
Retirer des médias
PUT
/albums/{id}/media/reorder
Réordonner
POST
/albums/{id}/share
Générer lien de partage
DELETE
/albums/{id}/share
Révoquer le partage
GET
/albums/shared/{token}
Vue publique partagée
Personnes (/people)
Méthode
Route
Description
GET
/people
Liste (Inertia ou JSON)
POST
/people
Créer
GET
/people/{id}
Profil + médias
PUT
/people/{id}
Modifier
DELETE
/people/{id}
Supprimer
POST
/people/attach
Associer personne à un média
POST
/people/detach
Dissocier personne d'un média
POST
/people/{id}/parent
Définir père/mère
DELETE
/people/{id}/parent
Retirer père/mère
POST
/people/{id}/spouse
Ajouter un conjoint
DELETE
/people/{id}/spouse
Retirer un conjoint
Arbre Généalogique (/family-tree)
Méthode
Route
Description
GET
/family-tree
Page arbre (Inertia)
GET
/family-tree/data
Données JSON de l'arbre complet
GET
/family-tree/data/{person}
Sous-arbre centré sur une personne
GET
/family-tree/import
Page import GEDCOM
POST
/family-tree/import/upload
Upload + parse GEDCOM
GET
/family-tree/import/{id}/review
Suggestions de matching
POST
/family-tree/import/{id}/confirm
Confirmer l'import
Tags (/tags)
Méthode
Route
Description
GET
/tags
Liste
POST
/tags
Créer
PUT
/tags/{id}
Modifier
DELETE
/tags/{id}
Supprimer
POST
/tags/attach
Attacher à un média
POST
/tags/detach
Détacher d'un média
Vision IA (/vision)
Méthode
Route
Description
GET
/vision/media/{id}/faces
Visages détectés (hors dismissed)
POST
/vision/faces/{id}/match
Matcher un visage à une personne
POST
/vision/faces/{id}/dismiss
Ignorer un visage détecté
GET
/vision/media/{id}/labels
Labels IA détectés
POST
/vision/media/{id}/analyze
(Re)lancer l'analyse IA
GET
/vision/media/{id}/status
Statut du traitement IA
Configuration Vision IA
L'analyse IA est optionnelle et désactivée par défaut. L'architecture utilise un pattern provider-swappable : une interface unique VisionServiceInterface avec des implémentations interchangeables.
Providers disponibles
Provider
Env VISION_PROVIDER
Description
Google Cloud Vision
google
API cloud payante, haute précision
Null (désactivé)
—
No-op, retourne des résultats vides
Local (futur)
local
Alternative gratuite via DeepFace/InsightFace
Variables d'environnement
# Activer/désactiver l'analyse IAVISION_ENABLED=false# Provider : google (par défaut)VISION_PROVIDER=google# Google Cloud VisionGOOGLE_CLOUD_PROJECT=your-project-idGOOGLE_APPLICATION_CREDENTIALS=/path/to/credentials.json# Seuils de confianceVISION_FACE_CONFIDENCE=0.75VISION_LABEL_CONFIDENCE=0.70VISION_LABEL_MAX=15# Auto-tagging : crée des tags automatiquement depuis les labels IAVISION_AUTO_TAG=true
Ajouter un nouveau provider
Créer une classe implémentant VisionServiceInterface dans app/Services/Vision/
Ajouter le case dans le match de AppServiceProvider
Configurer VISION_PROVIDER=nom_du_provider dans .env
Développement
Commandes utiles
# Hot reload frontend
podman-compose exec app npm run dev
# Accéder au conteneur
podman-compose exec app bash
# Logs
podman-compose logs -f app
# Redémarrer
podman-compose restart