docs: changelog et roadmap du projet imagod-web

- CHANGELOG.md : historique complet des fonctionnalités, corrections, limitations
- ROADMAP.md : planification des phases restantes (clipboard, watcher, service, Ditto, cross-compile, etc.)
This commit is contained in:
2026-06-25 08:06:04 -04:00
parent 1ec0d4fbe8
commit 9b06df737d
2 changed files with 357 additions and 0 deletions
+122
View File
@@ -0,0 +1,122 @@
# Changelog — imagod-web
Toutes les modifications notables de imagod-web sont documentées ici.
Le format est basé sur [Keep a Changelog](https://keepachangelog.com/fr/1.0.0/),
et ce projet adhère au [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
---
## [0.1.0] — 2026-06-23
### 🎯 Vision
imagod-web est un **daemon + dashboard web embarqué** pour Imago, le backend intelligent de gestion d'images. Il capture automatiquement les screenshots, les envoie à Imago pour analyse (OCR, AI vision, EXIF), et offre un dashboard responsive pour les consulter.
---
### 🏗️ Architecture
| Composant | Technologie | Statut |
|-----------|-------------|--------|
| **Daemon** | Rust (tokio, clap, rusqlite) | ✅ Partiel |
| **Serveur web** | axum 0.8 + tower-http | ✅ Complet |
| **Frontend** | Vanilla JS (rust-embed) | ✅ Complet |
| **Client API** | reqwest (rustls) → Imago v2 | ✅ Complet |
| **Dédoublonnage** | SHA-256 + SQLite | ✅ Complet |
| **Temps réel** | WebSocket (broadcast) | ✅ Complet |
| **Cross-platform** | Windows (arboard, tray) + Linux (notify) | 🏗️ Partiel |
---
### ✨ Fonctionnalités
#### Dashboard Web (`serve`)
- **Authentification** par clé API Imago (login/logout, localStorage)
- **Galerie responsive** — grille adaptative desktop/mobile, breakpoints 768px et 400px
- **Upload par drag & drop** — zone de drop avec feedback visuel
- **Raccourcis clavier** — `Ctrl+U` pour upload, `Ctrl+V` pour coller depuis le presse-papier
- **Recherche** plein texte (nom, tags, description, texte OCR)
- **Pagination** — navigation par pages de 24 images
- **Modale détail** — aperçu pleine résolution, métadonnées EXIF, texte OCR, description AI
- **Suppression** — bouton 🗑️ par carte + boîte de dialogue de confirmation
- **Gestion des tags** — ajout (+), suppression (×), édition inline des tags
- **Statistiques** — nombre d'images, stockage total, nombre de tags, statut en ligne
- **Notifications toast** — succès/erreur avec code couleur
- **FAB mobile** — bouton d'upload flottant en bas à droite sur mobile
- **WebSocket** — mises à jour en temps réel quand de nouveaux screenshots sont uploadés
- **Thème sombre** — design moderne, palette cohérente
#### Client API Imago v2
- `GET /api/v1/images` — liste paginée
- `GET /api/v1/images/search` — recherche plein texte
- `GET /api/v1/images/{id}` — détail complet (EXIF, OCR, AI, métadonnées)
- `POST /api/v1/images/upload` — upload multipart
- `GET /api/v1/images/{id}/thumbnail-url` — thumbnail signé → proxy binaire
- `GET /api/v1/images/{id}/download-url` — fichier original signé → proxy binaire
- `DELETE /api/v1/images/{id}` — suppression
- `PUT /api/v1/images/{id}/tags` — mise à jour des tags
#### CLI
- `imagod-web serve` — démarre le dashboard web sur `0.0.0.0:9199`
- `imagod-web watcher` — lance le daemon de capture (stub)
- `imagod-web install` — installation comme service Windows (stub)
- `imagod-web uninstall` — désinstallation du service (stub)
- Flags : `--host`, `--port`, `--api-key`, `--api-url`
#### Dédoublonnage
- Hash SHA-256 des images
- Base SQLite locale (`imagod.db`)
- Cache LRU configurable
#### Configuration
- Fichier TOML (`~/.config/imagod-web/imagod.toml`)
- Sections : `[imago]`, `[watcher]`, `[dedup]`, `[server]`
- Variables d'environnement supportées
---
### 🐛 Corrections
- **Structs Imago v2** — `ExifData`, `OcrData`, `AiData` corrigés pour matcher l'API réelle (champs imbriqués camera/gps, `has_text`, nouveaux champs AI)
- **Affichage des images** — passage aux URLs signées (`thumbnail-url`/`download-url`) car les endpoints directs `/thumbnail` et `/file` n'existent pas dans Imago
- **Fallback placeholder** — remplacement du data URI SVG cassé par un placeholder DOM (emoji + texte)
- **Erreur de décodage Rust** — champ `tags` manquant dans les structs, corrigé avec `Option<Vec<String>>`
---
### ⚠️ Limitations connues
| Problème | Impact | Solution |
|----------|--------|----------|
| Clé API sans scope `images:delete` | DELETE → 403 Forbidden | Ajouter le scope dans l'admin Imago |
| Endpoint `PUT /tags` absent d'Imago | Tags non persistants | Déployer la v2.1 d'Imago |
| Stockage Imago partiellement cassé | Upload 500, file_size=0 | Correction backend Imago |
| Pas de support Linux desktop natif | Watcher clipboard inactif | Alternative `wl-clipboard` / `xclip` |
| Pas de cross-compilation testée | Binaire Linux seulement | CI/CD + tests multi-plateformes |
---
### 📦 Dépendances clés
| Crate | Version | Usage |
|-------|---------|-------|
| axum | 0.8 | Serveur HTTP + WebSocket |
| reqwest | 0.12 | Client HTTP Imago (rustls) |
| serde / serde_json | 1.x | Serialization JSON |
| rusqlite | 0.32 | Base de dédoublonnage |
| rust-embed | 8 | Frontend embarqué dans le binaire |
| clap | 4 | CLI |
| tokio | 1 | Runtime async |
| sha2 | 0.10 | Hashing SHA-256 |
| dashmap | 6 | État partagé thread-safe |
| chrono | 0.4 | Formatage dates |
---
### 🔗 Liens
- **Code source** : https://git.dracodev.net/Projets/imagod-web
- **Backend Imago** : https://git.dracodev.net/Projets/Imago
- **Auteur** : Bruno Charest <bruno.charest@gmail.com>
- **Licence** : MIT
+235
View File
@@ -0,0 +1,235 @@
# 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)
**Objectif** : Capture automatique des screenshots depuis le presse-papier Windows.
| Fichier | Action | Détail |
|---------|--------|--------|
| `src/clipboard.rs` | Implémenter | Remplacer les `todo!()` par arboard |
| | `has_image()` | Détecter si le clipboard contient une image |
| | `get_image_bytes()` | Extraire l'image en `Vec<u8>` (PNG/BMP) |
**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
**Dépendances estimées** : crate `image` (si pas déjà présent)
---
## 🟡 Phase 6 — Boucle principale du Watcher
**Objectif** : Assembler clipboard + dédoublonnage + upload dans une boucle de polling.
| Fichier | Action | Détail |
|---------|--------|--------|
| `src/watcher.rs` | Implémenter | Remplacer le stub `loop` commenté |
| | Polling | Intervalle configurable (`watcher.poll_interval_ms`) |
| | Pipeline | Détection → hash → dédoublonnage → upload → notification WS |
| | Windows | Appeler `clipboard::has_image()` + `clipboard::get_image_bytes()` + `window_info::get_active_window_title()` |
| | Linux | Fallback : détection via `notify` sur `~/Pictures/Screenshots/` |
**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 | 🟡 À faire | Haute | 2–3h |
| 6 Watcher | 🟡 À faire | Haute | 2–4h |
| 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) → cœur du produit
4. **Implémenter Phase 6** (watcher loop) → premier flux complet fonctionnel