<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
        <title>Hugo - Balise - arleo.eu</title>
        <link>https://www.arleo.eu/tags/hugo/</link>
        <description>Hugo - Balise - arleo.eu</description>
        <generator>Hugo -- gohugo.io</generator><language>fr</language><lastBuildDate>Mon, 29 Jun 2026 07:00:00 &#43;0200</lastBuildDate><atom:link href="https://www.arleo.eu/tags/hugo/" rel="self" type="application/rss+xml" /><item>
    <title>Hugo SEO : noindex sur les taxonomies pour corriger l&#39;alerte Bing &#34;too many thin pages&#34;</title>
    <link>https://www.arleo.eu/posts/noindex-taxonomies-hugo-bing-seo/</link>
    <pubDate>Mon, 29 Jun 2026 07:00:00 &#43;0200</pubDate>
    <author>Jmr</author>
    <guid>https://www.arleo.eu/posts/noindex-taxonomies-hugo-bing-seo/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/images/noindex-taxonomies-hugo-bing-seo-featured.jpg" referrerpolicy="no-referrer">
            </div><h2 id="contexte">Contexte</h2>
<p>Bing Webmaster Tools remontait une recommandation <strong>&ldquo;There are too many pages with insufficient content&rdquo;</strong> (sévérité : modérée) — 15 pages en erreur, toutes du même type :</p>
<ul>
<li><code>https://www.arleo.eu/en/tags/svg/</code></li>
<li><code>https://www.arleo.eu/en/tags/sonarr/</code></li>
<li><code>https://www.arleo.eu/en/categories/incidents/</code></li>
<li>etc.</li>
</ul>
<p>Ces pages sont les <strong>taxonomies Hugo</strong> — les listes par tag et par catégorie. Elles ne contiennent pas d&rsquo;article en elles-mêmes, juste une liste de liens. Pour Bing, c&rsquo;est du <em>thin content</em>.</p>
<hr>
<h2 id="stratégie-choisie">Stratégie choisie</h2>
<p>Trois options s&rsquo;offraient :</p>
<ol>
<li><strong>Bloquer via <code>robots.txt</code></strong> → déconseillé : empêche le crawl, masque les liens internes</li>
<li><strong>Enrichir le contenu des pages de taxonomie</strong> → trop coûteux pour un blog technique</li>
<li><strong><code>noindex,follow</code></strong> → la bonne réponse : on dit aux robots de ne pas indexer la page, mais de suivre les liens vers les articles</li>
</ol>
<p>L&rsquo;option 3 est retenue. Le <code>follow</code> préserve le maillage interne — les robots continuent de découvrir les articles via ces pages.</p>]]></description>
</item>
<item>
    <title>SEO Hugo : 404 Googlebot, aliases noindex et normalisation des sitemaps</title>
    <link>https://www.arleo.eu/posts/debug-seo-404-broken-links/</link>
    <pubDate>Fri, 29 May 2026 20:30:00 &#43;0200</pubDate>
    <author>Jmr</author>
    <guid>https://www.arleo.eu/posts/debug-seo-404-broken-links/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/images/debug-seo-404-broken-links-featured.jpg" referrerpolicy="no-referrer">
            </div><h2 id="contexte">Contexte</h2>
<p>Google Search Console remontait quatre catégories de problèmes sur arleo.eu :</p>
<ul>
<li><strong>404 Googlebot</strong> : <code>/fr/tag/cloudflare</code>, <code>/en/tag/nginx</code>, <code>/fr/tag/javascript</code>… URLs avec préfixe <code>/fr/</code> ou singulier <code>/tag/</code> jamais servi par nginx</li>
<li><strong>16 pages &ldquo;Exclue par la balise noindex&rdquo;</strong> : toutes des pages de redirection générées par <code>aliases:</code> dans le frontmatter Hugo</li>
<li><strong>Balise robots</strong> : <code>noodp</code> hardcodée dans le thème LoveIt</li>
<li><strong>Sitemap FR/EN</strong> : 104 vs 105 URLs — un tag doublon FR et deux tags manquants</li>
</ul>
<hr>
<h2 id="acte-1--aliases-hugo--redirections-nginx-301">Acte 1 : aliases Hugo → redirections nginx 301</h2>
<h3 id="pourquoi-hugo-génère-des-pages-noindex">Pourquoi Hugo génère des pages noindex</h3>
<p>Hugo génère les entrées <code>aliases:</code> du frontmatter comme des fichiers HTML statiques :</p>]]></description>
</item>
<item>
    <title>Hugo : gel des diagrammes Mermaid en SVG statiques dark/light</title>
    <link>https://www.arleo.eu/posts/debug-mermaid-svg-freeze/</link>
    <pubDate>Fri, 29 May 2026 20:00:00 &#43;0200</pubDate>
    <author>Jmr</author>
    <guid>https://www.arleo.eu/posts/debug-mermaid-svg-freeze/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/images/debug-mermaid-svg-freeze-featured.jpg" referrerpolicy="no-referrer">
            </div><h2 id="problème">Problème</h2>
<p>Les diagrammes Mermaid sur arleo.eu rendaient côté client via <code>cdn.jsdelivr.net</code>. Trois conséquences concrètes :</p>
<ol>
<li><strong>CSP contrainte</strong> — <code>script-src cdn.jsdelivr.net</code> et <code>worker-src cdn.jsdelivr.net</code> obligatoires (Mermaid v11 utilise des Web Workers pour ses parsers).</li>
<li><strong>Flash de rendu</strong> — le diagramme apparaît après l&rsquo;exécution JS, créant un décalage visible.</li>
<li><strong>Thème dark ignoré</strong> — Mermaid initialisait le SVG en mode clair même quand le thème du site était dark.</li>
</ol>
<p>La solution : générer les SVG <strong>au build</strong> avec <code>mmdc</code>, en dehors de tout contexte navigateur.</p>]]></description>
</item>
<item>
    <title>CSP A&#43; sur Hugo &#43; Cloudflare : de hash-based à origin allowlist, monitoring auto et durcissement</title>
    <link>https://www.arleo.eu/posts/csp-a-plus-hugo-cloudflare-origin-allowlist/</link>
    <pubDate>Thu, 28 May 2026 23:40:12 &#43;0200</pubDate>
    <author>Jmr</author>
    <guid>https://www.arleo.eu/posts/csp-a-plus-hugo-cloudflare-origin-allowlist/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/images/csp-a-plus-hugo-cloudflare-origin-allowlist-featured.jpg" referrerpolicy="no-referrer">
            </div><h2 id="contexte">Contexte</h2>
<p>arleo.eu tourne sur Hugo (VM KVM) → OpenResty (NUC) → Cloudflare (CDN/WAF). Objectif : score <strong>A+ sur Mozilla Observatory</strong> avec une CSP stricte qui résiste aux injections côté edge.</p>
<p>Le parcours a traversé trois stratégies en quelques semaines — nonces, hashes, puis origin allowlist — avant d&rsquo;aboutir à une solution stable et automatisée.</p>
<hr>
<h2 id="acte-1--pourquoi-hash-based-a-échoué">Acte 1 : pourquoi hash-based a échoué</h2>
<p>L&rsquo;idée de départ semblait solide : Hugo Pipes externalise tout le JS avec SRI, on liste les hashes dans la CSP, résultat propre. En pratique, deux problèmes ont rendu l&rsquo;approche impossible.</p>]]></description>
</item>
<item>
    <title>SRI sur Hugo : hashes automatiques, auto-update et alerting BetterStack</title>
    <link>https://www.arleo.eu/posts/sri-cdn-hugo-automate/</link>
    <pubDate>Sun, 17 May 2026 00:00:00 &#43;0000</pubDate>
    <author>Jmr</author>
    <guid>https://www.arleo.eu/posts/sri-cdn-hugo-automate/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/images/sri-cdn-hugo-automate-featured.jpg" referrerpolicy="no-referrer">
            </div><h2 id="pourquoi-le-sri-">Pourquoi le SRI ?</h2>
<p>Quand votre site charge des ressources depuis un CDN tiers — FontAwesome, Mermaid, Animate.css — vous faites confiance à un tiers sur lequel vous n&rsquo;avez aucun contrôle. Si jsdelivr.net est compromis ou si une version « immuable » est mutée silencieusement, votre site peut devenir vecteur d&rsquo;attaque.</p>
<p>Le <strong>Subresource Integrity</strong> (SRI) résout ça simplement : chaque balise <code>&lt;link&gt;</code> ou <code>&lt;script&gt;</code> porte un attribut <code>integrity=&quot;sha256-…&quot;</code> que le navigateur vérifie avant d&rsquo;exécuter la ressource. Si le hash ne correspond pas, le navigateur bloque le chargement.</p>]]></description>
</item>
<item>
    <title>CSP Hash sur Hugo : migrer du nonce vers le hash pour préserver le cache CDN</title>
    <link>https://www.arleo.eu/posts/csp-hash-hugo/</link>
    <pubDate>Sat, 16 May 2026 00:00:00 &#43;0000</pubDate>
    <author>Jmr</author>
    <guid>https://www.arleo.eu/posts/csp-hash-hugo/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/images/csp-hash-hugo-featured.png" referrerpolicy="no-referrer">
            </div>Le nonce CSP et le cache CDN sont incompatibles par design. Sur un site Hugo statique, le hash SHA-256 est l&rsquo;approche native : il est calculé au build, reste stable entre les requêtes, et laisse Cloudflare cacher le HTML.]]></description>
</item>
<item>
    <title>Postmortem : TypeIt cassé par Mermaid dans le thème LoveIt</title>
    <link>https://www.arleo.eu/posts/postmortem-typeit-mermaid/</link>
    <pubDate>Thu, 14 May 2026 09:44:43 &#43;0200</pubDate>
    <author>Jmr</author>
    <guid>https://www.arleo.eu/posts/postmortem-typeit-mermaid/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/images/postmortem-typeit-mermaid-featured.jpg" referrerpolicy="no-referrer">
            </div><h2 id="tldr">TL;DR</h2>
<p>L&rsquo;animation typewriter du thème LoveIt (TypeIt) ne fonctionnait plus sur la home après l&rsquo;ajout de diagrammes Mermaid dans les posts. Cause : un sélecteur DOM <code>#id-1</code> partagé entre les deux librairies. Quand Mermaid trouve un bloc orphelin dans un résumé de home, son initialisation crash, et la chaîne d&rsquo;init JS s&rsquo;arrête avant d&rsquo;atteindre TypeIt. Fix : ajouter `</p>]]></description>
</item>
<item>
    <title>Plugin Cloudflare hugo-mcp : purge ciblée plutôt que totale</title>
    <link>https://www.arleo.eu/posts/hugo-mcp-plugin-cloudflare/</link>
    <pubDate>Thu, 14 May 2026 09:42:22 &#43;0200</pubDate>
    <author>Jmr</author>
    <guid>https://www.arleo.eu/posts/hugo-mcp-plugin-cloudflare/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/images/hugo-mcp-plugin-cloudflare-featured.jpg" referrerpolicy="no-referrer">
            </div><h2 id="tldr">TL;DR</h2>
<p>Le plugin Cloudflare de <a href="https://github.com/jmrGrav/hugo-mcp/releases/tag/v2.0.0" target="_blank" rel="noopener noreffer ">hugo-mcp v2.0</a> implémente 3 modes de purge cache (<code>full</code>, <code>partial</code>, <code>smart</code>). Le mode <code>partial</code> calcule les URLs liées à invalider (canonique + sitemap + RSS + listing + home) pour préserver 95% du cache CDN à chaque modification. Concrètement : 6 URLs purgées au lieu de tout vider. Ce post détaille le calcul, les pièges, et pourquoi <code>smart</code> est devenu le défaut.</p>]]></description>
</item>
<item>
    <title>hugo-mcp v2.0 : un plugin-system Python en 200 lignes</title>
    <link>https://www.arleo.eu/posts/hugo-mcp-plugins-architecture/</link>
    <pubDate>Sat, 09 May 2026 23:23:49 &#43;0200</pubDate>
    <author>Jmr</author>
    <guid>https://www.arleo.eu/posts/hugo-mcp-plugins-architecture/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/images/hugo-mcp-plugins-architecture-featured.jpg" referrerpolicy="no-referrer">
            </div><h2 id="tldr">TL;DR</h2>
<p><a href="https://github.com/jmrGrav/hugo-mcp/releases/tag/v2.0.0" target="_blank" rel="noopener noreffer ">hugo-mcp v2.0.0</a> introduit un <strong>plugin-system Python</strong> qui permet à n&rsquo;importe qui d&rsquo;ajouter des hooks après chaque <code>create_page</code> / <code>update_page</code> / <code>delete_page</code>. 200 lignes de code pour le coeur, 3 plugins de production fournis (IndexNow, Google Indexing, Cloudflare). Ce post explique le design, les arbitrages, la sécurité, et montre comment écrire son propre plugin en 5 minutes.</p>]]></description>
</item>
<item>
    <title>Migration Grav → Hugo : 2 ans de blog basculés en une journée</title>
    <link>https://www.arleo.eu/posts/migration-grav-hugo/</link>
    <pubDate>Sat, 09 May 2026 22:29:45 &#43;0200</pubDate>
    <author>Jmr</author>
    <guid>https://www.arleo.eu/posts/migration-grav-hugo/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/images/migration-grav-hugo-featured.jpg" referrerpolicy="no-referrer">
            </div><h2 id="tldr">TL;DR</h2>
<p>Le 9 mai 2026, j&rsquo;ai basculé <code>arleo.eu</code> de <strong>Grav</strong> (CMS PHP) vers <strong>Hugo</strong> (générateur de site statique Go) en une session. Bascule <strong>atomique</strong> (≈ 0 seconde de downtime), 22 articles legacy migrés sous <code>/posts/</code> avec <strong>aliases SEO</strong> pour préserver les URLs Google indexées, monitoring BetterStack <code>/ping</code> intact pendant toute l&rsquo;opération.</p>
<p>Le code et le script de migration sont open source : <a href="https://github.com/jmrGrav/grav-to-hugo-migration" target="_blank" rel="noopener noreffer ">github.com/jmrGrav/grav-to-hugo-migration</a>.</p>]]></description>
</item>
</channel>
</rss>
