- ROADMAP: phases 3 et 6 marquées complétées avec tests et statuts - CHANGELOG: v0.2.0 documentée (phases 3/6, fix thumbnails, navigation, tests) - Cargo.toml: version bump 0.1.0 → 0.2.0
9.2 KiB
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é
- Structure du projet Rust (Cargo, modules)
- CLI avec clap (commands
serve,watcher,install,uninstall) - Configuration TOML + variables d'environnement
- Client HTTP Imago v2 (reqwest + rustls)
- Dédoublonnage SHA-256 + SQLite
- Compilation Linux x86_64
🟢 Phase 7–9 — Dashboard Web ✅ Complété
- Serveur axum avec frontend embarqué (rust-embed)
- API REST proxy vers Imago v2 (CRUD images, recherche, stats)
- Authentification par clé API (login/logout, localStorage)
- Galerie responsive desktop + mobile
- Upload drag & drop + raccourcis clavier
- Modale détail image (EXIF, OCR, AI, métadonnées)
- Suppression avec confirmation
- Gestion des tags inline (ajout, suppression, édition)
- Notifications toast
- WebSocket temps réel (hub broadcast)
- 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<u8> (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
ImageDataen bytes PNG via le crateimage - ✅ 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)
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 :
- NSSM (recommandé) — wrapper externe, simple et robuste
- windows-service crate — pure Rust, plus complexe
- 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, 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/uploadde 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
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-webpour 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 | 🟠 À faire | Moyenne | 3–4h |
| 11 Intégration Ditto | 🟠 À faire | Moyenne | 4–8h |
| 12 Cross-compile | 🟠 À faire | Moyenne | 3–5h |
| 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)
- Corriger le scope
images:deletedans l'admin Imago → débloque la suppression - Corriger le stockage Imago (upload 500) → débloque les tests
Implémenter Phase 3 (clipboard watcher)✅ — 25 juin 2026Implémenter Phase 6 (watcher loop)✅ — 25 juin 2026- Corriger le backend Imago (thumbnails, upload, stockage)