Blog
Sur le développement web, la performance, les outils — et, de temps à autre, quelque chose de plus grand.
Quatre bugs tuaient la sélection de texte sur iOS — et chacun cachait le suivant
Un éditeur Lexical dans un drawer vaul fonctionnait partout sauf sur un vrai iPhone : les poignées de sélection refusaient de glisser, le défilement se verrouillait aux bords, la barre d'outils plongeait sous le clavier. Deviner ne réparait rien, car il n'y avait pas de coupable unique — ils étaient quatre, indépendants, et chacun masquait le suivant. Ce qui a marché : un banc de bissection — le même squelette avec un interrupteur par suspect, testé sur un appareil physique. Voici la chasse complète — le href qui empoisonne la sélection, les gestionnaires de drag de vaul, notre propre tap-focus, un conteneur qui bouge sous le doigt — plus l'autopsie du verrou de défilement et les trois écritures uniques de scrollTop qui ont rendu le rubber-band naturel, y compris la capture d'un swipe en plein rebond.
Une cascade d'agents : le terminal choisit celui qui fonctionne
Quand Claude est tombé en partie et que certains modèles ont cessé de répondre, j'ai voulu passer à Gemini — et j'ai découvert que mon repli était cassé depuis des mois. Voici comment en bâtir un qui tienne vraiment.
system-droid : un gardien qui vérifie et répare mes systèmes tout seul
Mes services locaux mouraient en silence : le brief du matin n'arrivait pas, les jetons expiraient, la sauvegarde se figeait. Alors j'ai construit un droïde sur launchd qui vérifie tout toutes les deux heures, répare via un agent Claude ce qui peut l'être sans risque, et ne m'écrit que lorsqu'il faut vraiment un humain.
Une page statique qui est secrètement un test A/B
Un test A/B est en général monté de sorte que la page tombe du CDN vers un rendu à chaque requête. Ce n'est pas une fatalité. Garde chaque variante entièrement statique et laisse un proxy (le middleware renommé de Next.js) résoudre l'affectation via une plateforme d'expérimentation, à partir d'un device id stable — puis réécris seulement quand le visiteur n'est pas dans le contrôle. L'URL ne change jamais, le CDN met toujours en cache, et le chemin courant ne coûte rien.
Déployer sur Vercel depuis la CI quand l'auteur du commit n'est pas membre de l'équipe
Déplace un dépôt dans une organisation GitHub et Vercel se met discrètement à bloquer tes déploiements : le commit « n'a pas pu être associé à un membre de l'équipe ». Voici comment je déploie plutôt depuis GitHub Actions avec la CLI Vercel — mes commits comptent toujours dans mon propre graphe GitHub, le tableau de bord montre toujours qui a poussé, et je ne paie pas un siège par contributeur.
Next.js Memory Leak : Fetch + Mode Standalone — 2 ans sans correctif
Next.js patche le fetch global et ajoute une couche de cache qui fuit à chaque requête. Sous Docker/K8s, cela provoque des crashes OOM toutes les quelques heures. Le bug existe depuis Next.js 14 et n'est toujours pas résolu dans 16.2.x.
Plusieurs comptes Claude Code sur un seul appareil
Comment utiliser deux (ou plus) comptes Claude Code en parallèle — personnel et entreprise — avec isolation complète grâce à une seule variable d'environnement.
Charger le contenu du blog à la demande dans SolidStart sans perdre le SSG
Ton blog livre sans doute le corps de chaque article dans un seul bundle — le mien avait grossi jusqu'à 2,88 Mo, téléchargé même sur la page d'index où tu n'as besoin que des titres. Voici comment j'ai découpé la prose de chaque article dans un chunk chargé à la demande, tout en gardant chaque page entièrement rendue côté serveur pour le SEO.
CRAFT : une méthode pour utiliser l'AI sans perdre son expertise
Nommer un problème sans proposer de solution ne fait que semer l'anxiété. Après l'article sur la déqualification par l'AI, voici l'ordonnance : CRAFT — cinq principes (Challenge First, Review Adversarially, Ask Why Not What, Friction on Purpose, Test Your Understanding) réunis sous un axiome unique : l'AI fait ce que vous maîtrisez déjà, vous faites ce que vous êtes encore en train d'apprendre. Une méthode pratique et mémorisable pour utiliser l'AI au quotidien sans éroder silencieusement vos compétences.
Un seul écouteur au lieu d'un composant client par bouton
Dès l'instant où vous ajoutez le suivi analytique d'un clic à un composant, celui-ci devient un composant client qui embarque du JavaScript. Multipliez ce geste à l'échelle d'un site et le suivi à lui seul fait gonfler votre bundle. Voici l'alternative, présente dans la plateforme depuis toujours : un unique écouteur délégué, des attributs de données déclaratifs, et des composants qui restent du pur HTML rendu côté serveur.
Un accordéon fluide avec zéro JavaScript
Tout le monde se rue sur un état React et un hook de mesure de hauteur pour construire un accordéon. Le navigateur en propose un nativement depuis des années — et depuis 2024, il s'anime à l'ouverture comme à la fermeture en CSS pur. Voici la technique complète : details[name], ::details-content, interpolate-size, et la propriété qui rend aussi la fermeture animée.
Interceptez une valeur tierce dès l'instant où elle arrive sur window
Un script que vous ne contrôlez pas écrit son résultat dans un global de window à un moment que vous ne pouvez pas prévoir. La plupart du code se lance dans une course avec un timeout ou gaspille le main thread en polling. Voici le trick de l'accessor property qui transforme l'écriture en événement — plus le getter que vous ne devez pas oublier, et comment substituer entièrement la valeur.
Ajuster le texte à son conteneur en CSS pur — sans JavaScript
Tout le monde écrit un hook JavaScript pour réduire le font-size jusqu'à ce que le texte tienne dans un conteneur. Voici une alternative pleinement fonctionnelle et sans JS, à base d'unités de container query, de clamp() et de césure selon la langue — y compris le piège de la cascade qui fait abandonner tant de gens.
next/dynamic ne vous sauvera pas : pourquoi les pages Next.js pilotées par un CMS embarquent chaque chunk
Nos pages Next.js pilotées par un CMS embarquaient les ~100 composants de section sur chaque route — malgré un usage exemplaire de next/dynamic. Nous avons épuisé tous les correctifs au niveau du bundler (import() direct, découpage des fichiers, config Turbopack, splitChunks de webpack) avant de trouver la vraie cause : la atteignabilité, pas le chunking. Un codegen au build + des rewrites ont réduit le first-load JS de 53%.
Je sors mes boards de Miro pour les ramener dans Obsidian
Le bouton Export de Miro te donne un PNG ou un PDF — une photo des données, pas les données. Si tes boards sont des load-bearing maps of thinking accumulées sur des années, leur place est dans Obsidian : editable, searchable, dans un vault local. Comment j'ai sorti les boards de Miro via la REST API et converti vers Excalidraw / Obsidian Canvas — en gardant positions, couleurs, fontes, curved connectors, mindmap nodes — et la leçon dépasse Miro : tout SaaS mérite un exit plan AVANT la première utilisation.
Claude Code Multi-Profile, v2 : une architecture XDG propre
Après un mois sur l'ancienne approche par alias, j'ai refait mon setup multi-profile Claude Code dans une structure compatible XDG sous ~/.config/claude-profiles/. La vraie raison n'était pas la propreté — c'était la découverte que ~/.claude.json est un fichier séparé à la racine du home dans lequel vivaient discrètement les serveurs MCP ajoutés via --scope user.
Le silence que l'AI a éteint
Vaut-il encore la peine d'apprendre à programmer si l'AI existe ? La réponse bruyante se trompe des deux côtés. Avec la base de preuves 2025–2026 (Nature, Anthropic, AI & Society), la question n'est pas "AI ou pas", mais quelles compétences céder à l'AI et lesquelles garder pour toi — et il y a une chose qui a vraiment changé : avant, la réalité te forçait à apprendre par friction, l'AI a éteint cette pression en silence.
Comment écrire des agents Claude Code qui ne te mentent pas
Deux règles pour construire des pipelines d'agents Claude Code fiables : un agent par spécialisation, et des commandes shell plutôt que des prompts partout où une réponse quantitative est en jeu.
Comment connecter Claude Desktop à Obsidian — Un parcours à travers 4 serveurs MCP
Une histoire réelle de recherche d'un moyen stable d'automatiser le refactoring du vault Obsidian via Claude. Ce qui a cassé, ce qui a fonctionné, et pourquoi VaultForge s'est avéré être la seule option fonctionnelle.
Les trous noirs comme univers récursifs : de la physique au sens de l'existence
Et si chaque trou noir était un Big Bang d'un nouvel univers ? Une exploration de la cosmologie récursive et de la clôture cognitive.
L'IA a tué le CMS — du moins pour les sites simples
Pourquoi les systèmes de gestion de contenu traditionnels deviennent inutiles pour les portfolios, blogs et pages d'atterrissage.
Comment connecter Perplexity AI à Obsidian via MCP — Prise de notes directe depuis le chat
Configurez Perplexity Desktop pour lire et écrire dans votre Obsidian vault en utilisant le serveur MCP filesystem. Recherchez sur le web et sauvegardez dans vos notes en une conversation.
Digest Quotidien AI avec Claude Code CLI et Obsidian — Zéro Dépendance
Comment j'ai construit un agent de recherche d'actualités quotidien avec un script bash de 6 lignes, le mode headless de Claude Code et macOS launchd.
Mode sombre Next.js sans flash ni avertissements React 19
Comment remplacer next-themes par Zustand + useServerInsertedHTML pour un mode sombre sans clignotement dans Next.js 15+.
Comment j'ai éliminé 94 fichiers CSS bloquant le rendu dans Next.js 16 avec une fonctionnalité Turbopack peu documentée
Après des jours à essayer chaque approche — de experimental.inlineCss aux hacks MutationObserver — j'ai découvert les Turbopack Import Attributes qui résolvent le problème de CSS bloquant le rendu dans Next.js App Router.