diff --git a/CLAUDE.md b/CLAUDE.md
index 978c7bd..6aa3176 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -2270,6 +2270,28 @@ lui-même** pour les afficher dans son catalogue et son interface d'administrati
compilation, et rien n'est recompilé sur le serveur. Le manifeste déclare donc
l'application en `full_domain`.
+**`all_users`, et la question n'est plus posée** (2026-08-22). `init_main_permission` a
+quitté `[install]` au profit de `resources.permissions.main.allowed = "all_users"`.
+Vérifié dans le cœur YunoHost (`src/utils/resources.py`) : `allowed` **l'emporte** sur la
+question, qui n'aurait donc fait que laisser croire que la réponse comptait.
+
+⚠️ **Ce n'est pas un réglage de confort : `visitors` casserait deux invariants du code.**
+L'application n'a aucune authentification propre — elle fait confiance à `YNH_USER` parce
+que SSOwat l'écrase à chaque requête, exactement comme elle n'écoute que sur `127.0.0.1` —
+et **toute personne autorisée peut supprimer n'importe quel livre** du catalogue commun,
+sans rôle ni lecture seule. Ouverte au public, la portée « personnelle » (statuts de
+lecture, envies) n'existe plus du tout.
+
+⚠️ **Pas de `protected = true`, délibérément** : restreindre à un groupe dédié reste
+légitime, et c'est l'affaire de l'administrateur. C'est l'**élargissement** qui est un
+contresens, pas le réglage.
+
+⚠️ **`allowed` n'agit qu'à la CRÉATION de la permission** (`if perm not in existing_perms`).
+Une montée de version ne réaligne rien : un accès élargi à la main le reste. Un commentaire
+de manifeste n'atteignant aucun administrateur, l'avertissement vit dans
+`doc/DESCRIPTION.md` (page d'installation) et `doc/ADMIN.md` (interface d'administration) —
+les deux seuls fichiers du paquet que **YunoHost lit lui-même**.
+
## Héberger hors YunoHost — voie SECONDAIRE, ajoutée le 2026-08-21
Demande venue d'un tiers voulant installer le projet sur un **Synology**. `Dockerfile`,
@@ -2374,35 +2396,43 @@ référencés mais qui partaient dans chaque release. L'archive passe de **69 à
l'écart est bien moindre que sur disque (8,4 Mo), les *source maps* étant du texte qui se
compresse très bien. **Toujours mesurer sur l'archive, jamais sur le disque.**
-## Les URL de dépôt sont un placeholder — sortie du projet (2026-08-22)
+## ⚠️ Le dépôt de travail garde ses vraies URL — corrigé le 2026-08-22
-`https://forge.example.org/mabibli` remplace partout l'URL du Gitea privé de l'utilisateur.
-`example.org` est réservé à la documentation par la **RFC 2606** : le placeholder est donc
-définitivement injoignable, ce qui est exactement ce qu'on veut d'un placeholder.
+**Erreur commise ce jour-là, et instructive.** Les URL du Gitea de l'utilisateur avaient été
+remplacées partout par un placeholder `forge.example.org`, dans le dépôt **de travail**.
+Deux conséquences, la seconde immédiate :
-⚠️ **Une seule ligne commande tout** : `depot_code`, en tête de `build/publier.sh`. Les URL
-de release, d'archive et le message de fin en dérivent. `--depot-code URL` fait la même
-chose sans modifier le fichier.
+1. le remplacement global a réécrit `amd64.url` dans `manifest.toml` — **le champ que la
+ documentation qu'on venait d'écrire désignait comme « à ne jamais changer à la main »**,
+ parce que `publier.sh` le régénère à chaque publication. Le manifeste de la 0.5.0, déjà
+ publiée, s'est mis à pointer une archive introuvable ;
+2. l'installation a échoué, et **le symptôme ne désignait pas la cause** : `ynh_setup_source`
+ annonce une URL morte, sans rapport apparent avec un nettoyage de documentation.
-⚠️ **`publier.sh` REFUSE de publier tant que le placeholder est en place**, et il refuse
-**avant de compiler**, comme ses autres garde-fous. Sans lui, on écrirait dans
-`manifest.toml` une `amd64.url` que personne ne peut télécharger — et l'échec surviendrait
-**bien plus loin**, à l'installation, sous la forme d'un `ynh_setup_source` en erreur, sans
-rapport apparent avec la cause. C'est la même famille de panne que le manifeste corrigé mais
-non poussé : un défaut posé ici, constaté ailleurs.
+⚠️ **L'erreur de conception derrière** : le placeholder avait sa place dans la **copie
+publique**, pas dans le dépôt de travail. Ce dernier sert au déploiement réel de son auteur
+et doit rester opérationnel ; la copie publique est produite à part, sans historique et avec
+les URL neutralisées — la marche à suivre est dans `docs/publier-une-version.md`.
-⚠️ **Ce que le remplacement de fichiers ne règle PAS** : l'**historique git** porte ces URL
-dans chaque ancien commit, et le dépôt du paquet contient en plus une archive de 68 Mo
-committée par erreur à la 0.1.0 puis retirée. Seul un dépôt **neuf, sans historique**, en
-vient à bout — c'est ce qui a été décidé pour la sortie.
+**Règle qui en sort, et qui dépasse ce cas** : anonymiser un dépôt qui sert encore, c'est le
+casser. On anonymise **une copie**, jamais l'original.
-⚠️ **`amd64.url` ne se change pas à la main** : `publier.sh` la réécrit à chaque
-publication. La corriger donnerait l'illusion que c'est fait.
+### Ce qui reste en place, et qui vaut
-Ce qui **reste** volontairement : `maintainers = ["mathieu"]` (c'est le champ prévu par le
-format v2), l'adresse de contact et le site de l'auteur dans `/a-propos` (décidé au lot Y —
-l'AGPL attend d'ailleurs qu'on puisse joindre la source, donc l'auteur), et `"mathieu"`
-comme nom de lecteur dans les jeux de test.
+- **`depot_code`, en tête de `build/publier.sh`**, commande toutes les URL dérivées. Une
+ ligne à changer, `--depot-code` pour un essai.
+- **Le garde-fou refuse de publier si l'URL contient `example.org`**, et refuse **avant de
+ compiler**. Il ne se déclenche pas dans le dépôt de travail — il sert à la copie publique,
+ pour que celui qui reprend le projet renseigne `depot_code` avant sa première release
+ plutôt que de le découvrir à l'installation.
+- **Les cinq variables d'environnement jumelles restent supprimées** (`MABIBLI_SOURCE_DIR`,
+ `MABIBLI_BASE_URL`, `MABIBLI_URL_RELEASES`, `MABIBLI_OUTPUT_DIR`, `MABIBLI_VERSION`) :
+ chacune doublait une option qu'elle répétait, et rien ne disait laquelle l'emportait.
+
+⚠️ **L'historique git n'est pas anonymisable** : il porte les URL réelles dans chaque ancien
+commit, et le dépôt du paquet contient en plus une archive de 68 Mo committée par erreur à
+la 0.1.0 puis retirée. Seul un dépôt **neuf, sans historique**, en vient à bout — d'où le
+`rm -rf .git` **avant** le `git init` dans la marche à suivre.
## Historique du projet (pourquoi ces choix)
diff --git a/MaBibli.Client/Pages/APropos.razor b/MaBibli.Client/Pages/APropos.razor
index 9494151..1bd3b88 100644
--- a/MaBibli.Client/Pages/APropos.razor
+++ b/MaBibli.Client/Pages/APropos.razor
@@ -121,7 +121,7 @@
private const string Site = "https://www.limonier.be";
/// Dépôt du code — ce que l'AGPL attend qu'on rende accessible.
- private const string Depot = "https://forge.example.org/mabibli";
+ private const string Depot = "https://git.akbar.nohost.me/mathieu/mabibli";
private VersionApplication? _version;
diff --git a/README.md b/README.md
index f270dcd..beb12ed 100644
--- a/README.md
+++ b/README.md
@@ -65,12 +65,14 @@ dotnet run --project MaBibli.Api
L'API sert aussi le client compilé : une seule commande suffit.
-## ⚠️ Avant de publier ce projet quelque part
+## Ce dépôt porte les URL du serveur de son auteur
-Les URL de dépôt sont un **placeholder volontaire**, `https://forge.example.org/mabibli`.
-Une seule ligne les commande toutes — `depot_code`, en tête de
-`mabibli_ynh/build/publier.sh` — et `publier.sh` **refuse de publier tant qu'elle n'est
-pas changée**. Le détail est dans
+`https://git.akbar.nohost.me/mathieu/…` — c'est le dépôt **de travail**, et il doit rester
+opérationnel. Une seule ligne les commande toutes : `depot_code`, en tête de
+`mabibli_ynh/build/publier.sh`.
+
+Pour en tirer une **copie publique** destinée à des tiers, la marche à suivre — dépôt neuf
+sans historique, URL neutralisées — est dans
[docs/publier-une-version.md](docs/publier-une-version.md).
## ⚠️ Depuis la 0.5.0, aucune base antérieure n'est migrable
diff --git a/docs/installer.md b/docs/installer.md
index 4e4e00a..a4e3fb3 100644
--- a/docs/installer.md
+++ b/docs/installer.md
@@ -37,7 +37,7 @@ version ultérieures fonctionnent normalement.
## Le paquet YunoHost
-MaBibli se déploie via un **second dépôt**, [`mabibli_ynh`](https://forge.example.org/mabibli_ynh),
+MaBibli se déploie via un **second dépôt**, [`mabibli_ynh`](https://git.akbar.nohost.me/mathieu/mabibli_ynh),
qui **ne contient aucun code C#** : il porte le manifeste, les configurations nginx et
systemd, et les scripts d'installation. Toute la documentation, elle, vit ici — ce
fichier est le point d'entrée unique du projet.
@@ -178,7 +178,7 @@ Vérification, à faire **sans être authentifié** (autre navigateur, ou `curl`
ci-dessous) :
```bash
-curl -fsSLI "https://forge.example.org/mabibli/releases/download/v0.1.0/mabibli-0.1.0-linux-x64.tar.gz" | head -1
+curl -fsSLI "https://git.akbar.nohost.me/mathieu/mabibli/releases/download/v0.1.0/mabibli-0.1.0-linux-x64.tar.gz" | head -1
```
Attendu : `HTTP/2 200`. Un 404 signifie soit que la release n'est pas déposée, soit que
@@ -200,13 +200,13 @@ Le contrôle qui tranche, quel que soit le chemin suivi — c'est le manifeste *
serveur le lira** :
```bash
-curl -fsSL "https://forge.example.org/mabibli_ynh/raw/branch/main/manifest.toml" | grep amd64
+curl -fsSL "https://git.akbar.nohost.me/mathieu/mabibli_ynh/raw/branch/main/manifest.toml" | grep amd64
```
#### A.5 Installer
```bash
-sudo yunohost app install https://forge.example.org/mabibli_ynh --debug
+sudo yunohost app install https://git.akbar.nohost.me/mathieu/mabibli_ynh --debug
```
YunoHost demande le domaine (celui créé en A.1) et le groupe autorisé (`all_users`).
diff --git a/docs/publier-une-version.md b/docs/publier-une-version.md
index 398b644..419cc53 100644
--- a/docs/publier-une-version.md
+++ b/docs/publier-une-version.md
@@ -11,41 +11,52 @@ Pour vous, qui sortez les versions. Pour installer, voir
| [La chaîne de publication](#publication) | ce que `publier.sh` fait, et ce qu'il refuse |
| [Monter de version](#b-monter-de-version) | pas à pas |
-## Avant de publier ce projet quelque part
+## L'URL du dépôt, et la copie publique
-Les URL de dépôt sont un **placeholder volontaire**, `https://forge.example.org/mabibli`
-(le domaine `example.org` est réservé à la documentation par la RFC 2606, donc
-définitivement injoignable). Rien ne fonctionnera tant qu'il n'est pas remplacé.
+Ce dépôt est le dépôt **de travail** : il porte les URL réelles du serveur de son auteur,
+`https://git.akbar.nohost.me/mathieu/…`, et c'est ce qui le rend opérationnel.
-**Une seule ligne commande tout le reste** — `depot_code`, en tête de
-`mabibli_ynh/build/publier.sh`. Elle produit les URL de release, celles d'archive, et le
-message de fin. Pour un essai ponctuel, `--depot-code https://…` fait la même chose sans
-modifier le fichier.
+**Une seule ligne les commande toutes** — `depot_code`, en tête de `build/publier.sh`.
+Les URL de release, d'archive et le message de fin en dérivent. `--depot-code URL` fait la
+même chose sans modifier le fichier, pour un essai ponctuel.
-⚠️ **`publier.sh` refuse de publier tant que le placeholder est en place**, et il refuse
-*avant* de compiler. C'est délibéré : publier avec une URL morte écrirait dans
-`manifest.toml` une `amd64.url` que personne ne peut télécharger, et l'échec surviendrait
-bien plus tard, à l'installation, sous la forme d'un `ynh_setup_source` en erreur — sans
-rapport apparent avec la cause.
+⚠️ **`amd64.url` dans `manifest.toml` ne se change JAMAIS à la main** : `publier.sh` la
+réécrit à chaque publication. La modifier hors de ce chemin produit un manifeste qui pointe
+une archive introuvable — l'échec survient alors **bien plus loin**, à l'installation, dans
+`ynh_setup_source`, sans rapport apparent avec la cause. C'est arrivé le 2026-08-22.
-Restent à changer à la main, une fois seulement :
+### Produire une copie publique
-| Fichier | Quoi |
-|---|---|
-| `mabibli_ynh/manifest.toml` | `code = "…"`, et `maintainers` |
-| `mabibli_ynh/conf/systemd.service` | `Documentation=…` |
-| `mabibli_ynh/doc/ADMIN.md` | le lien de bas de page |
-| `mabibli_ynh/README.md`, ce fichier | les liens et les commandes d'exemple |
-| `MaBibli.Client/Pages/APropos.razor` | `Depot`, `Site`, et l'adresse de contact |
+Pour publier le projet à destination de tiers, on **copie** — on ne transforme pas le dépôt
+de travail :
-⚠️ **`amd64.url` dans le manifeste n'est PAS à changer à la main** : `publier.sh` la
-réécrit à chaque publication. La corriger donnerait l'illusion que c'est fait alors que la
-source du problème est ailleurs.
+```bash
+cd ~/Code && rm -rf mabibli-public && cp -r mabibli mabibli-public
+rm -rf mabibli-public/.git
+```
-⚠️ **Le dépôt du code doit être PUBLIC.** `ynh_setup_source` télécharge sans jeton, et
-Gitea comme GitHub répondent **404** — pas 403 — à un anonyme sur un dépôt privé. Le
-symptôme est alors rigoureusement identique à « la release n'existe pas ». Contrôle qui
-tranche, hors session authentifiée : `curl -fsSLI ""`.
+⚠️ **Le `rm -rf .git` vient AVANT le `git init`**, et un `git clone` ne conviendrait pas :
+l'historique porte les URL réelles dans chaque ancien commit — et, côté paquet, une archive
+de 68 Mo committée par erreur à la 0.1.0 puis retirée.
+
+Puis neutraliser les URL et l'identité :
+
+```bash
+cd mabibli-public
+grep -rl 'git\.akbar\.nohost\.me' . | xargs sed -i \
+ -e 's|https://git\.akbar\.nohost\.me/mathieu/mabibli_ynh|https://forge.example.org/mabibli_ynh|g' \
+ -e 's|https://git\.akbar\.nohost\.me/mathieu/mabibli|https://forge.example.org/mabibli|g'
+git init -b main && git add -A && git commit -m "MaBibli"
+```
+
+`forge.example.org` est injoignable par construction — `example.org` est réservé à la
+documentation par la **RFC 2606**. C'est voulu : `publier.sh` **refuse de publier** tant
+qu'une URL en `example.org` est en place, et il refuse **avant de compiler**. Celui qui
+reprend le projet doit donc renseigner `depot_code` avant sa première release, plutôt que
+de découvrir le problème à l'installation.
+
+Restent à revoir à la main dans la copie : `maintainers` dans `manifest.toml`, et l'adresse
+de contact et le site dans `MaBibli.Client/Pages/APropos.razor`.
## Compilation
@@ -242,7 +253,7 @@ Créer la release `v0.1.1` dans Gitea, y téléverser
`build/dist/mabibli-0.1.1-linux-x64.tar.gz`, puis vérifier sans authentification :
```bash
-curl -fsSLI "https://forge.example.org/mabibli/releases/download/v0.1.1/mabibli-0.1.1-linux-x64.tar.gz" | head -1
+curl -fsSLI "https://git.akbar.nohost.me/mathieu/mabibli/releases/download/v0.1.1/mabibli-0.1.1-linux-x64.tar.gz" | head -1
```
#### B.5 Pousser le paquet
@@ -263,7 +274,7 @@ sudo yunohost backup create --apps mabibli
```
```bash
-sudo yunohost app upgrade mabibli -u https://forge.example.org/mabibli_ynh --debug
+sudo yunohost app upgrade mabibli -u https://git.akbar.nohost.me/mathieu/mabibli_ynh --debug
```
⚠️ **L'option `-u` n'est pas facultative ici.** MaBibli n'est pas dans le catalogue