<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>Roadmap - Tag - arleo.eu</title><link>https://www.arleo.eu/en/tags/roadmap/</link><description>Roadmap - Tag - arleo.eu</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Sat, 09 May 2026 13:09:37 +0200</lastBuildDate><atom:link href="https://www.arleo.eu/en/tags/roadmap/" rel="self" type="application/rss+xml"/><item><title>Roadmap: should we migrate the 16 articles to content/posts/?</title><link>https://www.arleo.eu/en/posts/roadmap-migration-content-posts/</link><pubDate>Sat, 09 May 2026 13:09:37 +0200</pubDate><author>Jmr</author><guid>https://www.arleo.eu/en/posts/roadmap-migration-content-posts/</guid><description><![CDATA[<div class="featured-image">
                <img src="/images/roadmap-migration-content-posts-featured.jpg" referrerpolicy="no-referrer">
            </div><h2 id="status-thinking-decision-pending">Status: thinking, decision pending</h2>
<p>This page documents a Hugo content architecture question I have not yet decided.</p>
<h2 id="context">Context</h2>
<p>The LoveIt theme used by arleo.eu follows the recommended Hugo convention: blog articles go in content/posts/. The home filters where Site.RegularPages Type posts.</p>
<p>But due to Grav migration history, my 16 editorial articles are at the root of content/, not in content/posts/. Hugo by default treats all these folders as Type page, not Type posts. So the LoveIt home filter does not see them, and I have to either override layouts/index.html or filter manually.</p>
<h2 id="the-question">The question</h2>
<p>Should I migrate the 16 articles to content/posts/ to follow LoveIt convention, or leave them at the root?</p>
<h2 id="option-a-migrate-to-contentposts">Option A: Migrate to content/posts/</h2>
<p>Pros:</p>
<ul>
<li>Theme conformity, no layout override needed</li>
<li>Repo readability, instantly see which folders are articles vs reference pages</li>
<li>Future-proof, if LoveIt evolves with new features on Type posts they apply for free</li>
<li>Standard mental model for any Hugo dev discovering the repo</li>
</ul>
<p>Cons:</p>
<ul>
<li>URL change. /csp-nonce/ would become /posts/csp-nonce/ by default. Breaks all inbound links.</li>
<li>Possible mitigation via explicit url in front matter to preserve URLs</li>
<li>Migration friction, 16 folders to move, 16 files to edit</li>
<li>Internal links: many articles cite each other, must audit</li>
</ul>
<h2 id="option-b-keep-the-root">Option B: Keep the root</h2>
<p>Pros:</p>
<ul>
<li>Identical URLs without doing anything</li>
<li>No migration, 0 files touched</li>
<li>Internal links intact by definition</li>
<li>layouts/home.html override already in place, 1 line diff</li>
</ul>
<p>Cons:</p>
<ul>
<li>Custom override to maintain if LoveIt evolves</li>
<li>Repo readability: reference pages and articles mixed at root</li>
<li>Weird convention, a Hugo dev wonders why no posts folder</li>
</ul>
<h2 id="seo-considerations">SEO considerations</h2>
<p>SEO fears URL change. With url override on Option A, no URL change. But then what is the migration&rsquo;s purpose? Just internal repo readability. Cost vs benefit, probably not worth it.</p>
<h2 id="hugo-mcp-considerations">Hugo MCP considerations</h2>
<p>The MCP tools accept a route parameter. With url override, MCP workflow is unchanged for the user.</p>
<h2 id="the-provisional-decision">The provisional decision</h2>]]></description></item><item><title>Roadmap: MCP Security Sprint — 4 domains, 10 chantiers (DELIVERED ✅)</title><link>https://www.arleo.eu/en/posts/roadmap-sprint-securite-mcp/</link><pubDate>Sat, 09 May 2026 13:07:33 +0200</pubDate><author>Jmr</author><guid>https://www.arleo.eu/en/posts/roadmap-sprint-securite-mcp/</guid><description><![CDATA[<div class="featured-image">
                <img src="/images/roadmap-sprint-securite-mcp-featured.jpg" referrerpolicy="no-referrer">
            </div><h2 id="status--delivered--sprint-closed-on-may-9-2026">Status: ✅ DELIVERED — sprint closed on May 9, 2026</h2>
<p><strong>Update May 9, 2026 (end of session)</strong>: all 10 chantiers delivered in a single marathon session, <strong>and all 3 coordinated releases published the same day</strong> (<code>hugo-mcp</code> v1.9.0, <code>mcp-oauth-proxy</code> v2.1.0, <code>mcp-installer</code> v1.3.0). Every component of the MCP ecosystem hardened in one day. Full technical recap: <a href="/en/posts/sprint-securite-mcp-livre/" rel="">MCP security sprint delivered: v1.9.0, 10 chantiers, hardened ecosystem</a>.</p>
<p>This page stays published as an archive — to show the trajectory of an announced sprint, then kept. All original content below is preserved.</p>
<hr>
<h2 id="original-status-pre-delivery">Original status (pre-delivery)</h2>
<p>This page publicly documented an ongoing hardening sprint on arleo.eu&rsquo;s MCP infrastructure. For security reasons, specific details of each chantier were not exposed until fixes were delivered (&ldquo;sec-first&rdquo; philosophy: don&rsquo;t publish an attack roadmap).</p>
<h2 id="why-this-transparency">Why this transparency</h2>
<p>I debated whether to publish this page. Arguments for transparency:</p>
<ul>
<li><strong>Public commitment</strong> = healthy pressure on yourself to deliver</li>
<li><strong>Documentation</strong> of a homelab whose goal is to learn and share</li>
<li><strong>Honesty</strong> with readers consuming other technical articles</li>
</ul>
<p>Arguments against:</p>
<ul>
<li><strong>Attack roadmap</strong>: if I precisely list what&rsquo;s not yet protected, I give clues to a patient attacker</li>
<li><strong>Artificial pressure</strong>: announcing a sprint then not delivering = worse than announcing nothing</li>
</ul>
<p>Adopted compromise: publish the <strong>direction</strong> and <strong>hardening domains</strong> without specifying what&rsquo;s weak today. Specific technical detail published on delivery.</p>
<h2 id="sprint-scope">Sprint scope</h2>
<p>The sprint covered 10 chantiers grouped into 4 domains:</p>
<h3 id="1-application-hardening-fastapi--pydantic">1. Application hardening (FastAPI + Pydantic)</h3>
<p>Reinforcement of MCP entry layers: strict input validation, unified error handling, no information leak in responses (stack traces, internal paths, lib versions).</p>
<h3 id="2-authentication-and-tokens">2. Authentication and tokens</h3>
<p>Refactor of MCP access token management: lifetime, rotation, revocation, hashing in storage. Allow cutting off a compromised client&rsquo;s access without redeploying the service.</p>
<h3 id="3-observability-and-audit">3. Observability and audit</h3>
<p>Integration of JSON structured logs ingested in BetterStack via Vector. Each MCP call must produce a traceable event: who, what, when, duration, status. Enables anomaly detection in near real-time.</p>
<h3 id="4-infrastructure-and-resilience">4. Infrastructure and resilience</h3>
<p>TLS for internal traffic between NUC and VM, dedicated ModSec rules on the <code>/mcp</code> path, disaster recovery runbook (token theft, server compromise, data loss).</p>
<h2 id="what-was-already-in-place-before-the-sprint">What was already in place before the sprint</h2>
<p>To not create false impressions, here are the layers <strong>already in place</strong> on infrastructure before the sprint (so out of scope):</p>
<ul>
<li>nginx + mandatory TLS 1.3 (Mozilla Modern config)</li>
<li>Cloudflare WAF + Bot Management + IP whitelist</li>
<li>ModSecurity + OWASP CRS 4.x on all vhosts</li>
<li>CrowdSec in WAF mode + Cloudflare bouncer</li>
<li>systemd hardening at level 1.7 (cf. <a href="/en/posts/hardening-systemd-mcp/" rel="">systemd hardening</a>)</li>
<li>HMAC validation on webhooks</li>
<li>Frontmatter Pydantic validation (1 chantier of 4 in the validation category)</li>
</ul>
<p>The sprint aimed to <strong>complete</strong> this base, not replace it.</p>
<h2 id="method">Method</h2>
<p>For each chantier:</p>
<ol>
<li>Implemented locally + unit tests</li>
<li>Validated on <code>mcp-test-vm</code> (pre-prod VM)</li>
<li>Deployed to prod only after passing tests</li>
<li>Structured JSON audit log for deployment traceability</li>
<li>Post-mortem or technical write-up published <strong>after</strong> delivery</li>
</ol>
<p>No direct prod deployment without pre-prod step.</p>
<h2 id="published-releases">Published releases</h2>]]></description></item><item><title>Roadmap: Git webhook → automatic Hugo rebuild</title><link>https://www.arleo.eu/en/posts/roadmap-webhook-git-rebuild/</link><pubDate>Sat, 09 May 2026 13:06:50 +0200</pubDate><author>Jmr</author><guid>https://www.arleo.eu/en/posts/roadmap-webhook-git-rebuild/</guid><description><![CDATA[<div class="featured-image">
                <img src="/images/roadmap-webhook-git-rebuild-featured.jpg" referrerpolicy="no-referrer">
            </div><h2 id="status--backlog--not-yet-implemented">Status: 🗂️ BACKLOG — not yet implemented</h2>
<p>This page documents an architectural intent to be implemented in a future iteration. The code is not yet in production.</p>
<h2 id="context">Context</h2>
<p>In <a href="/en/posts/strategie-4-mcp-vs-git/" rel="">Strategy 4 (separating MCP / Git)</a>, I explained why <code>content/</code> is in <code>.gitignore</code> on the arleo.eu repo: so that no conflict is possible between MCP writes and Git writes.</p>
<p>Concretely, this means that when I push a new version of <code>layouts/</code>, <code>themes/</code>, <code>static/</code>, <code>hugo.toml</code>, or <code>deploy.sh</code> from VS Code, <strong>nothing happens automatically</strong> server-side. I have to SSH into the Hugo VM and manually run <code>git pull &amp;&amp; hugo --minify &amp;&amp; rsync</code>.</p>
<p>Not critical (structure pushes happen ~1× per week), but it&rsquo;s unnecessary friction. So: GitHub webhook → auto-rebuild.</p>
<h2 id="target-architecture">Target architecture</h2>]]></description></item></channel></rss>