<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/css" href="/blog/styles/rss.css"?>
  <rss version="2.0"
    xmlns:atom="http://www.w3.org/2005/Atom"
    xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:media="http://search.yahoo.com/mrss/"
    xmlns:webfeeds="http://webfeeds.org/rss/1.0">
    <channel>
      <title>Carnet de dev</title>
      <link>https://gildaslechevalier.fr/blog/</link>
      <description>Blog personnel de Gildas Lechevalier : developpement web, portages de jeux retro, experimentations techniques et projets personnels.</description>
      <image>
        <url>https://gildaslechevalier.fr/blog/images/feed-icon.png</url>
        <title>Carnet de dev</title>
        <link>https://gildaslechevalier.fr/blog/</link>
      </image>
      <webfeeds:icon>https://gildaslechevalier.fr/blog/images/feed-icon.png</webfeeds:icon>
      <webfeeds:logo>https://gildaslechevalier.fr/blog/images/feed-icon.png</webfeeds:logo>
      <webfeeds:accentColor>9be564</webfeeds:accentColor>
      <language>fr</language>
      <lastBuildDate>Wed, 02 Sep 2026 00:00:00 GMT</lastBuildDate>
      <ttl>60</ttl>
      <atom:link href="https://gildaslechevalier.fr/blog/rss.xml" rel="self" type="application/rss+xml" />
      
    <item>
      <title>SingleFile CLI : sauvegarder une page web dans un seul fichier HTML</title>
      <link>https://gildaslechevalier.fr/blog/singlefile-cli-sauvegarder-page-web-offline/</link>
      <guid isPermaLink="true">https://gildaslechevalier.fr/blog/singlefile-cli-sauvegarder-page-web-offline/</guid>
      <pubDate>Wed, 02 Sep 2026 00:00:00 GMT</pubDate>
      <dc:creator>Gildas Lechevalier</dc:creator>
      <description><![CDATA[Comment j'ai utilisé SingleFile CLI sous Windows pour conserver hors ligne la fiche du véhicule que nous venions d'acheter.]]></description>
      <content:encoded><![CDATA[<p><img src="https://gildaslechevalier.fr/blog/images/singlefile-cli-sauvegarder-page-web-offline.png" alt="Illustration de SingleFile CLI : sauvegarder une page web dans un seul fichier HTML" /></p><hr>
<p>Nous venions d’acheter notre Nissan Qashqai et je voulais conserver une copie de sa fiche de vente.</p>
<p>Pas seulement quelques captures d’écran ou les photos du véhicule : je voulais garder <strong>la page complète</strong>, son apparence et, autant que possible, ses interactions, même une fois l’annonce retirée du site.</p>
<p>L’objectif était donc assez simple :</p>
<ul>
<li>sauvegarder la page complète ;</li>
<li>conserver les CSS et les images ;</li>
<li>conserver le JavaScript utile ;</li>
<li>pouvoir ouvrir la copie sans connexion Internet ;</li>
<li>idéalement obtenir <strong>un seul fichier HTML</strong> facile à archiver.</li>
</ul>
<p>C’est exactement le genre de problème que cherche à résoudre <strong>SingleFile</strong>.</p>
<h2 id="singlefile-cli">SingleFile CLI</h2>
<p>SingleFile est surtout connu comme extension de navigateur, mais il existe également en version ligne de commande :</p>
<p><a href="https://github.com/gildas-lormeau/single-file-cli" target="_blank" rel="noopener noreferrer" class="external-link github-link">github.com/gildas-lormeau/single-file-cli</a></p>
<p>Les exécutables précompilés sont disponibles directement dans les releases :</p>
<p><a href="https://github.com/gildas-lormeau/single-file-cli/releases" target="_blank" rel="noopener noreferrer" class="external-link github-link">github.com/gildas-lormeau/single-file-cli/releases</a></p>
<p>Sous Windows, il suffit notamment de récupérer :</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="text"><code><span class="line"><span>single-file.exe</span></span></code></pre>
<p>L’exécutable peut être utilisé directement, sans installation particulière. Il pilote Chrome ou un autre navigateur basé sur Chromium, charge réellement la page, puis rassemble son contenu et ses différentes ressources dans un fichier HTML autonome.</p>
<h2 id="la-commande-utilisée">La commande utilisée</h2>
<p>Dans mon cas, j’ai utilisé PowerShell avec la commande suivante.</p>
<p>L’adresse du site d’origine est volontairement anonymisée ici :</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="powershell"><code><span class="line"><span style="color:#E1E4E8">.\</span><span style="color:#79B8FF">single-file.exe</span><span style="color:#9ECBFF"> "&#x3C;URL_DE_L_ANNONCE>"</span><span style="color:#9ECBFF"> "HOPAUTO_QASHQAI_82005_ISO_OFFLINE.html"</span><span style="color:#F97583"> --</span><span style="color:#E1E4E8">browser</span><span style="color:#F97583">-</span><span style="color:#E1E4E8">headless</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">false </span><span style="color:#F97583">--</span><span style="color:#79B8FF">block-scripts</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">false </span><span style="color:#F97583">--</span><span style="color:#E1E4E8">load</span><span style="color:#F97583">-</span><span style="color:#E1E4E8">deferred</span><span style="color:#F97583">-</span><span style="color:#E1E4E8">images</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">true </span><span style="color:#F97583">--</span><span style="color:#E1E4E8">browser</span><span style="color:#F97583">-</span><span style="color:#79B8FF">wait-until</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">networkIdle </span><span style="color:#F97583">--</span><span style="color:#E1E4E8">browser</span><span style="color:#F97583">-</span><span style="color:#79B8FF">wait-delay</span><span style="color:#F97583">=</span><span style="color:#79B8FF">8000</span><span style="color:#F97583"> --</span><span style="color:#79B8FF">remove-hidden</span><span style="color:#F97583">-</span><span style="color:#E1E4E8">elements</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">false </span><span style="color:#F97583">--</span><span style="color:#79B8FF">remove-unused</span><span style="color:#F97583">-</span><span style="color:#E1E4E8">styles</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">false </span><span style="color:#F97583">--</span><span style="color:#79B8FF">remove-unused</span><span style="color:#F97583">-</span><span style="color:#E1E4E8">fonts</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">false </span><span style="color:#F97583">--</span><span style="color:#79B8FF">remove-alternative</span><span style="color:#F97583">-</span><span style="color:#E1E4E8">images</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">false </span><span style="color:#F97583">--</span><span style="color:#E1E4E8">browser</span><span style="color:#F97583">-</span><span style="color:#E1E4E8">executable</span><span style="color:#F97583">-</span><span style="color:#E1E4E8">path</span><span style="color:#F97583">=</span><span style="color:#9ECBFF">"C:\Program Files\Google\Chrome\Application\chrome.exe"</span></span></code></pre>
<p>Le résultat est un gros fichier :</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="text"><code><span class="line"><span>HOPAUTO_QASHQAI_82005_ISO_OFFLINE.html</span></span></code></pre>
<p>Les images, feuilles de style et autres ressources peuvent notamment être intégrées directement dans ce HTML.</p>
<h2 id="à-quoi-servent-les-paramètres-">À quoi servent les paramètres ?</h2>

















































<table><thead><tr><th>Paramètre</th><th>Rôle</th></tr></thead><tbody><tr><td><code>--browser-headless=false</code></td><td>Lance Chrome visiblement au lieu de travailler en arrière-plan. Pratique pour voir ce que la page charge réellement.</td></tr><tr><td><code>--block-scripts=false</code></td><td>Autorise l’exécution des scripts JavaScript de la page. Indispensable ici pour conserver les parties dynamiques.</td></tr><tr><td><code>--load-deferred-images=true</code></td><td>Force le chargement des images différées ou <em>lazy-loaded</em>.</td></tr><tr><td><code>--browser-wait-until=networkIdle</code></td><td>Attend que l’activité réseau se calme avant de considérer la page comme chargée.</td></tr><tr><td><code>--browser-wait-delay=8000</code></td><td>Attend encore 8 secondes avant la capture. Utile pour les composants qui apparaissent tardivement.</td></tr><tr><td><code>--remove-hidden-elements=false</code></td><td>Conserve les éléments HTML actuellement masqués. Certains peuvent devenir visibles après une interaction.</td></tr><tr><td><code>--remove-unused-styles=false</code></td><td>Conserve les règles CSS qui semblent inutilisées au moment de la capture.</td></tr><tr><td><code>--remove-unused-fonts=false</code></td><td>Évite de supprimer certaines déclarations de polices.</td></tr><tr><td><code>--remove-alternative-images=false</code></td><td>Conserve les variantes d’images plutôt que d’optimiser agressivement la page.</td></tr><tr><td><code>--browser-executable-path=...</code></td><td>Indique explicitement l’emplacement de Chrome à SingleFile.</td></tr></tbody></table>
<p>Ces options privilégient clairement <strong>la fidélité de la copie</strong> plutôt que la taille du fichier final.</p>
<h2 id="un-piège-avec-les-sites-react">Un piège avec les sites React</h2>
<p>La première sauvegarde semblait parfaite.</p>
<p>J’ouvrais le HTML localement, la page apparaissait avec les bonnes photos puis, une fois son chargement terminé… les photos disparaissaient.</p>
<p>Le problème ne venait pas de SingleFile lui-même mais du fonctionnement du site.</p>
<p>La page utilisait React/Next.js. SingleFile avait correctement intégré les JPEG dans le HTML, mais les données utilisées ensuite par React contenaient toujours les URL originales des images.</p>
<p>Le scénario devenait donc :</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="text"><code><span class="line"><span>Ouverture du HTML</span></span>
<span class="line"><span>        ↓</span></span>
<span class="line"><span>Affichage des images intégrées par SingleFile</span></span>
<span class="line"><span>        ↓</span></span>
<span class="line"><span>Hydratation de l'application React</span></span>
<span class="line"><span>        ↓</span></span>
<span class="line"><span>Réapplication des URL originales</span></span>
<span class="line"><span>        ↓</span></span>
<span class="line"><span>Tentative de chargement depuis Internet</span></span>
<span class="line"><span>        ↓</span></span>
<span class="line"><span>Images perdues hors ligne</span></span></code></pre>
<p>La solution évidente aurait été de désactiver complètement JavaScript.</p>
<p>Elle aurait aussi supprimé une bonne partie de l’intérêt de la sauvegarde : galerie, boutons et autres interactions n’auraient plus fonctionné.</p>
<p>Dans mon cas, la meilleure solution a donc été plus ciblée : <strong>conserver React et le JavaScript de la page, mais empêcher uniquement la réhydratation de remplacer les images intégrées par leurs anciennes URL distantes</strong>.</p>
<p>C’est une limite importante à connaître : SingleFile peut parfaitement capturer les ressources d’une page, mais un site web moderne reste parfois une véritable application dont le JavaScript continue à vouloir communiquer avec son serveur d’origine.</p>
<h2 id="un-outil-à-garder-sous-la-main">Un outil à garder sous la main</h2>
<p>Malgré cette petite difficulté, <code>single-file.exe</code> est exactement le genre d’utilitaire que j’aime garder dans un dossier d’outils.</p>
<p>Pas d’interface compliquée, pas besoin de créer un projet : une URL, un fichier de sortie et une commande.</p>
<p>Pour archiver une documentation, une fiche produit, une ancienne page personnelle ou, comme ici, <strong>la fiche du véhicule que l’on vient d’acheter</strong>, c’est particulièrement pratique.</p>
<p>Et surtout, quelques années plus tard, un gros fichier HTML autonome sera probablement beaucoup plus utile qu’un lien terminé depuis longtemps en erreur 404.</p>]]></content:encoded>
      <category>outils</category>
      <media:content url="https://gildaslechevalier.fr/blog/images/singlefile-cli-sauvegarder-page-web-offline.png" type="image/png" medium="image" />
      <media:thumbnail url="https://gildaslechevalier.fr/blog/images/singlefile-cli-sauvegarder-page-web-offline.png" />
    </item>

    <item>
      <title>Coder depuis la plage : de GitHub Codespaces à Codex CLI sur ma seedbox</title>
      <link>https://gildaslechevalier.fr/blog/coder-depuis-la-plage--de-github-codespaces-a-codex-cli-sur-ma-seedbox/</link>
      <guid isPermaLink="true">https://gildaslechevalier.fr/blog/coder-depuis-la-plage--de-github-codespaces-a-codex-cli-sur-ma-seedbox/</guid>
      <pubDate>Fri, 14 Aug 2026 00:00:00 GMT</pubDate>
      <dc:creator>Gildas Lechevalier</dc:creator>
      <description><![CDATA[Retour d'expérience sur l'utilisation de GitHub Codespaces puis de Codex CLI sur une seedbox pour continuer mes projets et lancer des tâches longues à distance, même depuis la plage.]]></description>
      <content:encoded><![CDATA[<p>Cet été, je voulais continuer à faire avancer quelques-uns de mes projets sans pour autant partir en vacances avec mon PC portable sous le bras.</p>
<p>L’idée n’était surtout pas de <em>coder sur un iPhone</em>. Rien que d’y penser, ça ne donne pas particulièrement envie.</p>
<p>Mon objectif était différent : <strong>utiliser l’iPhone comme une télécommande pour Codex</strong>.</p>
<p>Ouvrir un terminal, donner un objectif à Codex, fermer le téléphone et le laisser travailler tranquillement pendant quelques heures. Puis revenir plus tard voir le résultat, apporter quelques précisions et éventuellement lui donner une nouvelle tâche.</p>
<p>C’est comme ça que je me suis retrouvé à lancer des <code>/goal</code> depuis la plage de Palma avant de remettre tranquillement mon téléphone dans le sac.</p>
<p>Pour arriver à ce résultat, je suis d’abord passé par <strong>GitHub Codespaces</strong>, puis <strong>ShellFish</strong> sur iOS, avant de finalement réaliser que j’avais déjà une solution encore mieux adaptée : <strong>ma seedbox, SSH et tmux</strong>.</p>
<h2 id="première-expérimentation--github-codespaces">Première expérimentation : GitHub Codespaces</h2>
<p>Sur le papier, GitHub Codespaces répond parfaitement au besoin.</p>
<p>À partir d’un dépôt GitHub, on obtient en quelques instants une véritable machine de développement dans le cloud :</p>
<ul>
<li>le dépôt Git est disponible ;</li>
<li>on dispose d’un terminal Linux ;</li>
<li>Node.js et les différents outils du projet peuvent être installés ;</li>
<li>Codex CLI peut fonctionner comme sur une machine classique ;</li>
<li>l’environnement est accessible depuis Internet.</li>
</ul>
<p>Pour travailler ponctuellement sans avoir son ordinateur avec soi, c’est assez bluffant.</p>
<p>Une fois connecté au Codespace, je pouvais simplement lancer :</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="bash"><code><span class="line"><span style="color:#B392F0">codex</span></span></code></pre>
<p>Puis confier une tâche relativement autonome à Codex avec un <code>/goal</code>.</p>
<p>Et c’est précisément là que le fonctionnement devient intéressant.</p>
<p>Codex n’a pas besoin que je reste devant le terminal pendant qu’il travaille. Il peut analyser le projet, parcourir les fichiers, écrire du code, lancer des commandes, exécuter des tests et corriger ses erreurs.</p>
<p>L’iPhone ne sert donc pas réellement à développer.</p>
<p>Il sert à <strong>dire à Codex quoi développer</strong>.</p>
<h2 id="shellfish--le-terminal-quil-me-fallait-sur-iphone">ShellFish : le terminal qu’il me fallait sur iPhone</h2>
<p>Restait néanmoins un problème : comment accéder confortablement à cet environnement depuis un iPhone ?</p>
<p>Passer systématiquement par une interface web n’était pas particulièrement agréable. Je voulais quelque chose de beaucoup plus direct : ouvrir une application et me retrouver immédiatement dans mon terminal.</p>
<p>J’ai finalement retenu <strong>ShellFish</strong>, une application iOS permettant notamment d’utiliser SSH et SFTP.</p>
<p>Et pour mon besoin, c’était exactement ce qu’il fallait.</p>
<p>Le fonctionnement était alors très simple :</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="text"><code><span class="line"><span>iPhone</span></span>
<span class="line"><span>   │</span></span>
<span class="line"><span>ShellFish</span></span>
<span class="line"><span>   │</span></span>
<span class="line"><span>   │ SSH</span></span>
<span class="line"><span>   ▼</span></span>
<span class="line"><span>GitHub Codespace</span></span>
<span class="line"><span>   │</span></span>
<span class="line"><span>   ├── Git</span></span>
<span class="line"><span>   ├── projet</span></span>
<span class="line"><span>   └── Codex CLI</span></span></code></pre>
<p>J’ouvrais ShellFish, je me connectais à mon environnement distant et je retrouvais un véritable terminal.</p>
<p>Quelques commandes suffisaient alors pour me placer dans le projet et lancer Codex :</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="bash"><code><span class="line"><span style="color:#79B8FF">cd</span><span style="color:#9ECBFF"> mon-projet</span></span>
<span class="line"><span style="color:#B392F0">codex</span></span></code></pre>
<p>Je pouvais ensuite écrire mon <code>/goal</code>, vérifier que Codex était correctement parti sur sa tâche et ranger le téléphone.</p>
<p>C’était beaucoup plus proche de l’expérience que je recherchais.</p>
<h2 id="le-téléphone-devient-une-télécommande">Le téléphone devient une télécommande</h2>
<p>Ce changement de perspective est finalement assez important.</p>
<p>Essayer de reproduire un environnement VS Code complet sur un écran de téléphone n’a que peu d’intérêt pour moi. L’écran est trop petit, le clavier virtuel devient rapidement pénible et naviguer entre plusieurs fichiers n’est pas agréable.</p>
<p>Avec un agent comme Codex, ce n’est plus réellement nécessaire.</p>
<p>Mon workflow ressemblait plutôt à ça :</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="text"><code><span class="line"><span>Ouvrir ShellFish</span></span>
<span class="line"><span>       ↓</span></span>
<span class="line"><span>Connexion SSH</span></span>
<span class="line"><span>       ↓</span></span>
<span class="line"><span>Reprendre Codex</span></span>
<span class="line"><span>       ↓</span></span>
<span class="line"><span>Donner un /goal</span></span>
<span class="line"><span>       ↓</span></span>
<span class="line"><span>Vérifier le démarrage</span></span>
<span class="line"><span>       ↓</span></span>
<span class="line"><span>Fermer ShellFish</span></span>
<span class="line"><span>       ↓</span></span>
<span class="line"><span>Profiter des vacances</span></span></code></pre>
<p>Quelques heures plus tard, je pouvais revenir voir le résultat.</p>
<p>C’est une manière assez différente d’envisager le développement à distance.</p>
<h2 id="depuis-la-plage-de-palma">Depuis la plage de Palma</h2>
<p>Et c’est pendant nos vacances à Majorque que cette expérimentation a réellement pris son sens.</p>
<p>Pas besoin de sortir un ordinateur portable ni de chercher une table et une prise électrique.</p>
<p>Depuis la plage de Palma, je pouvais sortir l’iPhone, ouvrir ShellFish, me connecter à mon environnement et donner une nouvelle tâche à Codex.</p>
<p>Quelques minutes plus tard, le téléphone retournait dans le sac.</p>
<p>Codex, lui, pouvait continuer son travail.</p>
<p>C’est assez amusant la première fois que l’on réalise qu’une tâche de développement relativement conséquente est en train de s’exécuter quelque part pendant que l’on est tranquillement sur une plage à plusieurs milliers de kilomètres.</p>
<p>Mais cette utilisation m’a aussi permis de mettre en évidence les limites de mon architecture.</p>
<h2 id="la-limite-de-codespaces">La limite de Codespaces</h2>
<p>GitHub Codespaces est excellent pour créer rapidement un environnement de développement.</p>
<p>Mais un Codespace reste, par conception, une ressource temporaire.</p>
<p>Il peut notamment être arrêté après une période d’inactivité. Ce comportement est parfaitement logique pour éviter de laisser tourner inutilement des machines dans le cloud.</p>
<p>Pour mon utilisation de Codex, en revanche, je recherchais presque exactement l’inverse.</p>
<p>Je voulais quelque chose comme :</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="text"><code><span class="line"><span>10h00  → lancement d'un /goal</span></span>
<span class="line"><span></span></span>
<span class="line"><span>10h05  → téléphone dans le sac</span></span>
<span class="line"><span>         Codex continue à travailler</span></span>
<span class="line"><span></span></span>
<span class="line"><span>12h00  → reconnexion</span></span>
<span class="line"><span>         vérification du résultat</span></span>
<span class="line"><span></span></span>
<span class="line"><span>12h10  → nouveau /goal</span></span>
<span class="line"><span></span></span>
<span class="line"><span>17h00  → reprise de la session</span></span></code></pre>
<p>Je voulais donc un environnement <strong>permanent</strong>, mais également une <strong>session de terminal persistante</strong>.</p>
<p>Et c’est là que <code>tmux</code> devient particulièrement intéressant.</p>
<h2 id="tmux--la-pièce-manquante">tmux : la pièce manquante</h2>
<p><code>tmux</code> est ce que l’on appelle un multiplexeur de terminal.</p>
<p>Son fonctionnement peut paraître un peu obscur au premier abord, mais pour mon utilisation une seule de ses fonctions est réellement importante :</p>
<blockquote>
<p>une session tmux continue d’exister même lorsque je ferme ma connexion SSH.</p>
</blockquote>
<p>Je peux créer une session :</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="bash"><code><span class="line"><span style="color:#B392F0">tmux</span><span style="color:#9ECBFF"> new</span><span style="color:#79B8FF"> -s</span><span style="color:#9ECBFF"> codex</span></span></code></pre>
<p>Puis lancer Codex à l’intérieur :</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="bash"><code><span class="line"><span style="color:#B392F0">codex</span></span></code></pre>
<p>Je donne ensuite un <code>/goal</code> à Codex.</p>
<p>Une fois la tâche lancée, je détache la session avec :</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="text"><code><span class="line"><span>Ctrl+B puis D</span></span></code></pre>
<p>Je peux maintenant fermer complètement ShellFish.</p>
<p>La connexion SSH est coupée.</p>
<p>Mais sur la machine distante :</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="text"><code><span class="line"><span>tmux</span></span>
<span class="line"><span>  │</span></span>
<span class="line"><span>  └── Codex</span></span>
<span class="line"><span>        │</span></span>
<span class="line"><span>        └── /goal en cours</span></span></code></pre>
<p>continue tranquillement à fonctionner.</p>
<p>Quelques heures plus tard, je me reconnecte en SSH et je tape :</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="bash"><code><span class="line"><span style="color:#B392F0">tmux</span><span style="color:#9ECBFF"> attach</span><span style="color:#79B8FF"> -t</span><span style="color:#9ECBFF"> codex</span></span></code></pre>
<p>Et je retrouve <strong>exactement le même terminal</strong>, avec la même session Codex.</p>
<p>C’est précisément ce qu’il me fallait.</p>
<h2 id="et-si-je-remplaçais-codespaces-">Et si je remplaçais Codespaces ?</h2>
<p>À ce stade, une question assez évidente s’est posée.</p>
<p>Pourquoi utiliser une machine Codespaces alors que je disposais déjà d’une machine Linux accessible en permanence ?</p>
<p>J’utilise une <strong>seedbox</strong>, allumée 24 heures sur 24 et accessible à distance en SSH.</p>
<p>Elle disposait déjà d’une bonne partie de ce dont j’avais besoin et pouvait devenir mon environnement Codex permanent.</p>
<p>Il suffisait finalement d’y disposer de :</p>
<ul>
<li>Git ;</li>
<li>mes dépôts ;</li>
<li>Codex CLI ;</li>
<li>tmux ;</li>
<li>SSH.</li>
</ul>
<p>L’architecture devenait alors :</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="text"><code><span class="line"><span>                    GitHub</span></span>
<span class="line"><span>                      ▲</span></span>
<span class="line"><span>                      │</span></span>
<span class="line"><span>                   git push</span></span>
<span class="line"><span>                      │</span></span>
<span class="line"><span>                      │</span></span>
<span class="line"><span>iPhone ── ShellFish ──SSH──► Seedbox</span></span>
<span class="line"><span>                              │</span></span>
<span class="line"><span>                              ├── projets Git</span></span>
<span class="line"><span>                              │</span></span>
<span class="line"><span>                              └── tmux</span></span>
<span class="line"><span>                                   │</span></span>
<span class="line"><span>                                   └── Codex CLI</span></span>
<span class="line"><span>                                         │</span></span>
<span class="line"><span>                                         └── /goal</span></span></code></pre>
<p>Plus besoin de créer ou démarrer un Codespace.</p>
<p>Ma machine de développement distante était <strong>déjà allumée en permanence</strong>.</p>
<h2 id="une-session-par-projet">Une session par projet</h2>
<p>Avec <code>tmux</code>, je peux également organiser les sessions en fonction des projets.</p>
<p>Par exemple :</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="bash"><code><span class="line"><span style="color:#B392F0">tmux</span><span style="color:#9ECBFF"> new</span><span style="color:#79B8FF"> -s</span><span style="color:#9ECBFF"> zod</span></span></code></pre>
<p>pour un projet, puis :</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="bash"><code><span class="line"><span style="color:#B392F0">tmux</span><span style="color:#9ECBFF"> new</span><span style="color:#79B8FF"> -s</span><span style="color:#9ECBFF"> smb</span></span></code></pre>
<p>pour un autre.</p>
<p>La commande suivante permet de voir les sessions disponibles :</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="bash"><code><span class="line"><span style="color:#B392F0">tmux</span><span style="color:#9ECBFF"> ls</span></span></code></pre>
<p>Ce qui peut donner quelque chose comme :</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="text"><code><span class="line"><span>zod: 1 windows</span></span>
<span class="line"><span>smb: 1 windows</span></span>
<span class="line"><span>blog: 1 windows</span></span></code></pre>
<p>Depuis ShellFish, je peux alors choisir celle que je veux reprendre :</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="bash"><code><span class="line"><span style="color:#B392F0">tmux</span><span style="color:#9ECBFF"> attach</span><span style="color:#79B8FF"> -t</span><span style="color:#9ECBFF"> zod</span></span></code></pre>
<p>Je retrouve immédiatement Codex et son contexte de travail.</p>
<p>Puis je détache à nouveau :</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="text"><code><span class="line"><span>Ctrl+B puis D</span></span></code></pre>
<p>Et la session continue à vivre sans mon téléphone.</p>
<h2 id="shellfish--ssh--tmux--codex">ShellFish + SSH + tmux + Codex</h2>
<p>C’est finalement cette combinaison qui répond réellement à mon besoin :</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="text"><code><span class="line"><span>        iPhone</span></span>
<span class="line"><span>           │</span></span>
<span class="line"><span>       ShellFish</span></span>
<span class="line"><span>           │</span></span>
<span class="line"><span>          SSH</span></span>
<span class="line"><span>           │</span></span>
<span class="line"><span>        Seedbox</span></span>
<span class="line"><span>           │</span></span>
<span class="line"><span>         tmux</span></span>
<span class="line"><span>           │</span></span>
<span class="line"><span>      Codex CLI</span></span>
<span class="line"><span>           │</span></span>
<span class="line"><span>         /goal</span></span></code></pre>
<p>Chaque élément a un rôle très simple.</p>
<p><strong>ShellFish</strong> me donne un terminal confortable sur l’iPhone.</p>
<p><strong>SSH</strong> me permet d’accéder à la machine distante.</p>
<p><strong>tmux</strong> rend mes sessions indépendantes de la connexion SSH.</p>
<p><strong>Codex CLI</strong> effectue le travail.</p>
<p><strong>GitHub</strong> reste le point central où je pousse ensuite les modifications.</p>
<p>L’ensemble est finalement beaucoup plus simple qu’un environnement de développement distant traditionnel.</p>
<h2 id="codespaces-nétait-pas-une-mauvaise-piste">Codespaces n’était pas une mauvaise piste</h2>
<p>Pour autant, je ne considère pas mon expérimentation avec GitHub Codespaces comme inutile.</p>
<p>Au contraire.</p>
<p>Codespaces m’a permis de valider le concept sans avoir à préparer une infrastructure particulière.</p>
<p>J’ai pu vérifier qu’il était réellement possible de :</p>
<ul>
<li>piloter Codex depuis un téléphone ;</li>
<li>travailler correctement avec un simple terminal SSH ;</li>
<li>lancer des tâches relativement longues ;</li>
<li>quitter son téléphone pendant leur exécution ;</li>
<li>revenir plus tard contrôler le résultat.</li>
</ul>
<p>C’était finalement une <strong>preuve de concept</strong>.</p>
<p>Une fois celle-ci validée, la seedbox s’est simplement révélée plus adaptée à mon usage permanent.</p>
<h2 id="les-commandes-à-retenir">Les commandes à retenir</h2>
<p>Au final, le nombre de commandes nécessaires est assez réduit.</p>
<h3 id="lancer-codex">Lancer Codex</h3>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="bash"><code><span class="line"><span style="color:#B392F0">codex</span></span></code></pre>
<h3 id="créer-une-session-tmux">Créer une session tmux</h3>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="bash"><code><span class="line"><span style="color:#B392F0">tmux</span><span style="color:#9ECBFF"> new</span><span style="color:#79B8FF"> -s</span><span style="color:#9ECBFF"> codex</span></span></code></pre>
<p>Ou en utilisant le nom du projet :</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="bash"><code><span class="line"><span style="color:#B392F0">tmux</span><span style="color:#9ECBFF"> new</span><span style="color:#79B8FF"> -s</span><span style="color:#9ECBFF"> zod</span></span></code></pre>
<h3 id="détacher-une-session">Détacher une session</h3>
<p>Depuis une session tmux :</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="text"><code><span class="line"><span>Ctrl+B puis D</span></span></code></pre>
<p>Codex continue alors à fonctionner.</p>
<h3 id="afficher-les-sessions-existantes">Afficher les sessions existantes</h3>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="bash"><code><span class="line"><span style="color:#B392F0">tmux</span><span style="color:#9ECBFF"> ls</span></span></code></pre>
<h3 id="reprendre-une-session">Reprendre une session</h3>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="bash"><code><span class="line"><span style="color:#B392F0">tmux</span><span style="color:#9ECBFF"> attach</span><span style="color:#79B8FF"> -t</span><span style="color:#9ECBFF"> codex</span></span></code></pre>
<p>Ou :</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="bash"><code><span class="line"><span style="color:#B392F0">tmux</span><span style="color:#9ECBFF"> attach</span><span style="color:#79B8FF"> -t</span><span style="color:#9ECBFF"> zod</span></span></code></pre>
<h3 id="vérifier-les-modifications-effectuées-par-codex">Vérifier les modifications effectuées par Codex</h3>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="bash"><code><span class="line"><span style="color:#B392F0">git</span><span style="color:#9ECBFF"> status</span></span></code></pre>
<h3 id="ajouter-toutes-les-modifications">Ajouter toutes les modifications</h3>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="bash"><code><span class="line"><span style="color:#B392F0">git</span><span style="color:#9ECBFF"> add</span><span style="color:#9ECBFF"> .</span></span></code></pre>
<h3 id="créer-le-commit">Créer le commit</h3>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="bash"><code><span class="line"><span style="color:#B392F0">git</span><span style="color:#9ECBFF"> commit</span><span style="color:#79B8FF"> -m</span><span style="color:#9ECBFF"> "Description des modifications"</span></span></code></pre>
<h3 id="envoyer-les-modifications-sur-github">Envoyer les modifications sur GitHub</h3>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="bash"><code><span class="line"><span style="color:#B392F0">git</span><span style="color:#9ECBFF"> push</span></span></code></pre>
<p>Si la branche distante n’existe pas encore :</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="bash"><code><span class="line"><span style="color:#B392F0">git</span><span style="color:#9ECBFF"> push</span><span style="color:#79B8FF"> -u</span><span style="color:#9ECBFF"> origin</span><span style="color:#9ECBFF"> nom-de-la-branche</span></span></code></pre>
<p>Le workflow Git complet après le travail de Codex tient donc finalement en quatre commandes :</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="bash"><code><span class="line"><span style="color:#B392F0">git</span><span style="color:#9ECBFF"> status</span></span>
<span class="line"><span style="color:#B392F0">git</span><span style="color:#9ECBFF"> add</span><span style="color:#9ECBFF"> .</span></span>
<span class="line"><span style="color:#B392F0">git</span><span style="color:#9ECBFF"> commit</span><span style="color:#79B8FF"> -m</span><span style="color:#9ECBFF"> "Description des modifications"</span></span>
<span class="line"><span style="color:#B392F0">git</span><span style="color:#9ECBFF"> push</span></span></code></pre>
<h2 id="conclusion">Conclusion</h2>
<p>Cette expérimentation est partie d’une contrainte toute simple : <strong>je ne voulais pas emmener mon PC portable partout pendant les vacances</strong>.</p>
<p>GitHub Codespaces m’a d’abord fourni une machine de développement disponible à la demande.</p>
<p>ShellFish m’a ensuite permis de transformer mon iPhone en terminal SSH réellement utilisable.</p>
<p>Puis <code>tmux</code> a résolu le problème essentiel de la persistance : une tâche Codex pouvait continuer à tourner même après avoir fermé ShellFish et perdu la connexion SSH.</p>
<p>À partir de là, Codespaces n’était finalement plus indispensable. Ma seedbox pouvait assurer exactement ce rôle, avec l’avantage d’être déjà disponible 24 heures sur 24.</p>
<p>Ce que je retiens surtout de cette expérience, c’est que l’arrivée d’agents comme Codex modifie assez profondément la notion de développement à distance.</p>
<p>Je n’ai plus forcément besoin d’avoir mon IDE devant moi.</p>
<p>Je n’ai même plus forcément besoin de rester connecté.</p>
<p>Je peux simplement ouvrir ShellFish, reprendre une session tmux, donner un <code>/goal</code> à Codex et revenir quelques heures plus tard.</p>
<p>Et lorsque l’on peut faire tout ça en quelques minutes depuis la plage de Palma avant de remettre son téléphone dans le sac, on commence vraiment à comprendre l’intérêt des agents de développement autonomes.</p>]]></content:encoded>
      <category>vibecoding</category>
    </item>

    <item>
      <title>Light Static Blog : une solution statique vibecodée</title>
      <link>https://gildaslechevalier.fr/blog/light-static-blog-solution-statique-vibecodee/</link>
      <guid isPermaLink="true">https://gildaslechevalier.fr/blog/light-static-blog-solution-statique-vibecodee/</guid>
      <pubDate>Thu, 13 Aug 2026 00:00:00 GMT</pubDate>
      <dc:creator>Gildas Lechevalier</dc:creator>
      <description><![CDATA[Pourquoi j'ai créé Light Static Blog, une solution personnelle, légère et statique pour publier simplement avec un déploiement automatisé.]]></description>
      <content:encoded><![CDATA[<p><img src="https://gildaslechevalier.fr/blog/images/light-static-blog-cover.png" alt="Illustration de Light Static Blog : une solution statique vibecodée" /></p><p><code>Light Static Blog</code> est né d’un besoin très simple : avoir un blog personnel que
je comprends, que je maîtrise, et que je peux déployer sans usine à gaz.</p>
<p>Je voulais quelque chose de léger, statique, lisible, personnalisable, et assez
propre pour durer. Pas un CMS complet. Pas une application serveur à maintenir.
Pas une base de données pour trois articles et quelques images.</p>
<p>Juste du Markdown, un build, puis des fichiers HTML à déposer quelque part.</p>
<h2 id="pourquoi-une-solution-perso-">Pourquoi une solution perso ?</h2>
<p>Il existe déjà beaucoup de solutions pour publier un blog. Certaines sont très
bonnes. Mais j’avais envie d’un socle à ma main, avec des choix simples :</p>
<ul>
<li>des articles en Markdown dans le repo ;</li>
<li>un site généré statiquement ;</li>
<li>un thème facilement remplaçable ;</li>
<li>un flux RSS complet ;</li>
<li>un sitemap et un <code>robots.txt</code> propres ;</li>
<li>une base SEO correcte dès le départ ;</li>
<li>un déploiement automatisé vers mon hébergement.</li>
</ul>
<p>Le but n’était pas de réinventer le web. Le but était plutôt de construire un
petit outil clair, adapté à mon usage, et suffisamment générique pour rester
réutilisable.</p>
<h2 id="le-choix-du-statique">Le choix du statique</h2>
<p>Le statique a un charme très particulier : une fois généré, le site n’a presque
plus besoin de rien.</p>
<p>Pas de serveur applicatif, pas de session, pas de base de données, pas de mise à
jour de plugin qui casse tout un dimanche soir. Le résultat final, ce sont des
fichiers HTML, CSS, JS et images que n’importe quel hébergement web classique
peut servir.</p>
<p>Pour un blog personnel, c’est exactement ce que je voulais :</p>
<ul>
<li>rapide à charger ;</li>
<li>simple à sauvegarder ;</li>
<li>facile à versionner ;</li>
<li>peu fragile ;</li>
<li>déployable aussi bien sur GitHub Pages que sur un hébergement SFTP.</li>
</ul>
<p>Il y a aussi une raison plus pragmatique : la sécurité. Un site statique expose
beaucoup moins de surface d’attaque qu’une application dynamique. Pas
d’administration en ligne, pas de base de données accessible, pas de code serveur
à exécuter à chaque requête. Rien n’est magique, évidemment, mais moins il y a
de pièces mobiles en production, moins il y a d’endroits où quelque chose peut
mal tourner.</p>
<h2 id="le-déploiement-automatique">Le déploiement automatique</h2>
<p>Une grosse partie du confort vient du déploiement.</p>
<p>L’idée est de pouvoir lancer une commande, générer le site, vérifier les sorties
importantes, puis envoyer uniquement ce qui doit l’être sur le serveur. Le script
SFTP gère donc le build, quelques contrôles, le transfert et une vérification
des fichiers publiés.</p>
<p>Ce n’est pas spectaculaire, mais c’est exactement le genre de détail qui change
l’usage au quotidien. Quand publier devient simple, on publie plus facilement.</p>
<h2 id="vibecodé-avec-codex">Vibecodé avec Codex</h2>
<p>Ce projet a aussi été une expérience de <strong>vibecoding</strong>.</p>
<p>Pendant quelques jours, j’ai construit le blog avec Codex comme compagnon de
route : une idée, une itération, un test, une correction, puis une autre idée.
Le système de thèmes, le RSS, le sitemap, les métadonnées SEO, le rendu Markdown,
les améliorations mobiles, l’accessibilité, le script de déploiement… tout a été
fait par petites passes successives.</p>
<p>Ce qui m’a plu dans cette manière de travailler, c’est le rythme. On peut
avancer vite sans forcément bâcler, à condition de vérifier souvent :</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="powershell"><code><span class="line"><span style="color:#E1E4E8">npm run validate</span></span></code></pre>
<p>À chaque étape, le projet devait continuer à construire proprement. C’est devenu
une sorte de règle du jeu : expérimenter, oui, mais garder une base saine.</p>
<h2 id="un-moteur-et-un-carnet">Un moteur et un carnet</h2>
<p>Aujourd’hui, <code>Light Static Blog</code> est le moteur public générique. Et ce site,
<code>Carnet de dev</code>, en est une déclinaison personnelle avec mon thème, mes contenus
et mon déploiement.</p>
<p>Cette séparation me plaît bien :</p>

















<table><thead><tr><th>Projet</th><th>Rôle</th></tr></thead><tbody><tr><td><code>light-static-blog</code></td><td>moteur public, générique et réutilisable</td></tr><tr><td><code>carnet-de-dev</code></td><td>blog personnel, thème privé et contenu réel</td></tr></tbody></table>
<p>Le moteur peut continuer à évoluer proprement, tandis que le carnet reste mon
terrain d’expression.</p>
<h2 id="ce-que-je-retiens">Ce que je retiens</h2>
<p>Ce projet est modeste, mais il coche beaucoup de cases importantes pour moi :</p>
<ol>
<li>il est simple à comprendre ;</li>
<li>il produit un site statique rapide ;</li>
<li>il respecte les bases SEO et RSS ;</li>
<li>il laisse la main au thème ;</li>
<li>il se déploie sans friction ;</li>
<li>il garde le contenu dans Git.</li>
</ol>
<p>Et surtout, il donne envie d’écrire la suite.</p>]]></content:encoded>
      <category>vibecoding</category>
      <media:content url="https://gildaslechevalier.fr/blog/images/light-static-blog-cover.png" type="image/png" medium="image" />
      <media:thumbnail url="https://gildaslechevalier.fr/blog/images/light-static-blog-cover.png" />
    </item>

    <item>
      <title>Pourquoi ce blog ?</title>
      <link>https://gildaslechevalier.fr/blog/pourquoi-ce-blog/</link>
      <guid isPermaLink="true">https://gildaslechevalier.fr/blog/pourquoi-ce-blog/</guid>
      <pubDate>Thu, 13 Aug 2026 00:00:00 GMT</pubDate>
      <dc:creator>Gildas Lechevalier</dc:creator>
      <description><![CDATA[Présentation de Carnet de dev, un espace personnel pour partager mes expérimentations geekesques, mes projets vibecodés, un peu de photo et d'autres explorations numériques.]]></description>
      <content:encoded><![CDATA[<p><img src="https://gildaslechevalier.fr/blog/images/presentation-carnet-de-dev-cover.png" alt="Illustration de Pourquoi ce blog ?" /></p><p>Il fallait bien un premier billet.</p>
<p>Ce blog naît d’une envie assez simple : garder une trace de ce que je fabrique,
de ce que je teste, de ce que je casse parfois, et de ce que j’apprends en
chemin.</p>
<h2 id="un-carnet-plutôt-quune-vitrine">Un carnet plutôt qu’une vitrine</h2>
<p>Je ne veux pas en faire une grande scène officielle, avec projecteurs et
phrases trop propres. L’idée est plutôt d’avoir un carnet vivant, où je peux
poser des notes, documenter des choix, raconter un bricolage technique ou
revenir sur une expérimentation.</p>
<p>Il y aura probablement des articles très courts, d’autres plus détaillés, et
quelques détours. Ça me va bien : les projets numériques avancent rarement en
ligne droite.</p>
<h2 id="des-expérimentations-geekesques">Des expérimentations geekesques</h2>
<p>Une bonne partie du contenu tournera autour du développement et des bidouilles
geekesques :</p>
<ul>
<li>essais d’outils ;</li>
<li>petits scripts utiles ;</li>
<li>interfaces bricolées ;</li>
<li>automatisations ;</li>
<li>tests autour du web, de l’hébergement ou de la génération statique ;</li>
<li>idées qui commencent par “tiens, et si…”.</li>
</ul>
<p>Le but n’est pas de prétendre avoir la réponse parfaite. Le but est de partager
le chemin, les essais, les limites et les petites trouvailles.</p>
<h2 id="des-projets-vibecodés">Des projets vibecodés</h2>
<p>J’ai aussi envie de documenter des projets <strong>vibecodés</strong> : ces moments où l’on
part d’une idée, d’une intuition, d’une ambiance, puis où l’on construit en
dialoguant avec les outils, le code et les contraintes.</p>
<p>Ce blog lui-même en fait partie. Il est à la fois le support et le premier
terrain de jeu : thème terminal, déploiement, RSS, SEO, accessibilité,
personnalisation… un petit laboratoire qui prend forme en avançant.</p>
<h2 id="photo-numérique-et-autres-bifurcations">Photo, numérique et autres bifurcations</h2>
<p>Il pourra aussi être question de photo, d’images, d’objets numériques ou de
projets plus personnels. Pas forcément sous forme de grands tutoriels : parfois
une image, une idée, un retour d’expérience ou une note de méthode suffisent.</p>
<p>Si un sujet touche à la création numérique, au plaisir de comprendre ou à la
joie de bricoler quelque chose qui fonctionne, il a probablement sa place ici.</p>
<h2 id="pourquoi-publier-">Pourquoi publier ?</h2>
<p>Publier oblige à clarifier. Même quand personne ne lit tout de suite, écrire
force à ranger un peu ses idées, à nommer ce qui était flou, à garder une trace
consultable plus tard.</p>
<p>Et puis il y a une autre raison, plus simple : partager une expérimentation peut
donner envie à quelqu’un d’essayer à son tour. Rien que pour ça, le carnet vaut
le coup d’exister.</p>
<p>Bienvenue donc dans ce petit coin de web.</p>]]></content:encoded>
      <category>presentation</category>
      <media:content url="https://gildaslechevalier.fr/blog/images/presentation-carnet-de-dev-cover.png" type="image/png" medium="image" />
      <media:thumbnail url="https://gildaslechevalier.fr/blog/images/presentation-carnet-de-dev-cover.png" />
    </item>
    </channel>
  </rss>