# #77 — Application Desktop native — Tauri (Windows / Linux / macOS) > **Statut :** 🔵 En cours — livré : A/B/C/D/E/F ; reste signature de code (optionnel), wizard 1er lancement (optionnel), 6 tests E2E manuels > **Effort :** 8-12 jours | **Impact :** 🟡 | **Framework :** Tauri v2 (Rust + Webview) > **Références :** [Roadmap](../ROADMAP.md) · [Guide de build & releases](../DEVELOPMENT_AND_RELEASES.md) - **Description :** Packager ObsiGate en application desktop native autonome. L'utilisateur télécharge un `.exe` (Windows) ou un `.AppImage` (Linux), l'installe, et lance ObsiGate comme n'importe quelle app — sans Docker, sans terminal, sans navigateur. Le backend Python est embarqué, le frontend s'affiche dans une webview native. L'expérience est identique à l'application web, avec des capacités supplémentaires (accès fichiers natif, notifications OS, tray icon). - **Architecture :** ``` ObsiGate.exe (Tauri shell ~5 Mo) ├── python-embed/ ← Python 3.11 embarqué (~30 Mo) │ ├── backend/ ← Code FastAPI existant │ └── site-packages/ ← Dépendances gelées ├── frontend/ ← HTML/CSS/JS (identique au web) └── obsigate-desktop ← Binaire Rust (lance Python + ouvre webview) ``` - **Pourquoi Tauri plutôt qu'Electron ?** - Binaire de ~35-40 Mo contre ~180 Mo pour Electron (pas de Chromium embarqué) - RAM idle ~50 Mo contre ~200 Mo — la webview utilise le moteur du navigateur système - Rust gère le cycle de vie du backend Python (spawn, health check, kill propre) - Signature de code native Windows/macOS pour éviter les faux positifs antivirus - Auto-update natif via le mécanisme de Tauri (vérifie un endpoint JSON) - **Sous-tâches :** ## A. Initialisation du projet Tauri (1 jour) — ✅ livré (vérifié 2026-09) - [x] Toolchain : tauri-cli 2.11.4 / rustc 1.94.1 - [x] Projet Tauri v2 dans `desktop/` (Cargo.toml, build.rs) - [x] `tauri.conf.json` : fenêtre 1200×800 (min 800×600), titre "ObsiGate" - [x] Build : cibles `.msi`/`.nsis` (Windows), `.deb`/`.AppImage` (Linux) - [x] Icônes desktop dans `desktop/icons/` (.ico, .icns, .png) ## B. Intégration du backend Python (2-3 jours) — ✅ livré (variante : uvicorn spawné directement, pas de sidecar.py) - [x] Bundle Python : `desktop/python-embed/` (python3.11-embed + site-packages, validé par validate-structure.sh) - [x] Lancement backend : `spawn_backend()` Rust lance `python-embed -m uvicorn backend.main:app` (équivalent sidecar), logs dans `%APPDATA%/ObsiGate/logs/backend.log` - [x] `main.rs` : spawn processus fils, health check (`GET /api/health`, 30 essais × 2s), kill propre (SIGTERM→wait→kill) - [x] Menu tray (voir section C ✅) - [x] Gestion du port : `pick_free_port()` scan 17890..17899 si occupé (commit c066b2c, 3 tests Rust) ## C. Fonctionnalités desktop natives (2-3 jours) — ✅ COMPLÉTÉ - [x] **Sélecteur de dossier** : `pick_vault_folder` via `tauri_plugin_dialog` → ajoute le vault dans config.json - [x] **Thème système** : `get_system_theme` lit le thème OS → appliqué automatiquement - [x] **Notifications natives** : `tauri-plugin-notification` intégré — remplace le service worker Push API - [x] **Associations de fichiers** : `.md` → « Ouvrir avec ObsiGate » dans `tauri.conf.json` - [x] **Menu natif** : Fichier (Nouvelle fenêtre, Fermer, Quitter) / Édition (Annuler, Rétablir, Couper, Copier, Coller, Tout sélectionner) / Aide (À propos) - [x] **Raccourcis clavier** : `Ctrl+N`, `Ctrl+W`, `Ctrl+Q`, `Ctrl+Z`, `Ctrl+Shift+Z`, `Ctrl+X/C/V/A` - [x] **Tray icon** : menu contextuel (Ouvrir, À propos, Quitter) + toggle fenêtre au clic gauche - [x] **Single instance** : `tauri-plugin-single-instance` — deuxième lancement focus la fenêtre existante - [x] **Auto-update** : `tauri-plugin-updater` configuré → vérifie les releases Gitea - [x] **Pas de terminal visible** : `#![windows_subsystem = "windows"]` + `CREATE_NO_WINDOW` sur le processus Python - [x] **Persistance fenêtre** : position/taille sauvegardée dans `config.json` ## D. Build et distribution (2 jours) — ✅ COMPLÉTÉ - [x] **CI/CD automatisé** : workflow Gitea Actions `.gitea/workflows/desktop-build.yml` — build Windows + Linux à chaque push sur `main` (si `desktop/` modifié), upload des artefacts `.msi`/`.AppImage`/`.deb` en release - [x] **Build Windows local** : `cargo build --release` vérifié (rustc 1.94.1) — `cargo tauri build --bundles msi` prêt - [x] **Build Linux local** : workflow CI couvre `.deb`, `.rpm`, `.AppImage` - [x] **Auto-update** : `tauri-plugin-updater` configuré → vérifie `https://git.dracodev.net/api/v1/repos/Projets/ObsiGate/releases/latest` - [ ] **Signature de code** : configurer le certificat (optionnel mais recommandé pour Windows) - [x] **Page de release** : README desktop existe (`desktop/README.md`) ## E. Expérience utilisateur (1 jour) — ✅ COMPLÉTÉ - [x] Écran de chargement pendant le démarrage du backend (« ObsiGate démarre... » avec spinner) — splash inline `#boot-splash` dans `index.html`, retiré quand `app.js` signale le boot ; statut mis à jour depuis Rust - [x] Gestion des erreurs : backend crash → `showBackendCrashBanner()` appelé par le monitor loop toutes les 5s - [x] Sauvegarde des préférences desktop : position/taille fenêtre sauvées dans `%APPDATA%/ObsiGate/config.json` au close + restauration au startup - [x] Première expérience : config par défaut auto-créée au premier lancement (vault `~/voute_obsidian`, dir `~USERPROFILE`) - [ ] Wizard interactif « Choisissez votre vault » au premier lancement (optionnel — config auto suffisante) - [ ] Jumplist vaults récents dans le menu Démarrer (optionnel) ## F. Tests (1 jour) — ✅ COMPLÉTÉ - [x] 16 tests Rust unitaires : config roundtrip, JSON parsing (empty/partial/corrupted), vault dedup, dir remove, backend URL, paths, branding, edge cases - [x] Build debug + release vérifié (rustc 1.94.1, tauri-cli 2.11.4) - [x] CI desktop workflow existant (desktop-build.yml) - [ ] Test E2E : installation → premier lancement → wizard vault → ouverture fichier (manuel) - [ ] Test E2E : tray icon → réduire → restaurer (manuel) - [ ] Test E2E : notifications natives → fichier modifié → popup OS (manuel) - [ ] Test E2E : association `.md` → double-clic → ouvre dans ObsiGate (manuel) - [ ] Test E2E : auto-update → nouvelle version → install (manuel) - [ ] Test E2E : désinstallation propre (manuel) - **Prérequis techniques :** - Rust ≥ 1.75 (stable) — installé via `rustup` - Tauri CLI ≥ 2.0 — `cargo install tauri-cli` - Python 3.11 embed — téléchargé depuis python.org - NSIS (Windows) — pour le générateur d'installateur `.exe` - AppImageKit (Linux) — pour le packaging portable