<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
        xmlns:image="http://www.google.com/schemas/sitemap-image/1.1">
    <url>
        <loc>https://www.web-developpeur.com/blog/dev-freelance-local-vs-offshore</loc>
        <lastmod>2026-05-19</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/dev-freelance-local-vs-offshore.jpg</image:loc>
            <image:title>Freelance local ou offshore : ce que personne ne dit sur le coût réel</image:title>
            <image:caption>Le « dev offshore à 250€/jour » a séduit pendant 10 ans. Bilan en 2026 : retours massifs vers le local. Décalage horaire, sémantique métier, juridique — les vrais arbitrages pour les PME françaises.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/prix-creation-site-internet-2026</loc>
        <lastmod>2026-05-19</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/prix-creation-site-internet-2026.jpg</image:loc>
            <image:title>Combien coûte la création d&#039;un site internet en 2026 ?</image:title>
            <image:caption>Les vraies fourchettes de prix en 2026 par type de site : vitrine 1500-8000€, e-commerce 4000-25000€, applicatif 8000-100000€. Les 4 pièges qui font exploser le budget et la checklist du devis idéal.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/leboncoin-bumper-extension-chrome</loc>
        <lastmod>2026-05-13</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/leboncoin-bumper-extension-chrome.jpg</image:loc>
            <image:title>Booster Leboncoin : l&#039;extension Chrome MV3 qui republie mes annonces et scrute les prospects à ma place</image:title>
            <image:caption>Mes annonces Leboncoin coulaient en 3 jours. J&#039;ai construit une extension Manifest V3 qui les republie en boucle et scanne les demandes de prospects avec scoring pondéré. Code, DataDome, anti-scam.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/refonte-cv-claude-iteration-ats</loc>
        <lastmod>2026-05-13</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/refonte-cv-claude-iteration-ats.jpg</image:loc>
            <image:title>Refaire son CV avec Claude : 36 itérations, scoring ATS + recruteur, et le PDF final</image:title>
            <image:caption>36 itérations sur un CV en deux heures. Claude code, je juge le rendu, double scoring ATS + recruteur à chaque passe. Ce que la boucle itérative change vraiment.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/claude-md-audit-documentation-agent</loc>
        <lastmod>2026-05-12</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/claude-md-audit-documentation-agent.jpg</image:loc>
            <image:title>CLAUDE.md après un audit : 296 → 142 lignes, et l&#039;agent code mieux qu&#039;avant</image:title>
            <image:caption>Tu mets tout dans ton CLAUDE.md parce que &quot;plus de contexte = mieux&quot;. Comment j&#039;ai coupé 52% d&#039;un CLAUDE.md de production après un audit de sécurité, et pourquoi l&#039;agent code mieux avec moins.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/audit-securite-probes-regression-tests</loc>
        <lastmod>2026-05-12</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/audit-securite-probes-regression-tests.jpg</image:loc>
            <image:title>Audit de sécurité itératif : 45 probes, 0 critical, 6 tests de régression gardés</image:title>
            <image:caption>L&#039;audit pré-pentest en passes successives. Comment vérifier les findings avant de paniquer, et comment sélectionner les probes qui deviennent des regression tests permanents.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/cqrs-pubsub-bridge-audit-atomique</loc>
        <lastmod>2026-05-12</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/cqrs-pubsub-bridge-audit-atomique.jpg</image:loc>
            <image:title>CQRS+ES : le pubsub bridge pour les outcomes commands et l&#039;audit log atomique</image:title>
            <image:caption>Invariant event-XOR-error sur les command handlers. Comment informer le caller d&#039;un résultat métier sans casser la séparation event/error, et pourquoi l&#039;audit log doit être atomique.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/crl-double-gate-revocation-temps-reel</loc>
        <lastmod>2026-05-12</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/crl-double-gate-revocation-temps-reel.jpg</image:loc>
            <image:title>CRL double-gate en mTLS : révoquer un cert quand le client est déjà connecté</image:title>
            <image:caption>tls.Config.VerifyConnection ne s&#039;exécute qu&#039;au handshake. Un client en keep-alive après révocation continue de servir. Pattern double-gate et hot-reload CRL avec check monotone.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/mtls-sni-cert-binding-session</loc>
        <lastmod>2026-05-12</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/mtls-sni-cert-binding-session.jpg</image:loc>
            <image:title>mTLS multi-audience : 3 SNI, 1 listener, et le cert binding qui empêche le replay</image:title>
            <image:caption>Un seul port TLS qui sert trois hosts via SNI avec des niveaux de ClientAuth différents. Plus le pattern session cert binding pour bloquer le vol de cookie.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/csrf-synchronizer-token-financial-grade</loc>
        <lastmod>2026-05-12</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/csrf-synchronizer-token-financial-grade.jpg</image:loc>
            <image:title>CSRF : pourquoi le double-submit cookie ne suffit pas pour du financial-grade</image:title>
            <image:caption>Synchronizer token server-side vs double-submit cookie : quand le second échoue, pourquoi le wire-order du middleware compte, et comment gérer les requêtes JS non-form.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/lockout-exponential-backoff-enumeration</loc>
        <lastmod>2026-05-12</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/lockout-exponential-backoff-enumeration.jpg</image:loc>
            <image:title>Lockout exponential backoff : bloquer le brute force sans leaker l&#039;existence du compte</image:title>
            <image:caption>N premiers échecs silencieux, puis backoff exponentiel cappé à 15 min. Pourquoi le status code ne doit jamais distinguer locked vs wrong creds, et comment reset proprement.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/argon2-timing-oracle-dummy-hash</loc>
        <lastmod>2026-05-12</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/argon2-timing-oracle-dummy-hash.jpg</image:loc>
            <image:title>Le dummy hash Argon2 : 50 millisecondes entre ton username enum et ta tranquillité</image:title>
            <image:caption>Si ton login répond en 1ms pour un user inconnu et 50ms pour un user connu, tu as un oracle. Le fix tient en 3 lignes. Le piège qui le casse 6 mois plus tard, en une seule.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/pkcs12-windows-pbes2-cng</loc>
        <lastmod>2026-05-12</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/pkcs12-windows-pbes2-cng.jpg</image:loc>
            <image:title>Ton .p12 moderne est cassé sur Windows : la trappe PBES2/CNG que personne ne documente</image:title>
            <image:caption>Un PKCS#12 chiffré AES-256, importé avec succès par certutil, mais ECDSA inutilisable dans Edge. Le piège du routage CryptoAPI vs CNG et le fix avec l&#039;attribut MS KSP.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/refonte-site-viticulture-php</loc>
        <lastmod>2026-05-12</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/refonte-site-viticulture-php.jpg</image:loc>
            <image:title>Refonte d&#039;un site vitrine en PHP pur : bilingue, anti-spam, CI/CD — sans framework</image:title>
            <image:caption>Comment j&#039;ai construit un site vitrine bilingue FR/EN en PHP 8 sans framework ni CMS : anti-spam 7 couches sans captcha, CSP strict avec CDN, LCP optimisé et CI/CD GitHub Actions complète.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/nettoyage-emails-mcp-gmail-outlook</loc>
        <lastmod>2026-05-12</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/nettoyage-emails-mcp-gmail-outlook.jpg</image:loc>
            <image:title>Nettoyage de 7 700 mails depuis le terminal avec MCP, Gmail API et Microsoft Graph</image:title>
            <image:caption>Comment j&#039;ai automatisé le tri, les filtres et les désabonnements de 58 000 mails Outlook et Gmail depuis Claude Code via MCP, Graph API et RFC 8058 One-Click Unsubscribe.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/schemas-svg-generateurs-parametriques</loc>
        <lastmod>2026-04-24</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/schemas-svg-generateurs-parametriques.jpg</image:loc>
            <image:title>Schémas SVG et générateurs paramétriques : tester 358 questions sur 200 seeds</image:title>
            <image:caption>Comment j&#039;ai construit un kit SVG React (circuits, triangles, volumes 3D) et des générateurs de questions déterministes testés par pre-commit sur 200 seeds par gen.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/refacto-typescript-radar-college</loc>
        <lastmod>2026-04-23</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/refacto-typescript-radar-college.jpg</image:loc>
            <image:title>Migrer en TypeScript sans bundler : retour sur Radar College</image:title>
            <image:caption>Comment j&#039;ai migré une SPA React en TypeScript avec Babel Standalone, sans webpack ni vite, en gardant la compatibilité file:// et un build de 50 lignes.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/quizz-brevet-college-react</loc>
        <lastmod>2026-04-22</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/quizz-brevet-college-react.jpg</image:loc>
            <image:title>Quizz Brevet collège en React : gamification, accessibilité et questions adaptatives</image:title>
            <image:caption>Comment j&#039;ai construit une plateforme de révision pour le Brevet en React : quizz randomisés, notation pondérée, radar de compétences, badges, mode dyslexie et questions adaptatives.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/ordre-audit-symfony-legacy</loc>
        <lastmod>2026-04-20</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/ordre-audit-symfony-legacy.jpg</image:loc>
            <image:title>Audit Symfony legacy : par où commencer sans tout refaire deux fois</image:title>
            <image:caption>Faut-il auditer les controllers, les entités, ou trancher par feature ? Retour d&#039;expérience sur l&#039;ordre qui évite de retoucher le même code trois fois.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/generics-go-guide-pratique</loc>
        <lastmod>2026-04-07</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/generics-go-guide-pratique.jpg</image:loc>
            <image:title>Generics en Go : quand les utiliser, quand les éviter</image:title>
            <image:caption>Les generics Go comblent un angle mort précis : les algorithmes identiques pour n&#039;importe quel type. Retour d&#039;expérience sur les patterns qui fonctionnent et ceux qui empirent le code.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/injection-dependances-go</loc>
        <lastmod>2026-04-07</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/injection-dependances-go.jpg</image:loc>
            <image:title>Injection de dépendances en Go sans framework</image:title>
            <image:caption>Comment faire de la DI en Go sans Wire ni Dig. Interfaces, constructeurs, wiring dans main.go — et pourquoi un framework de DI est souvent la mauvaise réponse à un vrai problème de design.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/functional-options-go</loc>
        <lastmod>2026-04-07</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/functional-options-go.jpg</image:loc>
            <image:title>Functional options en Go : sortir du constructeur à 9 paramètres</image:title>
            <image:caption>Le pattern functional options expliqué depuis un vrai problème : un constructeur HTTP qui grossit à chaque sprint. Comment implémenter, gérer les defaults, composer les options et savoir quand s&#039;en passer.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/plugins-claude-code-tokens-contexte</loc>
        <lastmod>2026-04-02</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/plugins-claude-code-tokens-contexte.jpg</image:loc>
            <image:title>Claude Code : j&#039;avais 10 plugins actifs en même temps, voilà ce que ça coûte vraiment</image:title>
            <image:caption>Les plugins Claude Code injectent du contexte à chaque échange, même si vous ne les utilisez pas. Retour d&#039;expérience après avoir vidé 200€ de crédits sans comprendre pourquoi.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/ia-tmdb-3-passes-posters-torrents</loc>
        <lastmod>2026-03-28</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/ia-tmdb-3-passes-posters-torrents.jpg</image:loc>
            <image:title>Quand l&#039;IA confond Naruto et Kill Bill : matcher des posters avec TMDB et 3 passes d&#039;IA</image:title>
            <image:caption>Mon outil de partage affiche une grille Netflix avec des posters TMDB. Problème : les noms de dossiers sont incompréhensibles. Comment j&#039;ai construit un pipeline IA en 3 passes pour corriger les matchs foireux, avec les vrais chiffres.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/workflow-claude-abonnement-pro-max</loc>
        <lastmod>2026-03-28</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/workflow-claude-abonnement-pro-max.jpg</image:loc>
            <image:title>Adapter son workflow Claude Code selon son abonnement : Pro, Max $100, Max $200</image:title>
            <image:caption>Le modèle et la façon de travailler changent radicalement selon l&#039;abonnement Claude. Sessions, agents parallèles, CLAUDE.md — ce que chaque tier impose ou autorise concrètement.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/sharebox-peer-programming-ia</loc>
        <lastmod>2026-03-28</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/sharebox-peer-programming-ia.jpg</image:loc>
            <image:title>J&#039;ai laissé Claude Code piloter mon side projet de A à Z : les vraies surprises du peer programming IA</image:title>
            <image:caption>Ce que ça donne vraiment de développer un projet de A à Z avec une IA en pair — décisions d&#039;architecture, limites réelles, patterns qui fonctionnent. Retour d&#039;expérience sur sharebox, un file sharing self-hosted en PHP pur.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/ia-boucle-iteration-prompt</loc>
        <lastmod>2026-03-27</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/ia-boucle-iteration-prompt.jpg</image:loc>
            <image:title>L&#039;IA qui s&#039;améliore elle-même : boucle d&#039;itération autonome sur un prompt</image:title>
            <image:caption>Comment mesurer la qualité d&#039;un prompt de génération IA, construire un outil d&#039;évaluation automatisé, et itérer jusqu&#039;au plateau. 5 versions, 150 roasts, enseignements concrets sur ce que l&#039;IA fait systématiquement et ses limites.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/skills-claude-code-git-log</loc>
        <lastmod>2026-03-26</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/skills-claude-code-git-log.jpg</image:loc>
            <image:title>Générer des skills Claude Code depuis ton historique git</image:title>
            <image:caption>Ton git log + tes fichiers mémoire sont la source la plus honnête pour créer des skills Claude Code sur mesure. Comment les auditer, identifier les patterns récurrents, et écrire des skills qui s&#039;auto-déclenchent au bon moment.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/prompts-ia-taches-dev</loc>
        <lastmod>2026-03-26</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/prompts-ia-taches-dev.jpg</image:loc>
            <image:title>L&#039;IA fait exactement ce que tu lui demandes — c&#039;est le problème</image:title>
            <image:caption>Bug fix, nouvelle feature, refactoring, code review : chaque tâche dev a son template de prompt. J&#039;ai testé et scoré des dizaines de formulations — voici ce qui marche vraiment avec les IA actuelles.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/cron-vs-daemon-systemd-nodejs</loc>
        <lastmod>2026-03-25</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/cron-vs-daemon-systemd-nodejs.jpg</image:loc>
            <image:title>Comment 59 secondes de retard m&#039;ont fait passer de cron à systemd</image:title>
            <image:caption>Même machine, même Node.js, deux approches : un cron pour publier à heure fixe, un daemon pour réagir en 30 secondes. Cron, systemd timer, daemon — quand utiliser lequel et pourquoi.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/reinstaller-env-claude-code</loc>
        <lastmod>2026-03-25</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/reinstaller-env-claude-code.jpg</image:loc>
            <image:title>Nouveau PC, zéro setup : comment j&#039;ai reconstruit tout mon env Claude Code en une commande</image:title>
            <image:caption>Tout ce que Claude sait sur votre façon de travailler vit dans ~/.claude/ — et ça ne se synchronise pas. Comment reconstruire CLAUDE.md global, fichiers de référence, statusline et plugins en quelques minutes sur un nouvel environnement.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/memoire-auto-claude-code</loc>
        <lastmod>2026-03-25</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/memoire-auto-claude-code.jpg</image:loc>
            <image:title>Claude oublie tout à chaque session — j&#039;ai passé 2h à lui apprendre à se souvenir</image:title>
            <image:caption>La mémoire auto de Claude Code permet de conserver entre sessions ce qui évolue trop vite pour le CLAUDE.md : préférences, décisions actives, gotchas. Les 4 types, les critères de tri, et un prompt d&#039;audit pour maintenir ça propre.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/optimiser-tokens-claude-code</loc>
        <lastmod>2026-03-25</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/optimiser-tokens-claude-code.jpg</image:loc>
            <image:title>Rate limit en 45 minutes sur du CSS : comment j&#039;ai divisé ma conso de tokens</image:title>
            <image:caption>.claudeignore, CLAUDE.md découpé par domaine, /clear entre chaque tâche, questions ciblées — les leviers concrets pour réduire la consommation de tokens sans perdre en qualité.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/claudilon-ia-auto-reply-linkedin</loc>
        <lastmod>2026-03-23</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/claudilon-ia-auto-reply-linkedin.jpg</image:loc>
            <image:title>Claudilon : une IA qui répond à mes commentaires LinkedIn en temps réel</image:title>
            <image:caption>Comment j&#039;ai construit un bot qui scrape mes posts LinkedIn, détecte les nouveaux commentaires, et répond via Claude CLI en moins de 30 secondes.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/responsive-testing-claude-code-playwright</loc>
        <lastmod>2026-03-22</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/responsive-testing-claude-code-playwright.jpg</image:loc>
            <image:title>Zéro overflow en 10 minutes : tester le responsive avec Claude Code et Playwright</image:title>
            <image:caption>Workflow automatisé pour éliminer les overflow horizontaux à toutes les résolutions. Claude Code + Playwright MCP : boucle screenshot → fix → retest.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/premier-spam-anti-bot-captcha-php</loc>
        <lastmod>2026-03-21</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/premier-spam-anti-bot-captcha-php.jpg</image:loc>
            <image:title>Mon premier spam : comment j&#039;ai sécurisé les commentaires en 10 minutes</image:title>
            <image:caption>Premier commentaire spam sur mon blog : analyse du bot, suppression à distance, et mise en place d&#039;un captcha mathématique côté serveur en PHP.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/landing-page-automatisation-claude-code</loc>
        <lastmod>2026-03-21</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/landing-page-automatisation-claude-code.jpg</image:loc>
            <image:title>Créer une landing page SEO avec Claude Code en une session</image:title>
            <image:caption>Comment j&#039;ai construit une landing page d&#039;automatisation complète — SEO, formulaire, chatbox, design moderne — en une conversation avec Claude Code.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/blog-automatise-devto-linkedin</loc>
        <lastmod>2026-03-21</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/blog-automatise-devto-linkedin.jpg</image:loc>
            <image:title>Automatiser la publication de son blog vers dev.to et LinkedIn</image:title>
            <image:caption>Retour d&#039;expérience sur l&#039;automatisation complète de la publication d&#039;articles : API dev.to, OAuth LinkedIn, upload image et script unifié en Node.js.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/erreurs-go-safe-par-design</loc>
        <lastmod>2026-03-20</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/erreurs-go-safe-par-design.jpg</image:loc>
            <image:title>Concevoir un package d&#039;erreurs sécurisé en Go : safe by default</image:title>
            <image:caption>Comment concevoir un package Go de 130 lignes qui garantit que err.Error() ne fuite jamais de données techniques dans les réponses HTTP — safe by default, sans convention à respecter.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/php-fpm-goroutines-charge-concurrence</loc>
        <lastmod>2026-03-19</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/php-fpm-goroutines-charge-concurrence.jpg</image:loc>
            <image:title>PHP-FPM, workers et goroutines : ce qui se passe vraiment sous la charge</image:title>
            <image:caption>PHP-FPM alloue un process entier par requête active. Go spawn une goroutine à 8 Ko. Conséquences sur la RAM, la latence sous charge, et les décisions d&#039;infra que ça implique.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/sse-php-fpm-chatbox-workers</loc>
        <lastmod>2026-03-19</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/sse-php-fpm-chatbox-workers.jpg</image:loc>
            <image:title>SSE et PHP-FPM ne font pas bon ménage</image:title>
            <image:caption>Server-Sent Events avec PHP-FPM : pourquoi 20 utilisateurs simultanés peuvent paralyser tout le serveur, et comment le long-poll résout le problème sans aucune bibliothèque externe.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/recherche-ia-sources-primaires-protocole</loc>
        <lastmod>2026-03-14</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/recherche-ia-sources-primaires-protocole.jpg</image:loc>
            <image:title>Recherche avec l&#039;IA : sources primaires, étiquetage de certitude et contre-argumentation</image:title>
            <image:caption>L&#039;IA dit oui à tout. Sans méthode, elle amplifie tes biais au lieu de les corriger. Le protocole que j&#039;ai mis en place pour faire de la recherche rigoureuse : sources primaires uniquement, étiquetage de certitude sur chaque point, et contre-argumentation systématique.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/veille-tech-ia-claude-workflow</loc>
        <lastmod>2026-03-14</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/veille-tech-ia-claude-workflow.jpg</image:loc>
            <image:title>Veille technique avec l&#039;IA : workflow concret et limites honnêtes</image:title>
            <image:caption>J&#039;avais 47 flux RSS. Le résultat : deux heures par semaine à scroller, et un breaking change Go découvert en prod six semaines trop tard. Comment j&#039;ai restructuré ma veille autour de l&#039;IA, avec un script bash concret et un regard honnête sur les limites.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/philosopher-avec-claude-ia-conscience</loc>
        <lastmod>2026-03-14</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/philosopher-avec-claude-ia-conscience.jpg</image:loc>
            <image:title>Philosopher avec une IA : conscience, survie et entropie</image:title>
            <image:caption>Un samedi après-midi, j&#039;ai voulu poser quelques questions à Claude. Deux heures plus tard, on parlait de thermodynamique, du paradoxe divin et de l&#039;instinct de survie des machines. Retour sur un dialogue inattendu.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/migrer-postman-bruno-monorepo</loc>
        <lastmod>2026-03-11</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/migrer-postman-bruno-monorepo.jpg</image:loc>
            <image:title>Migrer Postman vers Bruno dans un mono-repo : le guide pratique</image:title>
            <image:caption>Un ticket, un outil inconnu, six services à migrer dont du gRPC. Ce que j&#039;aurais voulu lire avant de commencer : concepts Bruno, structure mono-repo, .env pour les secrets, multi-env local/dev/prod.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/retro-consoles-css-scanlines-dark-theme</loc>
        <lastmod>2026-03-11</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/retro-consoles-css-scanlines-dark-theme.jpg</image:loc>
            <image:title>Guide rétro-gaming : CSS scanlines, Orbitron et dark theme sans JS</image:title>
            <image:caption>J&#039;ai construit un guide d&#039;achat pour consoles rétro portables avec un CSS purement esthétique — scanlines, Orbitron, custom properties — sans une ligne de JS. Les vraies décisions, pas la doc de base.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/grpc-go-streaming-microservices</loc>
        <lastmod>2026-03-23</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/grpc-go-streaming-microservices.jpg</image:loc>
            <image:title>gRPC en Go : streaming temps réel pour microservices</image:title>
            <image:caption>REST pour les APIs publiques, gRPC pour les services internes. Server streaming pour un price feed temps réel, Protobuf pour les contrats typés, et les 4 modes de streaming expliqués.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/postgresql-jsonb-index-partitioning</loc>
        <lastmod>2026-03-22</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/postgresql-jsonb-index-partitioning.jpg</image:loc>
            <image:title>PostgreSQL avancé : JSONB, index partiels et partitionnement</image:title>
            <image:caption>Une table trades à 50 millions de lignes, une requête à 4 secondes. Après JSONB, index partiels et partitionnement par date : 12ms. Les quatre techniques qui changent vraiment les perfs en production.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/circuit-breaker-go-exchange</loc>
        <lastmod>2026-03-21</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/circuit-breaker-go-exchange.jpg</image:loc>
            <image:title>Circuit breaker en Go : survivre aux pannes d&#039;exchange</image:title>
            <image:caption>Binance en maintenance à 2h du matin, votre service continue de taper dessus à 10 req/sec. Circuit breaker, retry avec backoff exponentiel, timeout, fallback : la stack de résilience complète en Go.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/ddd-go-domaine-exchange-crypto</loc>
        <lastmod>2026-03-20</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/ddd-go-domaine-exchange-crypto.jpg</image:loc>
            <image:title>DDD en Go appliqué aux API d&#039;exchange crypto</image:title>
            <image:caption>Bounded contexts, aggregates, value objects et anti-corruption layer — le DDD est le &#039;pourquoi&#039; derrière CQRS et l&#039;event sourcing. Appliqué à un service Go qui consomme Binance, OKEx et Coinbase.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/tester-client-api-go-exchange</loc>
        <lastmod>2026-03-19</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/tester-client-api-go-exchange.jpg</image:loc>
            <image:title>Tester un client Go d&#039;API exchange : mocks, httptest et testcontainers</image:title>
            <image:caption>Vous ne pouvez pas taper sur la vraie API Binance dans vos tests. Interface ExchangeClient, mocks avec mockgen, httptest pour le parsing des réponses réelles, testcontainers pour PostgreSQL.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/quel-langage-pour-quel-projet</loc>
        <lastmod>2026-03-12</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/quel-langage-pour-quel-projet.jpg</image:loc>
            <image:title>Quel langage pour quel projet ? PHP, Go, Python, JS — guide pragmatique</image:title>
            <image:caption>PHP, Go, Python, JavaScript, Rust — pas de réponse universelle, mais des critères clairs. Un guide pragmatique et critique pour choisir le bon langage selon le projet, avec tableau récapitulatif.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/php-async-event-loop-fibers</loc>
        <lastmod>2026-03-11</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/php-async-event-loop-fibers.jpg</image:loc>
            <image:title>PHP async : event loop, Fibers et les limites du mono-thread</image:title>
            <image:caption>PHP peut faire ce que Node.js fait : sauter d&#039;une tâche à l&#039;autre sur un seul thread. ReactPHP, Fibers PHP 8.1, et pourquoi ça ne remplace pas le vrai parallélisme.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/seo-blog-php-schema-pagination</loc>
        <lastmod>2026-03-11</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/seo-blog-php-schema-pagination.jpg</image:loc>
            <image:title>SEO blog PHP : JSON-LD, ToC et pagination crawlable</image:title>
            <image:caption>Google Search Console affichait 0 article indexé après 3 semaines. Retour sur les fixes : JSON-LD avec articleBody via output buffering, ToC PHP avec IDs stables, et pagination hybride PHP/JS crawlable.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/pentest-tracker-prive-nuxt-cloudflare</loc>
        <lastmod>2026-03-10</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/pentest-tracker-prive-nuxt-cloudflare.jpg</image:loc>
            <image:title>Pentest d&#039;un tracker privé : Nuxt.js, Cloudflare et 3 vulnérabilités trouvées</image:title>
            <image:caption>Retour sur un pentest web autorisé d&#039;un tracker BitTorrent privé : stack Nuxt.js SSR + Node.js derrière Cloudflare WAF. 3 vulnérabilités trouvées (CORS, historique chat sans limite, NUXT_DATA), technique Playwright pour tester les WebSockets, et ce que Cloudflare ne fait pas.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/promouvoir-side-project-10-euros-pub</loc>
        <lastmod>2026-03-09</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/promouvoir-side-project-10-euros-pub.jpg</image:loc>
            <image:title>Promouvoir son blog technique avec 10€ de pub : Google Ads vs Reddit Ads</image:title>
            <image:caption>Guide pas à pas pour tester la pub en ligne sur un blog dev avec 10€ : cibler les recruteurs et la communauté Go/PHP, rédiger des annonces qui ne font pas fuir les Redditors, mesurer le ROI. Google Ads vs Reddit Ads.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/claude-md-mobile-css-redesign</loc>
        <lastmod>2026-03-08</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/claude-md-mobile-css-redesign.jpg</image:loc>
            <image:title>CLAUDE.md pour redesign mobile : le contexte qui change tout</image:title>
            <image:caption>Un fichier CLAUDE.md spécialisé pour guider Claude Code sur le responsive mobile et le CSS design. Prêt à copier dans votre projet.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/coherence-css-mobile-bonnes-pratiques</loc>
        <lastmod>2026-03-06</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/coherence-css-mobile-bonnes-pratiques.jpg</image:loc>
            <image:title>Cohérence CSS mobile : toutes les bonnes pratiques en 2026</image:title>
            <image:caption>Alignement des textes, touch targets 44px, font-size des inputs, safe areas, media queries mobile-first — les règles CSS concrètes pour un rendu mobile cohérent et utilisable.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/ffmpeg-streaming-player-js-php</loc>
        <lastmod>2026-03-12</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/ffmpeg-streaming-player-js-php.jpg</image:loc>
            <image:title>Player vidéo JS avec streaming ffmpeg en PHP : machine à états, watchdog, sous-titres</image:title>
            <image:caption>Comment j&#039;ai construit un player vidéo custom pour ShareBox : streaming ffmpeg fragmenté, machine à états JS, watchdog à backoff exponentiel, sous-titres PGS avec scale2ref, et les erreurs qui m&#039;ont appris le plus.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/sharebox-partage-fichiers-auto-heberge</loc>
        <lastmod>2026-03-03</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/sharebox-partage-fichiers-auto-heberge.jpg</image:loc>
            <image:title>ShareBox : partage de fichiers auto-hébergé avec streaming vidéo en PHP pur</image:title>
            <image:caption>J&#039;ai écrit ShareBox : partage de fichiers auto-hébergé, PHP 8.1 sans framework, SQLite, FFmpeg pour le streaming vidéo adaptatif. Les choix techniques et ce que ça apprend sur la philosophie zéro dépendance.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/optimisation-reseau-tcp-bbr-sftp-apache</loc>
        <lastmod>2026-02-28</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/optimisation-reseau-tcp-bbr-sftp-apache.jpg</image:loc>
            <image:title>Optimisation réseau Linux : TCP BBR, ring buffers NIC, SFTP et Apache</image:title>
            <image:caption>SFTP plafonné à 800 KB/s sur une connexion Gbit. CUBIC, ring buffers par défaut, socket buffers mal configurés — cinq réglages noyau et daemon qui font passer le débit de 800 KB/s à plusieurs MB/s.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/cqrs-go-postgresql-event-store</loc>
        <lastmod>2026-02-17</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/cqrs-go-postgresql-event-store.jpg</image:loc>
            <image:title>CQRS en Go — Partie 4 : PostgreSQL comme event store</image:title>
            <image:caption>Implémenter un event store append-only en Go avec PostgreSQL : table es_events, subscriptions pour les projectors, replay depuis n&#039;importe quel point. Pas besoin d&#039;EventStoreDB.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/cqrs-go-sagas-choreographie-events</loc>
        <lastmod>2026-02-03</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/cqrs-go-sagas-choreographie-events.jpg</image:loc>
            <image:title>CQRS en Go — Partie 3 : sagas et chorégraphie par events</image:title>
            <image:caption>Comment faire coopérer deux aggregates sans qu&#039;ils se connaissent. Event handlers cross-aggregate, idempotence des sagas, gestion des erreurs partielles.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/cqrs-go-command-handlers-testabilite</loc>
        <lastmod>2026-01-20</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/cqrs-go-command-handlers-testabilite.jpg</image:loc>
            <image:title>CQRS en Go — Partie 2 : command handlers sans effet de bord</image:title>
            <image:caption>La signature Handle(ctx, state, cmd) (Events, error) rend les handlers testables sans mock, sans DB, sans Docker. Le secret : zéro side effect.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/cqrs-go-aggregate-transition-clone</loc>
        <lastmod>2026-01-06</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/cqrs-go-aggregate-transition-clone.jpg</image:loc>
            <image:title>CQRS en Go — Partie 1 : l&#039;aggregate, Transition() et le Clone() qu&#039;on oublie</image:title>
            <image:caption>Comment structurer un aggregate CQRS en Go : struct en valeur, Transition() qui retourne un nouveau state, Clone() obligatoire pour les collections. Le piège du slice partagé.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/idempotence-cqrs-event-sourcing-avance</loc>
        <lastmod>2025-12-09</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/idempotence-cqrs-event-sourcing-avance.jpg</image:loc>
            <image:title>L&#039;idempotence dans CQRS et Event Sourcing — Partie 2 : commands, projections et outbox</image:title>
            <image:caption>Commands idempotentes avec idempotency key, optimistic locking sur les aggregates, projections idempotentes et outbox pattern. Les 4 couches d&#039;idempotence d&#039;un système Event Sourcing en production.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/idempotence-cqrs-event-sourcing-bases</loc>
        <lastmod>2025-11-18</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/idempotence-cqrs-event-sourcing-bases.jpg</image:loc>
            <image:title>L&#039;idempotence expliquée — Partie 1 : bases, idempotency key et implémentation Go</image:title>
            <image:caption>C&#039;est quoi l&#039;idempotence, pourquoi c&#039;est crucial (retries, double-clic, at-least-once), et comment l&#039;implémenter en Go : middleware HTTP, contrainte DB unique, gestion de la concurrence.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/securiser-serveur-dedie-linux-debian</loc>
        <lastmod>2025-10-28</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/securiser-serveur-dedie-linux-debian.jpg</image:loc>
            <image:title>Sécuriser un serveur dédié Linux Debian 12 — Guide complet post-incident</image:title>
            <image:caption>Audit de sécurité complet d&#039;un serveur Debian 12 après une attaque brute force : fail2ban custom, SSH/SFTP chroot, auditd, permissions, audit IA automatisé, Docker, headers HTTP.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/postgresql-debug-requete-lente-optimisation</loc>
        <lastmod>2025-10-07</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/postgresql-debug-requete-lente-optimisation.jpg</image:loc>
            <image:title>PostgreSQL : déboguer une requête lente et l&#039;optimiser</image:title>
            <image:caption>Méthode complète pour diagnostiquer une requête PostgreSQL lente : EXPLAIN ANALYZE, index manquants (B-tree, GIN, BRIN), statistiques obsolètes, pg_stat_statements. Du diagnostic au fix en prod, sans blabla.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/rate-limiter-go-token-bucket</loc>
        <lastmod>2025-09-16</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/rate-limiter-go-token-bucket.jpg</image:loc>
            <image:title>Rate limiter en Go : token bucket par IP avec golang.org/x/time/rate</image:title>
            <image:caption>Comment implémenter un rate limiter par IP en Go avec le token bucket de golang.org/x/time/rate : sync.Mutex, goroutine de cleanup anti-leak, X-Forwarded-For, middleware ciblé sur POST /api/v1/jobs.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/conventions-go-2025-2026</loc>
        <lastmod>2025-08-26</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/conventions-go-2025-2026.jpg</image:loc>
            <image:title>Conventions Go 2025-2026 — Ce que font les meilleurs projets</image:title>
            <image:caption>slog, errors.Join, context.WithoutCancel, iter.Seq2, testing/synctest, go tool — ce qui s&#039;est stabilisé comme standard dans les meilleurs projets Go en 2025.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/claudegate-http-gateway-claude-code</loc>
        <lastmod>2025-08-05</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/claudegate-http-gateway-claude-code.jpg</image:loc>
            <image:title>ClaudeGate : exposer Claude Code CLI comme une API REST asynchrone en Go</image:title>
            <image:caption>Comment j&#039;ai construit ClaudeGate : une passerelle HTTP en Go qui wrappe Claude Code CLI avec file d&#039;attente asynchrone, streaming SSE, webhooks et persistance SQLite — binaire statique, sans CGO.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/sse-fetch-readable-stream-api-key</loc>
        <lastmod>2025-07-15</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/sse-fetch-readable-stream-api-key.jpg</image:loc>
            <image:title>SSE avec fetch + ReadableStream : streaming authentifié sans EventSource</image:title>
            <image:caption>EventSource ne supporte pas les headers custom — impossible d&#039;envoyer X-API-Key. Comment remplacer par fetch + ReadableStream pour du streaming SSE authentifié, avec parseur manuel et AbortController.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/goroutine-leaks-golang</loc>
        <lastmod>2025-06-24</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/goroutine-leaks-golang.jpg</image:loc>
            <image:title>Goroutine leaks en Go : détecter, comprendre, corriger</image:title>
            <image:caption>Les goroutine leaks ne font pas crasher le programme — ils le dégradent silencieusement. Les 4 patterns qui leakent systématiquement, détection avec pprof et goleak, corrections avec context et channels.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/interfaces-go-philosophie-accept-return</loc>
        <lastmod>2025-06-03</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/interfaces-go-philosophie-accept-return.jpg</image:loc>
            <image:title>Interfaces Go : accept interfaces, return structs — et quand ne pas le faire</image:title>
            <image:caption>La convention Go &quot;accept interfaces, return structs&quot; expliquée depuis un cas concret issu d&#039;une code review sur ClaudeGate. Quand l&#039;appliquer, et pourquoi parfois ne pas le faire.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/erreurs-go-sentinel-struct-fmt</loc>
        <lastmod>2025-05-13</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/erreurs-go-sentinel-struct-fmt.jpg</image:loc>
            <image:title>Erreurs Go : sentinel errors, error structs ou fmt.Errorf — comment choisir</image:title>
            <image:caption>Trois patterns d&#039;erreurs Go expliqués depuis un cas concret de code review sur ClaudeGate. Quand créer une sentinel error, une error struct, ou se contenter de fmt.Errorf.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/go-parallelisme-production-avance</loc>
        <lastmod>2025-04-22</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/go-parallelisme-production-avance.jpg</image:loc>
            <image:title>Le parallélisme en Go — Partie 3 : erreurs concurrentes et gestion des panics</image:title>
            <image:caption>Faire remonter les erreurs depuis les goroutines, collecter tous les échecs d&#039;un batch, et survivre aux panics sans crasher le programme. Les patterns indispensables pour du code concurrent robuste.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/go-parallelisme-channels-patterns</loc>
        <lastmod>2025-04-01</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/go-parallelisme-channels-patterns.jpg</image:loc>
            <image:title>Le parallélisme en Go — Partie 2 : channels, select et worker pool</image:title>
            <image:caption>Maîtriser les channels Go : bufférisé vs non bufférisé, select, fan-out, fan-in et worker pool. Les patterns indispensables pour faire communiquer vos goroutines sans race condition.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/go-parallelisme-goroutines-bases</loc>
        <lastmod>2025-03-11</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/go-parallelisme-goroutines-bases.jpg</image:loc>
            <image:title>Le parallélisme en Go — Partie 1 : goroutines et WaitGroup</image:title>
            <image:caption>Apprendre le parallélisme Go depuis zéro : goroutines, sync.WaitGroup, le piège classique des closures en boucle et le race detector. Avec un exemple concret — 10 URLs en 1s au lieu de 10s.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/concurrence-parallelisme-go-event-sourcing</loc>
        <lastmod>2025-02-18</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/concurrence-parallelisme-go-event-sourcing.jpg</image:loc>
            <image:title>Concurrence vs parallélisme en Go : application à l&#039;Event Sourcing et CQRS</image:title>
            <image:caption>La distinction concurrence vs parallélisme expliquée avec une analogie simple, et comment Go + Event Sourcing / CQRS tirent parti des deux : aggregate single-writer, fan-out de projections, pipeline avec backpressure.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/synchrone-asynchrone-concurrent-parallele-go</loc>
        <lastmod>2025-01-28</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/synchrone-asynchrone-concurrent-parallele-go.jpg</image:loc>
            <image:title>Synchrone, asynchrone, concurrent, parallèle : les 4 concepts expliqués en Go</image:title>
            <image:caption>Quatre mots qu&#039;on mélange tout le temps. Ce qu&#039;ils veulent dire précisément, comment Go les exprime, et comment synchrone/asynchrone et concurrent/parallèle s&#039;articulent ensemble.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/apprendre-go-guide-developpeur</loc>
        <lastmod>2025-01-07</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/apprendre-go-guide-developpeur.jpg</image:loc>
            <image:title>Apprendre Go en 2026 : le guide honnête pour développeurs expérimentés</image:title>
            <image:caption>Les vraies ressources, les pièges mentaux, les conventions et un chemin d&#039;apprentissage concret pour apprendre Go quand on vient de PHP, Python ou JavaScript.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/claude-code-statusline</loc>
        <lastmod>2024-11-26</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/claude-code-statusline.jpg</image:loc>
            <image:title>Claude Code Statusline : surveiller ses rate limits en temps réel</image:title>
            <image:caption>Un script Bash qui affiche les quotas Claude Code en temps réel dans la status bar — contexte, session, quotas hebdo. Zéro interruption de flux.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/tester-bash-script-production</loc>
        <lastmod>2024-11-05</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/tester-bash-script-production.jpg</image:loc>
            <image:title>Tester un script Bash en prod : 38 tests sans framework</image:title>
            <image:caption>Comment écrire des tests unitaires pour un script Bash de prod sans framework externe. Pattern de mocking, isolation des fonctions, assertions lisibles.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/notifications-email-commentaires-php-smtp</loc>
        <lastmod>2024-10-15</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/notifications-email-commentaires-php-smtp.jpg</image:loc>
            <image:title>Notifications email sur commentaire : PHPMailer sans Composer</image:title>
            <image:caption>Comment recevoir un email à chaque commentaire sur un blog PHP avec PHPMailer, Gmail SMTP et sans Composer. Installation manuelle, config sécurisée, pattern best-effort.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/blog-multilingue-php-sans-framework</loc>
        <lastmod>2024-09-24</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/blog-multilingue-php-sans-framework.jpg</image:loc>
            <image:title>Blog multilingue FR/EN en PHP pur : architecture sans framework ni base de données</image:title>
            <image:caption>Comment ajouter le support bilingue FR/EN à un blog PHP sans CMS : routing .htaccess, hreflang, toggle langue avec drapeaux SVG, posts.json restructuré — zéro bibliothèque i18n.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/seo-spa-vuejs-meta-tags-google</loc>
        <lastmod>2024-09-03</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/seo-spa-vuejs-meta-tags-google.jpg</image:loc>
            <image:title>SEO d&#039;une SPA Vue.js : comment j&#039;ai rendu mon app invisible pour Google (et comment j&#039;ai corrigé)</image:title>
            <image:caption>Retour d&#039;expérience sur le SEO de CitoyenNote, une SPA Vue.js 3 + Vite : meta tags dynamiques avec @unhead/vue, Open Graph, sitemap Symfony, JSON-LD Schema.org. Du constat choc à la correction complète.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/vue3-composition-api-vs-options-api</loc>
        <lastmod>2024-08-13</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/vue3-composition-api-vs-options-api.jpg</image:loc>
            <image:title>Vue 2 vs Vue 3 et Composition API vs Options API : comparaison complète</image:title>
            <image:caption>Différences clés entre Vue 2 et Vue 3 (réactif Proxy, tree-shaking, TypeScript), et comparaison honnête entre Composition API et Options API — points forts, points faibles, et quand choisir quoi.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/picocss-design-institutionnel-symfony</loc>
        <lastmod>2024-07-23</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/picocss-design-institutionnel-symfony.jpg</image:loc>
            <image:title>PicoCSS vs Bootstrap vs Tailwind : choisir son framework CSS</image:title>
            <image:caption>Pourquoi j&#039;ai choisi PicoCSS pour un projet Symfony avec un design institutionnel précis. Bootstrap surcharge trop, Tailwind demande trop. PicoCSS laisse le contrôle.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/docker-symfony-wsl2-postgresql</loc>
        <lastmod>2024-07-02</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/docker-symfony-wsl2-postgresql.jpg</image:loc>
            <image:title>Docker + Symfony + WSL2 : les 3 problèmes du premier jour</image:title>
            <image:caption>Port PostgreSQL en conflit, permissions Docker group qui ne prennent pas, services qui ne démarrent pas. Setup complet d&#039;un stack Symfony 7 + PostgreSQL + Redis sous WSL2.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/articles-similaires-php-json</loc>
        <lastmod>2024-06-14</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/articles-similaires-php-json.jpg</image:loc>
            <image:title>Articles similaires dynamiques en PHP sans base de données</image:title>
            <image:caption>Comment calculer automatiquement des articles similaires depuis un fichier JSON en PHP pur — scoring par tags et catégorie, zéro dépendance, zéro requête SQL.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/analytics-php-sans-cookies-rgpd</loc>
        <lastmod>2024-05-28</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/analytics-php-sans-cookies-rgpd.jpg</image:loc>
            <image:title>Analytics PHP sans cookies ni base de données — et sans violer le RGPD</image:title>
            <image:caption>Tracker les visites d&#039;un portfolio PHP sans Google Analytics, sans cookies, sans BDD et sans bandeau RGPD. IP anonymisée, log fichier protégé, dashboard maison — les choix de sécurité qui rendent ça légal.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/cache-busting-json-php</loc>
        <lastmod>2024-05-09</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/cache-busting-json-php.jpg</image:loc>
            <image:title>Cache-busting JSON en PHP avec filemtime</image:title>
            <image:caption>Comment forcer le navigateur à recharger un fichier JSON après une mise à jour, sans toucher à la config serveur ni activer mod_headers. Une ligne de PHP suffit.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/pagination-blog-vanilla-js</loc>
        <lastmod>2024-04-22</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/pagination-blog-vanilla-js.jpg</image:loc>
            <image:title>Pagination côté client en vanilla JS : simple, légère, zéro framework</image:title>
            <image:caption>Ajouter une pagination à un blog qui charge ses articles en JS depuis un JSON. Contrainte : aucun élément caché dans le DOM, aucun framework. 30 lignes suffisent.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/commentaires-sans-bdd-php</loc>
        <lastmod>2024-04-05</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/commentaires-sans-bdd-php.jpg</image:loc>
            <image:title>Ajouter des commentaires à un blog PHP sans base de données</image:title>
            <image:caption>Comment implémenter un système de commentaires en PHP pur avec stockage JSON, anti-spam honeypot, rate limiting et CSRF — sans aucune dépendance externe.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/blog/creer-un-blog-avec-claude-code</loc>
        <lastmod>2024-03-18</lastmod>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og/creer-un-blog-avec-claude-code.jpg</image:loc>
            <image:title>Créer un blog sans CMS avec Claude Code : retour d&#039;expérience</image:title>
            <image:caption>Comment j&#039;ai construit ce blog en 30 minutes avec Claude Code : architecture PHP/JSON sans base de données, SEO natif, et ce qui a failli merder.</image:caption>
        </image:image>
    </url>
    <url>
        <loc>https://www.web-developpeur.com/</loc>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/web-developpeur.jpg</image:loc>
            <image:title>Odilon Hugonnot — Développeur Full-Stack Senior</image:title>
            <image:caption>Photo de profil d'Odilon Hugonnot, développeur Full-Stack Golang/PHP/Symfony à Besançon.</image:caption>
        </image:image>
        <image:image>
            <image:loc>https://www.web-developpeur.com/assets/images/og-avatar.png</image:loc>
            <image:title>Odilon Hugonnot</image:title>
        </image:image>
    </url>
</urlset>
