diff --git a/CLAUDE.md b/CLAUDE.md
index 51d2d32..978c7bd 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -2374,6 +2374,36 @@ 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)
+
+`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.
+
+⚠️ **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.
+
+⚠️ **`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.
+
+⚠️ **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.
+
+⚠️ **`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** 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.
+
## Historique du projet (pourquoi ces choix)
L'utilisateur a testé deux solutions existantes avant de se lancer dans un projet custom :
@@ -2692,8 +2722,8 @@ Vérifié en exécution, styles calculés à l'appui : à 375 px, menu déployé
Relevé dans la console de l'application installée, le 2026-08-20 :
```
-Access to manifest at 'https://akbar.nohost.me/yunohost/sso?r=…'
- (redirected from 'https://mabibli.akbar.nohost.me/manifest.webmanifest')
+Access to manifest at 'https://exemple.tld/yunohost/sso?r=…'
+ (redirected from 'https://mabibli.exemple.tld/manifest.webmanifest')
blocked by CORS policy: No 'Access-Control-Allow-Origin' header
```
diff --git a/MaBibli.Client/Pages/APropos.razor b/MaBibli.Client/Pages/APropos.razor
index 1bd3b88..9494151 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://git.akbar.nohost.me/mathieu/mabibli";
+ private const string Depot = "https://forge.example.org/mabibli";
private VersionApplication? _version;
diff --git a/README.md b/README.md
index 0cd6513..79c6017 100644
--- a/README.md
+++ b/README.md
@@ -15,6 +15,42 @@ des décisions à destination de Claude Code, et `IDEES.md`, les pistes **non ac
| [Publication](#publication) | sortir une version, en une commande |
| [Mettre en production](#mettre-en-production) | installer, mettre à jour, revenir en arrière, désinstaller |
+## ⚠️ À faire avant de publier ce projet quelque part
+
+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é.
+
+**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.
+
+⚠️ **`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.
+
+Restent à changer à la main, une fois seulement :
+
+| 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 |
+
+⚠️ **`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.
+
+⚠️ **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 ""`.
+
## Demande initiale
Gérer une bibliothèque personnelle (livres physiques et numériques), avec :
@@ -81,7 +117,7 @@ complet à une machine qui n'en a pas besoin, pour une compilation lente. Voir
## Le paquet YunoHost
-MaBibli se déploie via un **second dépôt**, [`mabibli_ynh`](https://git.akbar.nohost.me/mathieu/mabibli_ynh),
+MaBibli se déploie via un **second dépôt**, [`mabibli_ynh`](https://forge.example.org/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.
@@ -261,7 +297,7 @@ Vérification, à faire **sans être authentifié** (autre navigateur, ou `curl`
ci-dessous) :
```bash
-curl -fsSLI "https://git.akbar.nohost.me/mathieu/mabibli/releases/download/v0.1.0/mabibli-0.1.0-linux-x64.tar.gz" | head -1
+curl -fsSLI "https://forge.example.org/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
@@ -283,13 +319,13 @@ Le contrôle qui tranche, quel que soit le chemin suivi — c'est le manifeste *
serveur le lira** :
```bash
-curl -fsSL "https://git.akbar.nohost.me/mathieu/mabibli_ynh/raw/branch/main/manifest.toml" | grep amd64
+curl -fsSL "https://forge.example.org/mabibli_ynh/raw/branch/main/manifest.toml" | grep amd64
```
#### A.5 Installer
```bash
-sudo yunohost app install https://git.akbar.nohost.me/mathieu/mabibli_ynh --debug
+sudo yunohost app install https://forge.example.org/mabibli_ynh --debug
```
YunoHost demande le domaine (celui créé en A.1) et le groupe autorisé (`all_users`).
@@ -385,7 +421,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://git.akbar.nohost.me/mathieu/mabibli/releases/download/v0.1.1/mabibli-0.1.1-linux-x64.tar.gz" | head -1
+curl -fsSLI "https://forge.example.org/mabibli/releases/download/v0.1.1/mabibli-0.1.1-linux-x64.tar.gz" | head -1
```
#### B.5 Pousser le paquet
@@ -406,7 +442,7 @@ sudo yunohost backup create --apps mabibli
```
```bash
-sudo yunohost app upgrade mabibli -u https://git.akbar.nohost.me/mathieu/mabibli_ynh --debug
+sudo yunohost app upgrade mabibli -u https://forge.example.org/mabibli_ynh --debug
```
⚠️ **L'option `-u` n'est pas facultative ici.** MaBibli n'est pas dans le catalogue