{"pageProps":{"locale":{"code":"fr","domain":"frenchstack.fr","lang":"fr-FR","json":{"TRANSLATE":"Traduire en","EN":"Anglais","FR":"Français","NO_TRANSLATION_AVAILABLE":"Aucune traduction disponible","PROFILE_OF":"Profil de","FILTER_BY_TAG":"Filtrer par tag","REMOVE_FILTER":"Supprimer le filtre","RESULT":"Résulat","RESULTS":"Résulats","FORM_CONTACT_SUPPORT":"Support","FORM_CONTACT_SALES":"Devis","FORM_CONTACT_BUGS":"Rapport de bug","FORM_LOADING":"Chargement","FORM_SEND":"Envoyer","FORM_VERIFY":"Vérifier","FORM_NAME":"Nom","FORM_TOPIC":"Sujet","FORM_PHONE":"Téléphone","FORM_EMAIL":"Email","FORM_MESSAGE":"Message","FORM_DOMAIN_PLACEHOLDER":"exemple.fr","FORM_DOMAIN_AVAILABLE":"Félicitations, le domaine <span data-selector='domain'></span> est disponible !","FORM_DOMAIN_TAKEN":"Désolé, le domaine <span data-selector='domain'></span> est pris.","SUBSCRIBE":"S'abonner","SUCCESS_CONTACT":"Votre message a bien été envoyé ! Nous vous répondrons dans les plus brefs délais.","SOMETING_WENT_WRONG":"Oops, une erreur s'est produite. Veuillez réessayer ultérieurement.","PERFORMANCE":"Performance","ACCESSIBILITY":"Accessibilité","BEST_PRACTICES":"Bonnes pratiques","SEO":"Référencement","MOBILE":"Mobile","TABLET":"Tablette","DESKTOP":"Ordinateur","VISITORS":"Visiteurs","ENGAGEMENT":"Engagement","CONVERSIONS":"Conversions","JAN":"Janv","FEB":"Févr","MAR":"Mars","APR":"Avr","MAY":"Mai","JUN":"Juin","JUL":"Juil","AUG":"Août","SEP":"Sept","OCT":"Oct","NOV":"Nov","DEC":"Déc","METHOD_PHONE":"Téléphone","METHOD_EMAIL":"Email","FOOTER_TAGLINE":"Nous créons des expériences numériques uniques pour les marques et les entreprises."},"subdomains":{"blog":"blog","clients":"references","videos":"videos","services":"services"},"ogSection":"Technologie"},"slugs":["fr","blog","fallow-codebase-intelligence-typescript"],"component":"article","article":{"id":"content/articles/fr/fallow-codebase-intelligence-typescript.mdx","heroSection":{"heroTitle":"Fallow : la qualité de code au rythme des agents IA","heroSubtitle":"Retour d'expérience sur un garde-fou déterministe","heroBadge":"","heroColoredWords":"1","heroBreakTitle":"","heroDescription":{"type":"root","children":[{"type":"p","children":[{"type":"text","text":"Comment un analyseur statique en Rust guide nos agents IA pour transformer de longues fonctions en petits concepts clairs, nommés et faciles à faire évoluer."}]}]},"heroSubtitleIsInline":false,"heroHasBackground":false,"heroImage":"/images/code-laptop.png","heroVideoBackground":"","heroStyle":{"heroBg":"","heroMaxWidth":"","heroMs":"","heroTitleMb":"","heroTitleColor":"","heroContentBg":"","heroContentAlign":"","heroContentBlur":"","heroBlurImage":"","navbarBg":"","navbarBorderColor":"","navbarLinkActive":"","navbarLinkHover":""},"imageAlt":"code laptop","imageWidth":5184,"imageHeight":3456},"seoSection":{"metaTitle":"Fallow et agents IA : retour d'expérience sur la qualité de code","metaDescription":"Retour d'expérience : Fallow, analyseur statique TypeScript en Rust, sert de garde-fou à nos agents IA et les guide pour découper les fonctions complexes en concepts clairs et bien nommés.","metaTags":"Fallow, TypeScript, agent IA, qualité de code, complexité cognitive, refactoring, Claude Code, Codex, analyse statique","socialImageWidth":0,"socialImageHeight":0},"heroUpdatedAt":"2026-10-17T18:00:00.000Z","localeCode":"fr","slug":"fallow-codebase-intelligence-typescript","url":"/fr/blog/fallow-codebase-intelligence-typescript","ogId":"fallow-codebase-intelligence-typescript-blog-fr","ogImagePath":"/og/fallow-codebase-intelligence-typescript-blog-fr.png","type":"Article","title":"Fallow : la qualité de code au rythme des agents IA","subtitle":"Retour d'expérience sur un garde-fou déterministe pour TypeScript","browserUrl":"","textPreview":{"type":"root","children":[{"type":"p","children":[{"type":"text","text":"Fallow mesure la complexité, le code mort et la duplication de nos projets TypeScript. Branché sur nos agents IA, il transforme chaque commit en occasion de découper une fonction trop longue en petits concepts bien nommés."}]}]},"subdomainKey":"blog","subdomain":"blog","draft":true,"logoAlt":"","logoWidth":0,"logoHeight":0,"icon":"code","body":{"type":"root","children":[{"type":"p","children":[{"type":"text","text":"Les agents IA de développement écrivent désormais une large part du code de nos projets. Ils livrent vite et bien, mais ils ont une tendance naturelle : "},{"type":"text","text":"enrichir la fonction existante","bold":true},{"type":"text","text":" plutôt que de créer un nouveau concept. Au fil des demandes, une fonction de vingt lignes en compte cent, et son nom ne décrit plus qu'une partie de ce qu'elle fait."}]},{"type":"p","children":[{"type":"text","text":"Cet article présente la manière dont nous utilisons "},{"type":"text","text":"Fallow","bold":true},{"type":"text","text":" avec nos agents pour garder une base de code lisible, et ce que cet outil a changé dans la forme même du code produit."}]},{"type":"hr","children":[{"type":"text","text":""}]},{"type":"h2","children":[{"type":"text","text":"1. Fallow en bref"}]},{"type":"p","children":[{"type":"a","url":"https://fallow.tools","title":"Fallow - Codebase intelligence","children":[{"type":"text","text":"Fallow"}]},{"type":"text","text":" est un analyseur statique pour "},{"type":"text","text":"TypeScript et JavaScript","bold":true},{"type":"text","text":", distribué sous la forme d'un binaire Rust unique. Il construit un graphe complet du dépôt (modules, exports, dépendances, fonctions) et en tire plusieurs analyses complémentaires :"}]},{"type":"ul","children":[{"type":"li","children":[{"type":"lic","children":[{"type":"text","text":"Complexité","bold":true},{"type":"text","text":" : Mesure de la complexité cyclomatique et cognitive de chaque fonction, de sa taille et d'un score de santé global sur 100."}]}]},{"type":"li","children":[{"type":"lic","children":[{"type":"text","text":"Code mort","bold":true},{"type":"text","text":" : Détection des fichiers, exports, types et dépendances que plus rien n'utilise."}]}]},{"type":"li","children":[{"type":"lic","children":[{"type":"text","text":"Duplication","bold":true},{"type":"text","text":" : Repérage des blocs copiés entre fichiers, y compris dans le CSS et les composants Vue, Svelte ou Astro."}]}]},{"type":"li","children":[{"type":"lic","children":[{"type":"text","text":"Architecture","bold":true},{"type":"text","text":" : Contrôle des frontières entre couches et des dépendances circulaires."}]}]}]},{"type":"p","children":[{"type":"text","text":"Le terminal ci-dessous montre une analyse du code mort sur le projet de démonstration de Fallow :"}]},{"type":"p","children":[{"type":"img","url":"/images/fallow-demo-code-mort.gif","caption":"1522x957","children":[{"type":"text","text":""}],"alt":"Fallow Demo Code Mort"}]},{"type":"mdxJsxFlowElement","name":"callout","children":[{"type":"text","text":""}],"props":{"title":"Un analyseur sans IA","variant":"info","content":{"type":"root","children":[{"type":"p","children":[{"type":"text","text":"Fallow n'embarque "},{"type":"text","text":"aucun modèle de langage","bold":true},{"type":"text","text":" dans son analyseur : la même entrée produit toujours le même résultat. Il ne requiert ni compilateur TypeScript ni runtime Node.js, et analyse le monorepo de Next.js ("},{"type":"text","text":"20 558 fichiers","bold":true},{"type":"text","text":") en "},{"type":"text","text":"2,95 secondes","bold":true},{"type":"text","text":" selon les mesures publiées par le projet."}]},{"type":"p","children":[{"type":"text","text":"C'est précisément ce déterminisme qui en fait un bon partenaire pour un agent IA : l'agent propose, Fallow mesure."}]}]}}},{"type":"hr","children":[{"type":"text","text":""}]},{"type":"h2","children":[{"type":"text","text":"2. Contexte : du code écrit plus vite qu'il n'est relu"}]},{"type":"p","children":[{"type":"text","text":"Le besoin d'un garde-fou automatique est né de la convergence de trois constats sur nos projets internes :"}]},{"type":"ul","children":[{"type":"li","children":[{"type":"lic","children":[{"type":"text","text":"Un volume de code en forte hausse","bold":true},{"type":"text","text":" : Les agents (Claude Code, Codex) produisent en une session ce qui demandait auparavant plusieurs jours de développement."}]}]},{"type":"li","children":[{"type":"lic","children":[{"type":"text","text":"Une relecture moins exhaustive","bold":true},{"type":"text","text":" : À ce rythme, chaque ligne n'est plus relue une à une, et une fonction peut grossir sans que personne ne s'en aperçoive."}]}]},{"type":"li","children":[{"type":"lic","children":[{"type":"text","text":"Des consignes de style difficiles à faire respecter","bold":true},{"type":"text","text":" : Demander à un agent « d'écrire du code simple » reste une intention ; sans mesure, il n'a aucun moyen de savoir s'il l'a atteinte."}]}]}]},{"type":"p","children":[{"type":"text","text":"Fallow devient le garde-fou de chaque commit."}]},{"type":"p","children":[{"type":"text","text":"La règle est inscrite dans le fichier "},{"type":"text","text":"AGENTS.md","code":true},{"type":"text","text":" lu par nos agents au début de chaque session : sur une application TypeScript, "},{"type":"text","text":"lancer ","bold":true},{"type":"text","text":"fallow","code":true,"bold":true},{"type":"text","text":" avant chaque commit et nettoyer le code non conforme","bold":true},{"type":"text","text":". L'agent ne rend la main que lorsque l'analyse est verte."}]},{"type":"hr","children":[{"type":"text","text":""}]},{"type":"h2","children":[{"type":"text","text":"3. La boucle de travail avec l'agent"}]},{"type":"p","children":[{"type":"text","text":"L'intégration repose sur une boucle courte, entièrement automatisée, qui s'exécute à la fin de chaque tâche :"}]},{"type":"ol","children":[{"type":"li","children":[{"type":"lic","children":[{"type":"text","text":"Développement","bold":true},{"type":"text","text":" : L'agent implémente la fonctionnalité demandée, sans contrainte particulière."}]}]},{"type":"li","children":[{"type":"lic","children":[{"type":"text","text":"Mesure","bold":true},{"type":"text","text":" : Il lance Fallow, qui signale chaque fonction au-delà des seuils de complexité, chaque export devenu inutile et chaque bloc dupliqué."}]}]},{"type":"li","children":[{"type":"lic","children":[{"type":"text","text":"Découpage","bold":true},{"type":"text","text":" : Il traite les signalements, en commençant par les fonctions classées critiques."}]}]},{"type":"li","children":[{"type":"lic","children":[{"type":"text","text":"Validation","bold":true},{"type":"text","text":" : Il relance l'analyse jusqu'à obtenir un résultat vert, puis il commite."}]}]}]},{"type":"p","children":[{"type":"text","text":"Fallow fournit tout ce qu'il faut pour cette boucle. La commande "},{"type":"text","text":"npx fallow agent install","code":true},{"type":"text","text":" configure les agents détectés (Claude Code, Codex, Cursor), et la sortie JSON décrit chaque problème avec les actions possibles :"}]},{"type":"code_block","lang":"bash","value":"# Configurer les agents du projet (skills, serveur MCP, garde-fou sur git commit)\nnpx fallow agent install\n\n# Ce que l'agent lance avant chaque commit\nnpx fallow health --format json --quiet\n\n# Prouver qu'un export est inutilisé avant de le supprimer\nnpx fallow dead-code --trace src/api.ts:client","children":[{"type":"text","text":""}]},{"type":"p","children":[{"type":"text","text":"Les seuils utilisés sont ceux de Fallow par défaut : "},{"type":"text","text":"20","bold":true},{"type":"text","text":" de complexité cyclomatique, "},{"type":"text","text":"15","bold":true},{"type":"text","text":" de complexité cognitive et "},{"type":"text","text":"60 lignes","bold":true},{"type":"text","text":" par fonction."}]},{"type":"hr","children":[{"type":"text","text":""}]},{"type":"h2","children":[{"type":"text","text":"4. Du monolithe aux petits concepts nommés"}]},{"type":"p","children":[{"type":"text","text":"C'est l'effet le plus intéressant de cette boucle, et celui que nous n'attendions pas. Pour faire passer une fonction sous les seuils, l'agent ne se contente pas de déplacer du code : il "},{"type":"text","text":"identifie les responsabilités","bold":true},{"type":"text","text":" mélangées dans la fonction, extrait chacune d'elles et "},{"type":"text","text":"lui donne un nom","bold":true},{"type":"text","text":"."}]},{"type":"p","children":[{"type":"text","text":"L'exemple ci-dessous provient de notre gestionnaire de skills, une application interne en TypeScript. La fonction "},{"type":"text","text":"lintRef","code":true},{"type":"text","text":" vérifiait la conformité d'un fichier, et chaque nouvelle règle y avait ajouté une branche :"}]},{"type":"mdxJsxFlowElement","name":"functionSplit","children":[{"type":"text","text":""}],"props":{"name":"lintRef","file":"server/modules/diagnostics/rules.ts","stats":"95 lignes · complexité cyclomatique 42 · complexité cognitive 83","parts":[{"name":"entryIssues","role":"Fichier d'entrée du skill"},{"name":"frontmatterIssues","role":"En-tête YAML : nom et format"},{"name":"descriptionIssues","role":"Description : présence, longueur, déclencheur"},{"name":"referenceIssues","role":"Fichiers de référence orphelins"},{"name":"markdownIssues","role":"Liens Markdown morts"},{"name":"secretIssues","role":"Secrets laissés dans le texte"}],"result":"lintRef devient un sommaire de 15 lignes qui appelle six vérifications nommées."}},{"type":"p","children":[{"type":"text","text":"Après le découpage, la fonction d'origine se lit comme une table des matières. Chaque ligne annonce ce qu'elle vérifie, et le détail se trouve dans une fonction dont le nom suffit à comprendre le rôle :"}]},{"type":"code_block","lang":"typescript","value":"export function lintRef(view: View, ref: FileRef): LintIssue[] {\n  const text = view.text(ref);\n  if (text === undefined) return [];\n  const skill = view.skills.find((s) => s.name === skillOf(ref));\n  const isEntry = !!skill && skill.entryRef === ref;\n  const md = ref.endsWith('.md');\n  const out: LintIssue[] = [];\n\n  if (ref === AGENTS && text.trim() === '') out.push(issue('AG001', ref, null, 'AGENTS.md est vide.'));\n  if (skill && isEntry) out.push(...entryIssues(view, ref, text, skill));\n  if (skill) out.push(...referenceIssues(view, ref, text, skill, md));\n  if (md) out.push(...markdownIssues(view, ref, text, isEntry));\n  out.push(...secretIssues(ref, text));\n  return out;\n}","children":[{"type":"text","text":""}]},{"type":"p","children":[{"type":"text","text":"Le même mouvement se répète sur des cas plus algorithmiques. La fonction "},{"type":"text","text":"lineDiff","code":true},{"type":"text","text":", qui calcule la différence entre deux versions d'un texte, mêlait le calcul et la mise en forme :"}]},{"type":"mdxJsxFlowElement","name":"functionSplit","children":[{"type":"text","text":""}],"props":{"name":"lineDiff","file":"web/src/features/editor/diff.ts","stats":"65 lignes · complexité cyclomatique 33 · complexité cognitive 52","parts":[{"name":"diffMiddle","role":"Calcul des lignes ajoutées et supprimées"},{"name":"toHunks","role":"Regroupement en blocs avec 3 lignes de contexte"}],"result":"lineDiff conserve sa signature publique et passe à 16 lignes."}},{"type":"p","children":[{"type":"text","text":"Sur les composants React, le découpage fait émerger des concepts visuels. Dans la carte du gestionnaire de skills, le composant "},{"type":"text","text":"Star","code":true},{"type":"text","text":" calculait en ligne la position de son libellé et dessinait une pastille d'erreur ; il délègue désormais à "},{"type":"text","text":"labelPos","code":true},{"type":"text","text":" et à un nouveau composant "},{"type":"text","text":"BrokenBadge","code":true},{"type":"text","text":"."}]},{"type":"mdxJsxFlowElement","name":"callout","children":[{"type":"text","text":""}],"props":{"title":"Pourquoi le nommage s'améliore","variant":"success","content":{"type":"root","children":[{"type":"p","children":[{"type":"text","text":"Une fonction de cent lignes peut porter un nom vague, car personne ne lit son nom pour savoir ce qu'elle fait. Une fonction de quinze lignes, elle, "},{"type":"text","text":"doit","bold":true},{"type":"text","text":" être nommée avec précision, sans quoi l'appel devient illisible."}]},{"type":"p","children":[{"type":"text","text":"En imposant des fonctions courtes, Fallow oblige l'agent à nommer chaque responsabilité : "},{"type":"text","text":"secretIssues","code":true},{"type":"text","text":", "},{"type":"text","text":"toHunks","code":true},{"type":"text","text":", "},{"type":"text","text":"BrokenBadge","code":true},{"type":"text","text":". Le code gagne un "},{"type":"text","text":"vocabulaire","bold":true},{"type":"text","text":", et ce vocabulaire documente le projet mieux qu'un commentaire."}]}]}}},{"type":"hr","children":[{"type":"text","text":""}]},{"type":"h2","children":[{"type":"text","text":"5. Les chiffres d'une semaine de nettoyage"}]},{"type":"p","children":[{"type":"text","text":"Le gestionnaire de skills a été entièrement remis en conformité entre le "},{"type":"text","text":"9 et le 14 octobre 2026","bold":true},{"type":"text","text":", en deux sessions de travail avec l'agent. Les indicateurs ci-dessous comparent l'analyse Fallow avant le premier découpage et l'analyse actuelle :"}]},{"type":"mdxJsxFlowElement","name":"beforeAfter","children":[{"type":"text","text":""}],"props":{"title":"Gestionnaire de skills — avant et après","items":[{"label":"Score de santé Fallow","before":"78 · B","after":"92 · A","detail":"Score global sur 100"},{"label":"Fonctions trop complexes ou trop longues","before":"25","after":"0","detail":"Au-delà de 20 cyclomatique, 15 cognitive ou 60 lignes"},{"label":"Fonctions analysées","before":"823","after":"1 107","detail":"Plus de fonctions, chacune plus courte"},{"label":"Complexité cognitive maximale","before":"83","after":"≤ 15","detail":"lintRef avant découpage, seuil Fallow après"},{"label":"Complexité cyclomatique moyenne","before":"2,5","after":"2,3","detail":"Par fonction, sur l'ensemble du projet"},{"label":"Signalements Fallow au total","before":"97","after":"0","detail":"Dont 72 liés au score CRAP, voir les points d'attention"}],"source":"Mesures relevées avec fallow health le 17 octobre 2026. Analyse actuelle : 111 fichiers et 9 074 lignes en 0,24 seconde, sans code mort ni duplication."}},{"type":"p","children":[{"type":"text","text":"Le nombre de fonctions augmente de "},{"type":"text","text":"35 %","bold":true},{"type":"text","text":" quand le volume de code progresse de "},{"type":"text","text":"37 %","bold":true},{"type":"text","text":" : les fonctionnalités nouvelles ont été absorbées sans qu'aucune fonction ne dépasse les seuils, chaque ajout prenant la forme d'un nouveau concept plutôt que d'une branche supplémentaire."}]},{"type":"hr","children":[{"type":"text","text":""}]},{"type":"h2","children":[{"type":"text","text":"6. Ce que cela change au quotidien"}]},{"type":"p","children":[{"type":"text","text":"Face à ces résultats, Fallow est désormais actif sur l'ensemble de nos applications TypeScript. Ses effets se ressentent à chaque étape du travail :"}]},{"type":"ul","children":[{"type":"li","children":[{"type":"lic","children":[{"type":"text","text":"Lecture","bold":true},{"type":"text","text":" : Une fonction se comprend en lisant les noms des fonctions qu'elle appelle, sans plonger dans leur détail."}]}]},{"type":"li","children":[{"type":"lic","children":[{"type":"text","text":"Maintenance","bold":true},{"type":"text","text":" : Une correction touche une petite fonction isolée, dont le nom indique immédiatement si elle est concernée."}]}]},{"type":"li","children":[{"type":"lic","children":[{"type":"text","text":"Évolution","bold":true},{"type":"text","text":" : Une nouvelle règle ou un nouveau cas prend la forme d'une nouvelle fonction nommée, au lieu d'une branche supplémentaire dans une fonction déjà chargée."}]}]},{"type":"li","children":[{"type":"lic","children":[{"type":"text","text":"Revue","bold":true},{"type":"text","text":" : Les diffs sont plus courts et plus lisibles, car chaque responsabilité vit à un seul endroit."}]}]},{"type":"li","children":[{"type":"lic","children":[{"type":"text","text":"Contexte des agents","bold":true},{"type":"text","text":" : Un agent qui reprend le projet lit moins de code pour trouver ce qu'il cherche, les noms le guidant directement vers le bon fichier."}]}]}]},{"type":"mdxJsxFlowElement","name":"callout","children":[{"type":"text","text":""}],"props":{"title":"Points d'attention","variant":"warning","content":{"type":"root","children":[{"type":"ul","children":[{"type":"li","children":[{"type":"lic","children":[{"type":"text","text":"Configurer les points d'entrée","bold":true},{"type":"text","text":" : Sans déclaration des fichiers d'entrée et des dépendances chargées dynamiquement, Fallow signale à tort du code utilisé comme mort."}]}]},{"type":"li","children":[{"type":"lic","children":[{"type":"text","text":"Assumer certains seuils","bold":true},{"type":"text","text":" : Le score CRAP croise complexité et couverture de tests ; tant que la couverture n'est pas mesurée, son seuil est volontairement relevé dans la configuration plutôt que contourné dans le code."}]}]},{"type":"li","children":[{"type":"lic","children":[{"type":"text","text":"Relire les noms","bold":true},{"type":"text","text":" : L'agent découpe bien, mais un nom reste un choix de conception ; un coup d'œil humain sur les nouveaux noms garde la cohérence du vocabulaire."}]}]},{"type":"li","children":[{"type":"lic","children":[{"type":"text","text":"Adopter progressivement","bold":true},{"type":"text","text":" : Sur un projet existant, "},{"type":"text","text":"fallow audit","code":true},{"type":"text","text":" ne bloque que les problèmes introduits par la modification en cours, ce qui évite d'avoir à tout corriger d'un coup."}]}]}]}]}}},{"type":"hr","children":[{"type":"text","text":""}]},{"type":"h2","children":[{"type":"text","text":"7. Conclusion"}]},{"type":"p","children":[{"type":"text","text":"Fallow n'écrit pas le code à la place de l'agent : il lui fixe un cadre mesurable, et ce cadre suffit à changer la forme du code produit. Les longues fonctions deviennent des sommaires, les responsabilités cachées deviennent des concepts nommés, et le projet reste lisible pour l'humain comme pour l'agent suivant."}]},{"type":"p","children":[{"type":"text","text":"Associé à nos agents IA, il nous permet de livrer vite tout en gardant un code que nous savons "},{"type":"text","text":"lire, maintenir et faire évoluer","bold":true},{"type":"text","text":"."}]},{"type":"mdxJsxFlowElement","name":"buttons","children":[{"type":"text","text":""}],"props":{"buttons":[{"icon":"gitHub","label":"Fallow sur GitHub","link":"https://github.com/fallow-rs/fallow","style":"primary"},{"icon":"codeFile","label":"Documentation","link":"https://fallow.tools/docs","style":"light"}]}}]},"dateCreate":"2026-08-26T09:00:00.000Z","dateUpdate":"2026-10-17T18:00:00.000Z","author":{"id":"content/authors/fr/nicolas-roehm-bettcher.mdx","heroSection":{"heroTitle":"Nicolas Roehm","heroSubtitle":"Ingénieur logiciel","heroBadge":"","heroColoredWords":"","heroBreakTitle":"","heroDescription":{"type":"root","children":[{"type":"p","children":[{"type":"text","text":"Fondateur de French Stack, je conçois des solutions informatiques complètes."}]},{"type":"p","children":[{"type":"text","text":"Développeur full-stack, j'interviens principalement sur des projets frontend avec Angular, React ou Vue."}]},{"type":"p","children":[{"type":"text","text":"Passionné de design, voici quelques-unes de mes "},{"type":"a","url":"https://www.artstation.com/nicolas-roehm","title":"ArtStation - Nicolas Roehm","children":[{"type":"text","text":"conceptions graphiques"}]},{"type":"text","text":"."}]},{"type":"mdxJsxFlowElement","name":"socialLinks","children":[{"type":"text","text":""}],"props":{"links":[{"icon":"gitHub","link":"https://github.com/NicolasRoehm"},{"icon":"stackOverflow","link":"https://stackoverflow.com/users/7462178/nicolas-roehm?tab=profile"},{"icon":"linkedIn","link":"https://fr.linkedin.com/in/nicolas-roehm-bettcher"}]}}]},"heroSubtitleIsInline":true,"heroHasBackground":false,"heroImage":"/images/nicolas-roehm-bettcher.png","heroVideoBackground":"","heroStyle":{"heroBg":"linear-gradient(312deg, #0800ff 0%, #4300ff00 70%)","heroMaxWidth":"","heroMs":"25%","heroTitleMb":"0.5rem","heroTitleColor":"","heroContentBg":"","heroContentAlign":"","heroContentBlur":"","heroBlurImage":"","navbarBg":"#fff0","navbarBorderColor":"","navbarLinkActive":"#6785be","navbarLinkHover":"#6785be"},"imageAlt":"nicolas roehm bettcher","imageWidth":0,"imageHeight":0},"seoSection":{"metaTitle":"Nicolas Roehm, Ingénieur logiciel","metaDescription":"Passionné d'informatique, je conçois des sites web dans leur intégralité : design, developpement, référencement, e-reputation, e-mailling, hébergement","metaTags":"Nicolas Roehm, Ingénieur logiciel, web, mobile, site internet","socialImageWidth":0,"socialImageHeight":0},"heroUpdatedAt":"2024-12-09T00:38:50.025Z","localeCode":"fr","slug":"nicolas-roehm-bettcher","url":"/fr/nicolas-roehm-bettcher","ogId":"nicolas-roehm-bettcher-fr","ogImagePath":"/og/nicolas-roehm-bettcher-fr.png","type":"Author","title":"Nicolas Roehm-Bettcher","avatar":"/images/nicolas-roehm-avatar.png","lname":"Roehm","fname":"Nicolas","name":"Nicolas Roehm","translations":[{"localeCode":"en","title":"Nicolas Roehm-Bettcher","slug":"nicolas-roehm-bettcher","url":"/en/nicolas-roehm-bettcher"}]},"translations":[],"tags":[{"id":"content/tags/fr/typescript.mdx","localeCode":"fr","title":"TypeScript","slug":"typescript","url":"/fr/blog/typescript"}]},"page":{"id":"content/subdomains/fr/blog.mdx","heroSection":{"heroTitle":"Actualités digitales","heroSubtitle":"","heroBadge":"","heroColoredWords":"2","heroBreakTitle":"","heroShape":"shiny","heroGradient":"business-gradient","heroDescription":{"type":"root","children":[{"type":"p","children":[{"type":"text","text":"Explorez les dernières avancées en "},{"type":"text","text":"design web","bold":true},{"type":"text","text":", "},{"type":"text","text":"SEO","bold":true},{"type":"text","text":", "},{"type":"text","text":"marketing digital","bold":true},{"type":"text","text":", "},{"type":"text","text":"développement web","bold":true},{"type":"text","text":" et bien plus."}]},{"type":"p","children":[{"type":"text","text":"Nos articles décryptent les "},{"type":"text","text":"technologies innovantes","bold":true},{"type":"text","text":" et les "},{"type":"text","text":"standards du web","bold":true},{"type":"text","text":" qui façonnent l'"},{"type":"text","text":"avenir du numérique","bold":true},{"type":"text","text":"."}]},{"type":"p","children":[{"type":"text","text":"Restez connecté, suivez-nous sur les "},{"type":"text","text":"réseaux sociaux","bold":true},{"type":"text","text":"."}]}]},"heroSubtitleIsInline":false,"heroHasBackground":false,"heroImage":"/images/blog-news-web.jpg","heroVideoBackground":"","heroStyle":{"heroBg":"linear-gradient(353deg, rgba(255,129,0,0.64) 0%, #0018ffe0 120%)","heroMaxWidth":"","heroMs":"","heroTitleMb":"","heroTitleColor":"","heroContentBg":"","heroContentAlign":"","heroContentBlur":"","heroBlurImage":"","navbarBg":"","navbarBorderColor":"","navbarLinkActive":"","navbarLinkHover":""},"imageAlt":"blog news web","imageWidth":0,"imageHeight":0},"seoSection":{"metaTitle":"Actualité numérique","metaDescription":"Magazine en ligne pour apprendre le Web, trouver des ressources, parcourir les tendances et déguster un café chaud","metaTags":"inspiration web, tutoriels développement web, tendances web","socialImageWidth":0,"socialImageHeight":0},"heroUpdatedAt":"2024-12-12T18:23:51.381Z","localeCode":"fr","slug":"blog","url":"/fr/blog","ogId":"blog-fr","ogImagePath":"/og/blog-fr.png","type":"Subdomain","title":"Blog","subdomainKey":"blog","subdomain":"blog","translations":[{"localeCode":"en","title":"Blog","slug":"blog","url":"/en/blog"}],"canShare":true,"canComment":true,"hasAuthor":true,"tagsInPanel":true,"cardContainer":"col-md-6","cardTemplate":"default"},"neighbors":[null,null],"global":{"id":"content/global/fr/settings.json","localeCode":"fr","header":{"nav":[{"href":"index","label":"Accueil"},{"href":"blog","label":"Blog"},{"href":"videos","label":"Vidéos"},{"href":"services","label":"Prestations"},{"href":"references","label":"Références"},{"href":"a-propos","label":"À propos"},{"href":"contact","label":"Contact"}]},"footer":{"social":[{"website":"x","account":"RoehmNicolas"},{"website":"instagram","account":"roehm.nicolas"},{"website":"facebook","account":"thefrenchstack"},{"website":"youtube","account":"@frenchstack"}],"hasSocial":true,"nav":[{"title":"L'agence","links":[{"href":"references","label":"Références"},{"href":"a-propos","label":"À propos"},{"href":"contact","label":"Contact"}]},{"title":"Prestations","links":[{"href":"services/creation-graphique","label":"Graphisme"},{"href":"services/developpement-web-mobile","label":"Développement"},{"href":"services/marketing-web","label":"Marketing"},{"href":"services/formation-informatique","label":"Formation"}]},{"title":"Blog","links":[{"href":"blog/angular","label":"Angular"},{"href":"blog/jquery","label":"jQuery"}]},{"title":"Vidéos","links":[{"href":"videos/marketing-audiovisuel","label":"Marketing audiovisuel"}]}]},"bottom":{"dateCreate":"2015-12-27T05:55:00.000Z","nav":[{"href":"mentions-legales","label":"Mentions légales"},{"href":"politique-de-confidentialite","label":"Politique de confidentialité"}],"hasLinks":true},"contactInfo":{"contactMethods":[{"id":"email","icon":"envelope","value":"frenchstack@gmail.com"},{"id":"phone","icon":"phone","value":"0651570751"}]}}},"__N_SSG":true}