Files
imagod-web/ROADMAP.md
T
bruno 8e4743b6da chore: mise à jour ROADMAP, CHANGELOG et version v0.2.0
- 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
2026-06-25 10:47:53 -04:00

243 lines
9.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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<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 `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)
**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
**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 | 🟠 À 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)
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)