# MaBibli Application de gestion de bibliothèque personnelle, self-hosted sur YunoHost. ## Demande initiale Gérer une bibliothèque personnelle (livres physiques et numériques), avec : - **Liste des livres physiques** - **Liste des livres ebooks** - **Gestion de prêts** — prêter un livre à quelqu'un, marquer comme récupéré, historique des prêts - **Récupération automatique des infos via ISBN** (titre, auteur, éditeur, couverture) — scan caméra + saisie manuelle - **Consultation hors-ligne** de la bibliothèque existante (le lookup ISBN, lui, nécessite le réseau) - **Statuts de lecture** — à lire, en cours, lu, etc. ## Contraintes techniques - **Langage** : C# / ASP.NET Core - **Frontend** : Blazor WebAssembly, en **PWA** (installable, utilisable hors-ligne pour la consultation de la bibliothèque déjà enregistrée) - **Scan code-barres** : **zbar** (WebAssembly, LGPL-2.1) — voir `CLAUDE.md` pour l'historique de la bascule depuis ZXing.Net - **Accès** : smartphone (GSM) et PC, via navigateur - **Multi-utilisateur** : géré via le SSO de **YunoHost** (en-têtes SSOwat, pas d'auth custom) — **collection commune** au foyer, avec traçabilité de qui a ajouté chaque livre - **Base de données** : **SQLite** - **Hébergement** : **YunoHost**, en installation **native (sans Docker)** — packaging façon `_ynh`, inspiré de [radarr_ynh](https://github.com/YunoHost-Apps/radarr_ynh) (déploiement .NET self-contained, pas de dépendance dotnet-runtime côté système) - **Sources ISBN** : cascade **BnF (SRU) puis OpenLibrary** — bases libres, sans clé API, pas de dépendance à Google Books. La BnF passe en premier pour la couverture du fonds francophone. Voir `CLAUDE.md` pour le détail - **Ebooks** : fiches d'inventaire uniquement, les fichiers ne sont pas hébergés par l'application ## Compilation Prérequis : le SDK **.NET 10** (`dotnet --version`). ### En développement ```bash dotnet build dotnet test ``` Pour lancer l'application en local (l'API sert aussi le client Blazor compilé) : ```bash dotnet run --project MaBibli.Api ``` ### Publication self-contained (ce que le serveur reçoit réellement) Le serveur YunoHost ne compile jamais : il télécharge une archive déjà publiée et la déploie telle quelle (voir « Publication » ci-dessous). Pour produire ce même artefact en local, à des fins de vérification : ```bash dotnet publish MaBibli.Api --configuration Release --runtime linux-x64 --self-contained ``` `MaBibli.Api` référence `MaBibli.Client` : le client Blazor WebAssembly est compilé au passage et atterrit dans `wwwroot/` du publish. Un seul projet à publier suffit donc pour les trois (`MaBibli.Client`, `MaBibli.Shared`, `MaBibli.Api`). `--self-contained` embarque le runtime .NET dans le dossier produit : aucun `dotnet-runtime` n'est requis côté serveur. ⚠️ **Ne jamais compiler sur le serveur YunoHost lui-même** : ce serait imposer le SDK complet à une machine qui n'en a pas besoin, pour une compilation lente. Voir `CLAUDE.md`, section « Chaîne de publication ». ## Publication MaBibli se publie et se déploie via un **second dépôt**, `mabibli_ynh` (le paquet YunoHost), qui contient le script réutilisable `build/publier-release.sh` : ```bash cd ../mabibli_ynh ./build/publier-release.sh ``` Ce script compile ce dépôt (`mabibli`) en `Release` self-contained, **vérifie** le résultat (binaire présent, `wwwroot/` embarqué, toutes les ressources d'`index.html` réellement sur disque, aucun placeholder d'empreinte non substitué), produit une archive `.tar.gz` reproductible, calcule son `sha256`, et met à jour `version`, `amd64.url` et `amd64.sha256` dans `mabibli_ynh/manifest.toml`. Reste ensuite, à la main : créer le tag et la release Git correspondants sur ce dépôt, y téléverser l'archive, puis committer et pousser `manifest.toml` dans `mabibli_ynh` (YunoHost lit le manifeste **depuis Gitea**, jamais une copie locale). **La marche à suivre complète et éprouvée** — première mise en production, montée de version, retour arrière, désinstallation — est dans `mabibli_ynh/PUBLICATION.md`. Ne pas la reproduire ici : ce sont des gestes propres au paquet YunoHost, pas au code de ce dépôt. ## Statut Voir `CLAUDE.md` pour le contexte complet et l'historique des décisions à destination de Claude Code.