From 9b06df737de57be219e9dcd39b714b9cb59ca6f6 Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Thu, 25 Jun 2026 08:06:04 -0400 Subject: [PATCH] docs: changelog et roadmap du projet imagod-web MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - CHANGELOG.md : historique complet des fonctionnalités, corrections, limitations - ROADMAP.md : planification des phases restantes (clipboard, watcher, service, Ditto, cross-compile, etc.) --- CHANGELOG.md | 122 ++++++++++++++++++++++++++ ROADMAP.md | 235 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 357 insertions(+) create mode 100644 CHANGELOG.md create mode 100644 ROADMAP.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..3e32d38 --- /dev/null +++ b/CHANGELOG.md @@ -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>` + +--- + +### ⚠️ 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 +- **Licence** : MIT diff --git a/ROADMAP.md b/ROADMAP.md new file mode 100644 index 0000000..53f5f92 --- /dev/null +++ b/ROADMAP.md @@ -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` (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