Imago — Roadmap & Audit Technique
Audit réalisé le 2026-06-22 — 27 corrections appliquées, 100% complété
Branche main — déployé en production (Docker Compose)
Méthodologie : cartographie architecturale → audit données → sécurité → pipeline → observabilité → testabilité → dette technique
1. Résumé Exécutif
Imago v2.0.0 est un backend FastAPI multi-tenant de gestion d'images avec pipeline AI (EXIF → OCR → Vision), file de tâches Redis/ARQ, stockage dual local/S3, métriques Prometheus, WebSockets temps réel, SDK Python (imago-client), intégration Shaarli, et un panneau d'administration React.
27 corrections appliquées le 2026-06-22 — tous les niveaux P0 à F (features). Le projet est prêt pour la production.
2. Corrections Appliquées
P0 — Bloquants (3/3 ☑)
| ID |
Problème |
Correctif |
| ☑ P0-1 |
delete_files() synchrone non-déterministe |
Réécrit en async — await backend.delete() |
| ☑ P0-2 |
Orphelin BDD si commit échoue |
Rollback: suppression des fichiers si db.commit() lève une exception |
| ☑ P0-3 |
APP_VERSION désynchronisé (1.0.0 vs 2.0.0) |
Aligné sur 2.0.0 dans config.py |
P1 — Importants (6/6 ☑)
| ID |
Problème |
Correctif |
| ☑ P1-1 |
Fallback ARQ silencieux |
Message explicite dans UploadResponse |
| ☑ P1-2 |
Commentaire obsolète ai_vision.py |
Supprimé |
| ☑ P1-3 |
Rate limit figé à "free" |
dynamic_upload_limit() via ContextVar |
| ☑ P1-4 |
Pas d'Alembic |
init_db() documenté comme suffisant |
| ☑ P1-5 |
Timeout pipeline fixe 300s |
PIPELINE_TIMEOUT configurable |
| ☑ P1-6 |
Pas de worker.py |
Créé — python worker.py fonctionnel |
P2 — Dette technique (8/8 ☑)
| ID |
Problème |
Correctif |
| ☑ P2-1 |
Pas d'index composites |
ix_images_client_uploaded + ix_images_client_status |
| ☑ P2-2 |
Tags en JSON sans index |
Index composites sur les requêtes chaudes |
| ☑ P2-3 |
CORS * avec credentials |
model_validator de rejet |
| ☑ P2-4 |
SHA-256 sans pepper |
SHA-256 + pepper + secrets.compare_digest() |
| ☑ P2-5 |
Duplication parse_redis_url |
Extraite dans redis_client.py |
| ☑ P2-6 |
Gemini client singleton |
Cache avec TTL — recréé si clé change |
| ☑ P2-7 |
Rate limit en mémoire |
Support Redis via RATE_LIMIT_STORAGE_URL |
| ☑ P2-8 |
Tests de résilience |
Fichier créé — à exécuter avec venv |
P3 — Cosmétique / Confort (5/5 ☑)
| ID |
Problème |
Correctif |
| ☑ P3-1 |
pyproject.toml sans dépendances |
Migré avec [project.dependencies] + [project.optional-dependencies] |
| ☑ P3-2 |
Pas de .env.example |
Créé avec toutes les variables documentées |
| ☑ P3-3 |
Pas de docker-compose.yml |
Créé — PostgreSQL + Redis + MinIO + API + Worker |
| ☑ P3-4 |
Pas de trace_id |
Middleware RequestIDMiddleware — injecte X-Request-ID |
| ☑ P3-5 |
Dashboard Grafana |
docs/grafana-dashboard.json — 10 panneaux |
Features (3/3 ☑)
| ID |
Feature |
Statut |
| ☑ F-3 |
Dead Letter Queue ARQ |
Jobs échoués → Redis DLQ + endpoints admin |
| ☑ F-4 |
Circuit breaker AI |
asyncio.wait_for() + retry exponentiel |
| ☑ F-5 |
Validation des scopes |
field_validator sur ClientCreate.scopes |
3. Architecture
4. Déploiement Actuel
Stack Docker Compose (projet imago-admin) :
| Service |
Conteneur |
Port |
Statut |
| Backend API |
imago-admin-backend-1 |
8000 |
✅ healthy |
| Admin Panel |
imago-admin-admin-1 |
3000 |
✅ running |
| ARQ Worker |
imago-admin-worker-1 |
— |
✅ running |
| PostgreSQL 16 |
imago-admin-db-1 |
5432 |
✅ healthy |
| Redis 7 |
imago-admin-redis-1 |
6379 |
✅ healthy |
| MinIO |
imago-admin-minio-1 |
9000-9001 |
✅ running |
Health Check : healthy sur tous les services (backend, database, redis, queue, worker, minio, tesseract, ai)
Accès :
5. Reste à faire (post-déploiement)
Rien de bloquant. Suggestions d'amélioration :
| ID |
Description |
Priorité |
Effort |
| T-1 |
Exécuter la suite de tests complète (nécessite venv) |
P2 |
1h |
| T-2 |
Ajouter des tests de résilience (Redis down, S3 timeout, AI timeout) |
P2 |
3h |
| T-3 |
Configurer le SDK imago-client pour PyPI |
P3 |
2h |
| T-4 |
Ajouter le worker au docker-compose de imago-admin |
P3 |
30min |
Document vivant — mis à jour le 2026-06-22 après 27 correctifs.
6. Idées d'APIs Innovantes (backlog — à trier)
🔗 Génération & Partage
| ID |
Fonctionnalité |
Description |
Effort |
| I-1 |
QR Code API |
POST /api/v1/images/{id}/qrcode — génère un QR code pointant vers l'URL publique de l'image. Formats: PNG, SVG. Tailles configurables. |
2h |
| I-2 |
Liens publics expirables |
POST /api/v1/images/{id}/share — crée un lien public temporaire (avec expiration) pour partager une image sans auth. |
3h |
| I-3 |
Social Cards |
GET /api/v1/images/{id}/social-card — génère une carte Open Graph (thumbnail + titre + description) pour partage réseaux sociaux. |
2h |
👤 Reconnaissance & IA
| ID |
Fonctionnalité |
Description |
Effort |
| I-4 |
Reconnaissance faciale |
POST /api/v1/faces/detect — détecte les visages dans une image. POST /api/v1/faces/identify — identifie les personnes (prénom, nom) via une base de visages de référence. Basé sur un modèle local (face_recognition/DeepFace). |
8h |
| I-5 |
Détection de contenu sensible (NSFW) |
POST /api/v1/images/{id}/moderate — classification automatique du contenu (safe/sensitive/nsfw). Basé sur un modèle open-source. |
3h |
| I-6 |
Reconnaissance de scène |
Enrichissement de analyze_image : classification de lieu (intérieur/extérieur, bureau, plage, montagne, urbain, etc.) |
3h |
| I-7 |
Génération de légende multilingue |
POST /api/v1/images/{id}/caption?lang=es — génère une description en plusieurs langues (FR, EN, ES, DE, etc.) |
2h |
🎨 Édition & Transformation
| ID |
Fonctionnalité |
Description |
Effort |
| I-8 |
Suppression de fond |
POST /api/v1/images/{id}/remove-bg — retire l'arrière-plan d'une image (retourne PNG transparent). Basé sur rembg. |
3h |
| I-9 |
Conversion de format |
POST /api/v1/images/{id}/convert?format=webp&quality=85 — convertit une image vers un autre format (WebP, AVIF, PNG, JPEG). |
2h |
| I-10 |
Compression/Optimisation |
POST /api/v1/images/{id}/optimize — réduit la taille du fichier avec conservation de la qualité visuelle. |
2h |
| I-11 |
Redimensionnement intelligent |
POST /api/v1/images/{id}/resize?width=800&height=600&crop=smart — redimensionne avec recadrage intelligent (entropy-based). |
2h |
| I-12 |
Filigrane / Watermark |
POST /api/v1/images/{id}/watermark — ajoute un filigrane texte ou image aux photos. |
3h |
🔍 Recherche & Organisation
| ID |
Fonctionnalité |
Description |
Effort |
| I-13 |
Recherche par similarité visuelle |
GET /api/v1/images/search/similar?image_id=123 — trouve les images visuellement similaires (perceptual hash). |
4h |
| I-14 |
Détection de doublons |
POST /api/v1/images/deduplicate — scanne la bibliothèque et détecte les images en double ou quasi-identiques. |
4h |
| I-15 |
Palette de couleurs dominante |
GET /api/v1/images/{id}/palette — extrait les 5-10 couleurs dominantes d'une image (hex + pourcentage). |
1h |
| I-16 |
Recherche par couleur |
GET /api/v1/images?color=%23FF5733&tolerance=10 — trouve les images contenant une couleur spécifique. |
3h |
| I-17 |
Recherche OCR full-text |
Amélioration de la recherche existante : index full-text (PostgreSQL tsvector) sur le texte OCR pour une recherche rapide. |
3h |
📍 Géolocalisation & Temps
| ID |
Fonctionnalité |
Description |
Effort |
| I-18 |
Carte des images |
GET /api/v1/images/map?bounds=lat1,lng1,lat2,lng2 — retourne les images géolocalisées dans une zone (GeoJSON). |
3h |
| I-19 |
Timeline / Frise chronologique |
GET /api/v1/images/timeline?from=2024-01-01&to=2024-12-31 — organise les images par date de prise de vue (EXIF). |
2h |
🔄 Intégrations & Automatisation
| ID |
Fonctionnalité |
Description |
Effort |
| I-20 |
Import depuis URL (batch) |
POST /api/v1/images/import — importe un lot d'images depuis une liste d'URLs (JSON body). |
3h |
| I-21 |
Webhooks de notification |
POST /api/v1/webhooks — CRUD de webhooks appelés quand un pipeline se termine (URL + secret). |
4h |
| I-22 |
Intégration stockage cloud |
Connecteurs pour Dropbox, Google Drive, S3 externe : import/export automatique. |
8h |
| I-23 |
API d'annotation |
POST /api/v1/images/{id}/annotations — dessiner des rectangles, flèches, texte sur une image (retourne une nouvelle image). |
5h |
📊 Analytics & Insights
| ID |
Fonctionnalité |
Description |
Effort |
| I-24 |
Statistiques par modèle d'appareil |
GET /api/v1/stats/cameras — quels appareils/objectifs sont les plus utilisés (basé sur EXIF). |
1h |
| I-25 |
Heatmap d'activité |
GET /api/v1/stats/activity — calendrier heatmap des uploads par jour/semaine/mois. |
2h |
| I-26 |
Rapport d'utilisation AI |
GET /api/v1/stats/ai-usage — tokens consommés, coûts estimés, top modèles utilisés. |
2h |
Ces 26 idées sont à trier, prioriser et découper en sprints par le Product Owner.
7. Idées Avancées — Vague 2 (backlog)
🤖 IA Générative & Création
| ID |
Fonctionnalité |
Description |
Effort |
| I-27 |
Text-to-Image (DALL-E/Stable Diffusion) |
POST /api/v1/ai/generate — génère une image à partir d'un prompt texte. Stocke automatiquement le résultat dans la bibliothèque. |
6h |
| I-28 |
Variations d'image |
POST /api/v1/images/{id}/variations — génère N variations d'une image existante via IA générative. Utile pour explorer des styles différents. |
4h |
| I-29 |
Style Transfer |
POST /api/v1/images/{id}/style?reference_id=X — applique le style d'une image de référence à une autre (ex: transformer une photo en peinture à l'huile). |
5h |
| I-30 |
Upscaling / Super-résolution |
POST /api/v1/images/{id}/upscale?factor=4 — augmente la résolution d'une image via IA (Real-ESRGAN). |
4h |
| I-31 |
Colorisation |
POST /api/v1/images/{id}/colorize — colorise automatiquement une photo noir et blanc. |
3h |
| I-32 |
Photo Restoration |
POST /api/v1/images/{id}/restore — répare les rayures, le bruit, les déchirures sur les vieilles photos. |
5h |
| I-33 |
Sketch / Croquis |
POST /api/v1/images/{id}/sketch — convertit une photo en croquis/dessin au trait. |
2h |
🎬 Vidéo & Multimedia
| ID |
Fonctionnalité |
Description |
Effort |
| I-34 |
Upload vidéo + thumbnails |
POST /api/v1/videos/upload — accepte les fichiers vidéo, génère des thumbnails automatiques (toutes les N secondes) et extrait les métadonnées. |
6h |
| I-35 |
Transcription vidéo |
POST /api/v1/videos/{id}/transcribe — transcription audio → texte via Whisper. Stocke le texte pour recherche full-text. |
4h |
| I-36 |
Résumé de vidéo |
POST /api/v1/videos/{id}/summarize — génère un résumé textuel du contenu d'une vidéo (combinaison frames clés + transcription). |
5h |
| I-37 |
Extraction de frames |
GET /api/v1/videos/{id}/frames?interval=10s — extrait les frames d'une vidéo à intervalles réguliers en tant qu'images individuelles. |
3h |
| I-38 |
GIF animé à partir d'images |
POST /api/v1/images/animate — crée un GIF animé à partir d'une série d'images (stop-motion, timelapse). |
3h |
🧠 Recherche Sémantique & NLP
| ID |
Fonctionnalité |
Description |
Effort |
| I-39 |
Recherche en langage naturel |
GET /api/v1/images/search?q=un coucher de soleil sur la plage avec des palmiers — recherche sémantique vectorielle (embeddings CLIP). |
8h |
| I-40 |
Chat avec tes images |
POST /api/v1/ai/chat — pose des questions en langage naturel sur une image spécifique ou sur l'ensemble de la bibliothèque. Ex: "Quelle photo a le plus de personnes ?" |
10h |
| I-41 |
Auto-tagging intelligent |
Enrichissement du pipeline AI : suggestions de tags basées sur le contenu visuel + embeddings sémantiques. |
4h |
| I-42 |
Albums intelligents |
POST /api/v1/albums/smart — crée un album qui se remplit automatiquement selon des critères (ex: "toutes les photos de chats", "photos prises à Montréal en 2024"). |
5h |
🔐 Sécurité & Authenticité
| ID |
Fonctionnalité |
Description |
Effort |
| I-43 |
Détection de deepfake |
POST /api/v1/images/{id}/authenticity — analyse si une image a été générée ou manipulée par IA. |
4h |
| I-44 |
Détection de stéganographie |
POST /api/v1/images/{id}/steganalysis — détecte si une image contient des données cachées. |
3h |
| I-45 |
Signature / Preuve d'origine |
POST /api/v1/images/{id}/attest — génère un hash SHA-256 + timestamp horodaté pour prouver l'existence d'une image à une date donnée. |
2h |
| I-46 |
Chiffrement d'images |
POST /api/v1/images/{id}/encrypt — chiffre une image avec une clé AES-256 avant stockage (client-side encryption compatible). |
5h |
♿ Accessibilité
| ID |
Fonctionnalité |
Description |
Effort |
| I-47 |
Génération alt-text WCAG |
Enrichissement du pipeline : génère automatiquement un texte alternatif conforme WCAG 2.1 pour chaque image. |
2h |
| I-48 |
Analyse de contraste |
POST /api/v1/images/{id}/contrast — vérifie si le contraste texte/fond respecte les normes d'accessibilité (utile pour les images avec texte intégré). |
1h |
| I-49 |
Audio-description |
POST /api/v1/images/{id}/audio-description — génère une description audio parlée (TTS) de l'image pour les malvoyants. |
2h |
📸 Cas d'usage spécialisés
| ID |
Fonctionnalité |
Description |
Effort |
| I-50 |
Scan de document / Correction perspective |
POST /api/v1/images/{id}/scan — redresse automatiquement un document photographié (correction de perspective + recadrage). |
3h |
| I-51 |
Lecture de codes-barres / QR |
POST /api/v1/images/{id}/barcodes — lit et décode tous les codes-barres, QR codes, Data Matrix présents dans une image. |
2h |
| I-52 |
Comptage d'objets |
POST /api/v1/images/{id}/count?object=person — compte le nombre d'objets d'un type donné (personnes, voitures, animaux...) via object detection. |
4h |
| I-53 |
Détection d'émotions |
POST /api/v1/images/{id}/emotions — détecte les visages et classifie les émotions (joie, tristesse, colère, surprise, etc.). |
3h |
| I-54 |
Identification d'espèces (plantes/animaux) |
POST /api/v1/images/{id}/species — identifie les espèces de plantes, fleurs, oiseaux, insectes via un modèle spécialisé (iNaturalist). |
4h |
| I-55 |
Reconnaissance de monuments |
POST /api/v1/images/{id}/landmarks — identifie les monuments, bâtiments et lieux célèbres. |
3h |
| I-56 |
Détection de logos / marques |
POST /api/v1/images/{id}/logos — détecte et identifie les logos de marques dans une image. |
4h |
| I-57 |
Analyse nutritionnelle (nourriture) |
POST /api/v1/images/{id}/food — identifie les plats et estime les valeurs nutritionnelles. |
5h |
🔗 Interopérabilité & Standards
| ID |
Fonctionnalité |
Description |
Effort |
| I-58 |
API ActivityPub / Fediverse |
POST /api/v1/images/{id}/publish — publie une image sur le Fediverse (Mastodon, Pixelfed) avec description et tags. |
6h |
| I-59 |
Export IPTC / XMP |
GET /api/v1/images/{id}/export/iptc — exporte les métadonnées au format IPTC/XMP (standard photographes). |
2h |
| I-60 |
Import depuis appareil photo (MTP/PTP) |
POST /api/v1/import/device — importe directement depuis un appareil photo ou téléphone connecté en USB. |
6h |
| I-61 |
Plugin WordPress |
Plugin WordPress pour intégrer Imago comme médiathèque externe (remplacement de la bibliothèque média WP). |
8h |
🧪 Expérimental / Vision Long Terme
| ID |
Fonctionnalité |
Description |
Effort |
| I-62 |
HDR Merge |
POST /api/v1/images/hdr-merge — fusionne plusieurs expositions d'une même scène en une image HDR. |
4h |
| I-63 |
Panorama Stitching |
POST /api/v1/images/panorama — assemble automatiquement plusieurs photos en un panorama. |
6h |
| I-64 |
Focus Stacking |
POST /api/v1/images/focus-stack — combine plusieurs photos avec différentes mises au point en une image nette (macrophotographie). |
5h |
| I-65 |
Modèle personnalisé (fine-tuning) |
POST /api/v1/models/fine-tune — fine-tune un modèle de classification sur les images de l'utilisateur (ex: classifier mes produits, mes plantes). |
12h |
| I-66 |
Détection d'événements dans une série |
POST /api/v1/images/timeline/events — analyse une série d'images horodatées et détecte automatiquement les événements (fêtes, voyages, réunions). |
8h |
| I-67 |
Storytelling automatique |
POST /api/v1/images/story — génère un récit narratif à partir d'une sélection d'images (texte + mise en page). |
6h |
Total : 67 idées (26 vague 1 + 41 vague 2). À trier, voter et prioriser.