243 lines
9.2 KiB
Markdown
243 lines
9.2 KiB
Markdown
# 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) ✅ *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)
|