# 🌌 ObsiViewer — Explorateur de voĂ»te Obsidian ObsiViewer est une application **Angular 20** qui permet de parcourir une voĂ»te Obsidian en lecture seule : navigation dans l’arborescence des notes, rendu Markdown enrichi, visualisation du graphe et filtrage avancĂ© par tags ou dates. > 📝 **Mode dĂ©mo par dĂ©faut** : l’interface repose sur des donnĂ©es gĂ©nĂ©rĂ©es par `VaultService`. Vous pouvez connecter ObsiViewer Ă  vos fichiers Markdown via le serveur Express fourni. --- ## 🚀 Aperçu rapide - **Framework** : Angular + TailwindCSS - **Rendu Markdown** : `MarkdownService` (supporte Mermaid, KaTeX, surlignage de code) - **Visualisations** : - Explorateur de fichiers (`app/components/file-explorer/`) - Graphe de liens (`app/components/graph-view/`) - Vue tags (`app/components/tags-view/`) - Recherche + calendrier (intĂ©grĂ© Ă  `app.component.simple.html`) - **Backend optionnel** : serveur Express (`server/index.mjs`) qui lit la voĂ»te physique (`vault/`) et expose une API REST. --- ## 🧰 PrĂ©requis - Node.js **20+** et npm (`node --version`) - Angular CLI (facultatif mais pratique) : `npm install -g @angular/cli` - Docker (facultatif) pour utiliser les scripts situĂ©s dans `docker/` et `docker-compose/` --- ## ⚙ Installation & scripts utiles ```bash npm install # Installe toutes les dĂ©pendances npm run dev # Lance l'app en mode dĂ©veloppement (http://localhost:3000) npm run build # Compile la version production dans dist/ npm run preview # Sert la build de prod avec ng serve ``` 👉 Le port de dev et la configuration de build sont dĂ©finis dans `angular.json`. --- ## đŸ—‚ïž Structure du dĂ©pĂŽt - `src/` : composant principal `app.component.ts`, vue simplifiĂ©e, composants UI, services, types - `server/` : serveur Express pour charger vos notes locales et fournir l’API `/api` - `vault/` : emplacement attendu des fichiers Markdown (créé au dĂ©marrage du serveur) - `docker/` & `docker-compose/` : scripts et configurations pour l’exĂ©cution en conteneurs - `index.tsx` : point d’entrĂ©e Angular (bootstrap sans zone) - `metadata.json` : mĂ©tadonnĂ©es pour l’intĂ©gration AI Studio --- ## 🔌 Configurer l’API locale (optionnel) ```bash npm run build # gĂ©nĂšre dist/ node server/index.mjs # lance l'API + serveur statique sur http://localhost:4000 ``` Assurez-vous que vos notes Markdown se trouvent dans `vault/`. L'API expose : - `GET /api/health` - `GET /api/vault` - `GET /api/vault/bookmarks` - RĂ©cupĂšre les favoris depuis `/.obsidian/bookmarks.json` - `PUT /api/vault/bookmarks` - Sauvegarde les favoris (avec gestion de conflits via `If-Match`) - `GET /api/files/metadata` - `GET /api/files/by-date?date=2025-01-01` - `GET /api/files/by-date-range?start=...&end=...` --- ## ⭐ Gestion des favoris (Bookmarks) ObsiViewer implĂ©mente une **gestion complĂšte des favoris** 100% compatible avec Obsidian, utilisant `/.obsidian/bookmarks.json` comme source unique de vĂ©ritĂ©. ### FonctionnalitĂ©s - **Synchronisation bidirectionnelle** : Les modifications dans ObsiViewer apparaissent dans Obsidian et vice-versa - **Deux modes d'accĂšs** : - **File System Access API** (prĂ©fĂ©rĂ©) : SĂ©lectionnez votre dossier vault directement depuis le navigateur - **Serveur Bridge** : L'API Express lit/Ă©crit le fichier `.obsidian/bookmarks.json` - **OpĂ©rations complĂštes** : CrĂ©er, modifier, supprimer, rĂ©organiser, grouper - **Import/Export** : Importer ou exporter vos favoris au format JSON Obsidian - **DĂ©tection de conflits** : Alerte si le fichier a Ă©tĂ© modifiĂ© en externe avec options de rĂ©solution - **Sauvegarde automatique** : Debouncing de 800ms pour Ă©viter les Ă©critures excessives - **Interface responsive** : OptimisĂ©e pour desktop et mobile avec thĂšmes clair/sombre ### Comment utiliser #### Mode Navigateur (File System Access API) 1. Cliquez sur **"Connect Vault"** dans le panneau Favoris 2. SĂ©lectionnez le dossier racine de votre vault Obsidian 3. Accordez les permissions de lecture/Ă©criture 4. ObsiViewer accĂšde directement Ă  `.obsidian/bookmarks.json` > ⚠ NĂ©cessite Chrome 86+, Edge 86+, ou Opera 72+ (pas de support Firefox/Safari) #### Mode Serveur ```bash node server/index.mjs ``` Le serveur lit/Ă©crit automatiquement `vault/.obsidian/bookmarks.json`. ### Structure des donnĂ©es Format JSON compatible Obsidian : ```json { "items": [ { "type": "group", "ctime": 1704067200000, "title": "Mes Notes", "items": [ { "type": "file", "ctime": 1704067201000, "path": "Notes/important.md", "title": "Note Importante" } ] } ] } ``` Types supportĂ©s : `group`, `file` (dossiers, recherches, headings, blocks parsĂ©s mais non affichĂ©s). ### Architecture technique ``` src/core/bookmarks/ ├── types.ts # Types TypeScript ├── bookmarks.utils.ts # OpĂ©rations arbre + validation ├── bookmarks.repository.ts # Adapters de persistance └── bookmarks.service.ts # Service Angular avec Signals src/components/ ├── bookmarks-panel/ # Composant principal └── bookmark-item/ # Item d'arborescence ``` Le service utilise les **Signals Angular** pour la rĂ©activitĂ© et implĂ©mente un systĂšme de sauvegarde automatique avec debounce. --- ## 🐳 ExĂ©cution avec Docker (facultatif) - `docker/build-img.ps1` / `docker/deploy-img.ps1` pour construire et pousser une image locale - `docker/Dockerfile.origi` pour une build manuelle (`docker build ...`) - `docker-compose/docker-compose.yml` pour orchestrer un conteneur prĂ©configurĂ© 💡 Pensez Ă  personnaliser les fichiers `.env` (`.env.local`, `docker-compose/.env`) avant toute utilisation rĂ©elle. --- ## đŸ§Ș Tests & qualitĂ© - Aucun test automatisĂ© n’est fourni pour l’instant. - Ajoutez vos propres suites (`ng test`, `ng e2e`) selon vos besoins. --- ## ⚠ Points d’attention - Les scripts Docker hĂ©ritĂ©s supposent la prĂ©sence d’un dossier `server/` et d’un schĂ©ma `db/schema.sql` (non inclus ici). - Les secrets fournis en exemple dans les fichiers `.env` doivent ĂȘtre remplacĂ©s avant toute utilisation en production. - Le rendu Markdown peut nĂ©cessiter des adaptations pour des voĂ»tes Obsidian complexes. --- ## 📚 Ressources - Angular : - CLI Angular (`ng serve`) : - Guide Docker Compose : voir `docker-compose/README.md` --- ✹ Bonne exploration dans ObsiViewer !