diff --git a/README.md b/README.md
index 7b84d95..855da1a 100644
--- a/README.md
+++ b/README.md
@@ -7,7 +7,8 @@ Elle affiche deux choses qu'elle ne contient pas : l'**agenda**, lu dans le cale
public Nextcloud, et les **dernières pages du wiki**, lues dans
[`derniers-articles.json`](https://wiki.alpinux.org/derniers-articles.json) que le wiki
publie à chaque build. Si l'une ou l'autre source est injoignable, la section
-correspondante se masque et le reste de la page tient debout.
+correspondante se masque et le reste de la page tient debout. Le **journal des
+nouveautés**, lui, vit dans le dépôt : `site/nouveautes.json`.
---
@@ -16,6 +17,7 @@ correspondante se masque et le reste de la page tient debout.
| Ce que vous voulez faire | Ce que vous faites |
|---|---|
| Modifier la page | Éditer `site/index.html`, pousser sur `main` — la mise en ligne suit |
+| Annoncer une nouveauté | Ajouter une entrée en tête de `site/nouveautes.json` (voir plus bas) |
| Voir le rendu avant de pousser | `python3 -m http.server -d site` puis http://localhost:8000 |
| Comprendre pourquoi ça n'est pas en ligne | `tail -20 /var/log/www-deploy.log` sur le serveur |
| Republier sans nouveau commit | `sudo -u abonnelc /opt/www-alpinux/deploy-www.sh` |
@@ -32,6 +34,7 @@ serveur, pas par `http.server`. Les articles du wiki, eux, s'affichent normaleme
alpinux-www/
├── site/ ce qui part en ligne, tel quel
│ ├── index.html
+│ ├── nouveautes.json le journal des nouveautés, lu par la page
│ ├── robots.txt
│ └── sitemap.xml
└── deploiement/ la chaîne, versionnée avec le site
@@ -44,6 +47,27 @@ alpinux-www/
---
+## Annoncer une nouveauté
+
+La section « Nouveautés » de l'accueil est dessinée à partir de `site/nouveautes.json` —
+un tableau d'entrées, `url` facultative :
+
+```json
+{
+ "date": "2026-09-23",
+ "titre": "Listes de diffusion",
+ "texte": "Une phrase ou deux, à hauteur de visiteur.",
+ "url": "https://messagerie.alpinux.org"
+}
+```
+
+L'ordre du fichier n'a pas d'importance : la page trie sur `date` et n'affiche que les
+six entrées les plus récentes. Les plus anciennes restent dans le fichier, comme
+mémoire. Une entrée sans `titre` ou sans `date` au format `AAAA-MM-JJ` est ignorée ;
+si le fichier disparaît ou devient illisible, la section se masque comme les deux autres.
+
+---
+
## Ce qui se passe après un push
```
diff --git a/site/index.html b/site/index.html
index e243f9d..5ead851 100644
--- a/site/index.html
+++ b/site/index.html
@@ -552,6 +552,65 @@
.wiki-more a { color: #1a6bbf; text-decoration: none; }
.wiki-more a:hover { text-decoration: underline; }
+ /* ── Nouveautés ─────────────────────────────────────────────── */
+ #news-section { margin-top: 3rem; }
+
+ .news {
+ list-style: none;
+ border-left: 2px solid #dce8f5;
+ margin-left: .5rem;
+ padding-left: 1.5rem;
+ }
+
+ .news li {
+ position: relative;
+ padding-bottom: 1.6rem;
+ }
+
+ .news li:last-child { padding-bottom: 0; }
+
+ .news li::before {
+ content: '';
+ position: absolute;
+ left: calc(-1.5rem - 6px);
+ top: .35rem;
+ width: 10px;
+ height: 10px;
+ border-radius: 50%;
+ background: #9fc5e8;
+ box-shadow: 0 0 0 3px #f3f6fb;
+ }
+
+ .news li:first-child::before { background: #1a6bbf; }
+
+ .news-when {
+ font-size: .78rem;
+ font-weight: 700;
+ color: #7a8ba0;
+ letter-spacing: .06em;
+ text-transform: uppercase;
+ display: block;
+ margin-bottom: .2rem;
+ }
+
+ .news-title {
+ font-size: 1rem;
+ font-weight: 600;
+ line-height: 1.35;
+ color: #1a1a2e;
+ text-decoration: none;
+ }
+
+ a.news-title:hover { color: #1a6bbf; text-decoration: underline; }
+
+ .news-text {
+ font-size: .92rem;
+ line-height: 1.6;
+ color: #4a5a6a;
+ margin-top: .25rem;
+ max-width: 62ch;
+ }
+
/* ── Services ───────────────────────────────────────────────── */
.services {
display: grid;
@@ -733,6 +792,11 @@
+
+