# Roadmap — imagod-web Planification des évolutions de imagod-web. Les phases sont ordonnées par priorité et dépendances. --- ## 🟢 Phase 1–2 — Fondations ✅ *Complété* - [x] Structure du projet Rust (Cargo, modules) - [x] CLI avec clap (commands `serve`, `watcher`, `install`, `uninstall`) - [x] Configuration TOML + variables d'environnement - [x] Client HTTP Imago v2 (reqwest + rustls) - [x] Dédoublonnage SHA-256 + SQLite - [x] Compilation Linux x86_64 --- ## 🟢 Phase 7–9 — Dashboard Web ✅ *Complété* - [x] Serveur axum avec frontend embarqué (rust-embed) - [x] API REST proxy vers Imago v2 (CRUD images, recherche, stats) - [x] Authentification par clé API (login/logout, localStorage) - [x] Galerie responsive desktop + mobile - [x] Upload drag & drop + raccourcis clavier - [x] Modale détail image (EXIF, OCR, AI, métadonnées) - [x] Suppression avec confirmation - [x] Gestion des tags inline (ajout, suppression, édition) - [x] Notifications toast - [x] WebSocket temps réel (hub broadcast) - [x] Pagination + recherche plein texte --- ## 🟢 Phase 3 — Clipboard Watcher (Windows) ✅ *Complété* **Objectif** : Capture automatique des screenshots depuis le presse-papier Windows. | Fichier | Action | Détail | |---------|--------|--------| | `src/clipboard.rs` | ✅ Implémenté | Capture d'image via arboard (BGRA→PNG) | | | ✅ `has_image()` | Détecte si le clipboard contient une image | | | ✅ `get_image_bytes()` | Extrait l'image en `Vec` (PNG) | | | ✅ SHA-256 | Hachage pour dédoublonnage | | | ⚠️ À tester | Test Windows réel (compilation OK, logique validée) | **Notes techniques** : - ✅ Utiliser `arboard::Clipboard::new()` → `get_image()` - ✅ Convertir `ImageData` en bytes PNG via le crate `image` - ✅ Gérer le cas où le clipboard est vide ou contient du texte - ⚠️ Testé uniquement sous Linux (headless) — validation Windows à faire **Dépendances estimées** : crate `image` (si pas déjà présent) --- ## 🟢 Phase 6 — Boucle principale du Watcher ✅ *Complété* **Objectif** : Assembler clipboard + dédoublonnage + upload dans une boucle de polling. | Fichier | Action | Détail | |---------|--------|--------| | `src/watcher.rs` | ✅ Implémenté | Boucle polling unifiée (clipboard + dossier) | | | ✅ Polling | Intervalle configurable (`watcher.poll_interval_ms`) | | | ✅ Pipeline | Détection → hash → dédoublonnage → upload → nettoyage | | | ✅ Windows | Appeler `clipboard::has_image()` + `clipboard::get_image_bytes()` | | | ✅ Linux | Polling dossier configurable (`watch_dir`) | | | ✅ SQLite | Dédoublonnage persistant | | | ✅ Testé Linux | Upload réussi vers Imago (ID=13) | | | ⚠️ Test Windows | Validation clipboard réel à faire | **Pipeline détaillé** : ``` ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ Poll │───▶│ Hash │───▶│ Dedup │───▶│ Upload │───▶│ Notify │ │ Clipboard│ │ SHA-256 │ │ Check │ │ Imago │ │ WS Hub │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────┘ ``` **Dépendances** : Phase 3 (clipboard) --- ## 🟡 Correctifs Backend Imago Ces tâches dépendent du backend Imago, pas d'imagod-web directement : | Problème | Action | Priorité | |----------|--------|----------| | Clé API sans `images:delete` | Ajouter le scope dans l'admin Imago | 🔴 Haute | | Endpoint `PUT /api/v1/images/{id}/tags` absent | Déployer la route dans Imago | 🔴 Haute | | Upload retourne 500 / file_size=0 | Débugger le stockage (S3/MinIO ?) | 🔴 Haute | | Route `GET /api/v1/auth/me` absente | Ajouter endpoint infos clé API | 🟡 Moyenne | --- ## 🟢 Phase 10 — Service Windows (NSSM) ✅ *Complété* **Objectif** : Installation de imagod-web comme service Windows natif. | Fichier | Action | Détail | |---------|--------|--------| | `src/service.rs` | Implémenter | Remplacer les `todo!()` | | | `install()` | Intégration NSSM (Non-Sucking Service Manager) | | | `uninstall()` | Désinstallation propre du service | | | Configuration | Démarrage automatique, redémarrage sur crash | **Approches possibles** : 1. **NSSM** (recommandé) — wrapper externe, simple et robuste 2. **windows-service** crate — pure Rust, plus complexe 3. **sc.exe** — commandes Windows natives --- ## 🟠 Phase 11 — Intégration Ditto Clipboard Manager **Objectif** : Plugin/addon Ditto qui envoie automatiquement les screenshots vers imagod-web. **Contexte** : Bruno utilise [Ditto](https://ditto-cp.sourceforge.io/), un gestionnaire de presse-papier avancé pour Windows. **Deux approches envisageables** : ### Option A : Script externe Ditto - Ditto peut exécuter un script/exe quand un nouvel élément est copié - Un petit binaire Rust qui appelle `POST /api/upload` de imagod-web - Avantage : simple, découplé ### Option B : Plugin Ditto natif - Ditto supporte des plugins/addons (C++ ou COM) - Plugin qui intercepte les images et les envoie directement à Imago - Avantage : plus intégré, pas de polling nécessaire > ⚠️ Nécessite une investigation sur l'API plugin Ditto (peu documentée) --- ## 🟢 Phase 12 — Cross-Compilation & CI/CD ✅ *Complété* **Objectif** : Binaires natifs pour Windows x86_64, Linux ARM64. | Cible | Action | Détail | |-------|--------|--------| | `x86_64-pc-windows-msvc` | Cross-compile | Nécessite linker MSVC ou MinGW | | `aarch64-unknown-linux-gnu` | Cross-compile | Pour Raspberry Pi / serveurs ARM | | CI/CD Gitea Actions | Configurer | Build + release automatique | **Blocage potentiel** : `arboard` et `windows-sys` sont Windows-only, il faut du conditional compilation. --- ## 🔵 Phase 13 — Application Système (Tray Icon) **Objectif** : Icône dans la zone de notification Windows avec menu contextuel. | Fichier | Action | Détail | |---------|--------|--------| | `src/tray.rs` | Implémenter | Remplacer le stub | | | Menu | Démarrer/Arrêter le watcher, Ouvrir dashboard, Quitter | | | Notifications | Bulles Windows pour nouveaux uploads | **Crate** : `tray-icon` (déjà dans Cargo.toml) --- ## 🔵 Phase 14 — Dashboard Avancé ### 14a — Galerie avec Filtres Avancés - [ ] Filtrer par plage de dates (date picker) - [ ] Filtrer par tags (multi-sélection) - [ ] Filtrer par statut de processing (pending/done/error) - [ ] Trier par date, taille, nom ### 14b — Vue Timeline - [ ] Frise chronologique des captures - [ ] Regroupement par jour/semaine/mois - [ ] Navigation par scroll infini ### 14c — Batch Operations - [ ] Sélection multiple d'images (checkboxes) - [ ] Suppression en masse - [ ] Tag en masse - [ ] Export ZIP ### 14d — Intégration Hermes Agent - [ ] Endpoint pour qu'Hermes puisse requêter les images - [ ] Webhook de notification (nouvelle image → message Telegram) - [ ] Skill Hermes `imagod-web` pour interroger la bibliothèque en langage naturel --- ## 🔵 Phase 15 — Client Mobile ### 15a — PWA (Progressive Web App) - [ ] Service worker pour cache offline - [ ] Manifest JSON pour installation - [ ] Notifications push (nouvelles images) ### 15b — Share Intent Android/iOS - [ ] Endpoint API pour recevoir des images depuis le menu "Partager" - [ ] Deep link `imagod://` pour ouverture directe --- ## ⚫ Idées Futures (Backlog) - [ ] **OCR Search** — Recherche dans le texte OCR extrait par Imago - [ ] **AI Semantic Search** — « trouve les photos de chats dans mon salon » - [ ] **Export** — ZIP, galerie HTML statique, PDF contact sheet - [ ] **Multi-tenant** — Support de plusieurs clés API / espaces Imago - [ ] **Thèmes** — Clair, contrasté, personnalisable - [ ] **Deduplication cross-tenant** — Éviter les doublons entre utilisateurs - [ ] **Statistiques avancées** — Graphiques (appareils, résolutions, heures de capture) - [ ] **Mode hors-ligne** — File d'attente locale quand Imago est inaccessible --- ## 📊 Résumé des phases | Phase | Statut | Priorité | Effort estimé | |-------|--------|----------|---------------| | 1–2 Fondations | ✅ Complété | — | — | | 7–9 Dashboard | ✅ Complété | — | — | | 3 Clipboard | 🟢 ✅ Complété | Haute | — | | 6 Watcher | 🟢 ✅ Complété | Haute | — | | Correctifs Imago | 🟡 Bloquant | Critique | Variable | | 10 Service NSSM | 🟢 ✅ Complété | Haute | — | | 11 Intégration Ditto | ⚫ Abandonné | — | — | | 12 Cross-compile | 🟢 ✅ Complété | Haute | — | | 13 Tray Icon | 🔵 À faire | Basse | 3–4h | | 14 Dashboard Avancé | 🔵 À faire | Basse | 8–16h | | 15 Client Mobile | 🔵 À faire | Basse | 6–10h | | Backlog | ⚫ Idées | Variable | ∞ | --- ## 🎯 Prochaines actions immédiates (recommandées) 1. **Corriger le scope `images:delete`** dans l'admin Imago → débloque la suppression 2. **Corriger le stockage Imago** (upload 500) → débloque les tests 3. ~~**Implémenter Phase 3** (clipboard watcher)~~ ✅ — 25 juin 2026 4. ~~**Implémenter Phase 6** (watcher loop)~~ ✅ — 25 juin 2026 5. **Corriger le backend Imago** (thumbnails, upload, stockage)