{
  "identite": {
    "nom": "Simon Place",
    "fonction": "AI-Augmented Developer · Salesforce Marketing Cloud · React / Node.js",
    "statut": "Disponible immédiatement — freelance, CDI selon le projet",
    "lieu": "Lille — Hauts-de-France · Paris 2 j de télétravail / sem.",
    "email": "splace42@gmail.com",
    "linkedin": "https://www.linkedin.com/in/simon-place",
    "photo": "assets/photo.jpg",
    "rendezVous": "https://calendar.app.google/c9HmKTqF4okryvtNA",
    "accroches": [
      "AI-Augmented Developer",
      "Expert Salesforce Marketing Cloud",
      "Développeur React / Next.js · Node.js",
      "Freelance · Lille et Paris"
    ]
  },
  "chiffres": [
    {
      "valeur": "11",
      "unite": "ans",
      "libelle": "d'expérience"
    },
    {
      "valeur": "10+",
      "unite": "ans",
      "libelle": "de React et Node.js"
    },
    {
      "valeur": "4",
      "unite": "",
      "libelle": "grands comptes : Decathlon, TotalEnergies, leboncoin, HelloWork"
    }
  ],
  "profil": [
    "<strong>Expert Salesforce Marketing Cloud</strong> chez <strong>Decathlon</strong> : je pilote les campagnes CRM internationales du groupe (AMPScript, SQL, Journey Builder, Automation Studio) et je développe sur l'<strong>API SOAP de SFMC</strong> les outils internes qui industrialisent la production des emails.",
    "Ma différence : <strong>plus de 10 ans de React / Next.js et Node.js</strong> (leboncoin, WayKonect, HelloWork). Là où SFMC s'arrête, je code la suite.",
    "Je me positionne en <strong>AI-Augmented Developer</strong>. Le métier se déplace : on n’écrit plus seulement du code, on conçoit des systèmes où un <strong>agent</strong>, un <strong>modèle</strong>, une <strong>source de données</strong> et une <strong>API métier</strong> travaillent ensemble. J’en construis chez Decathlon et pour moi (agent vocal, <strong>knowledge graph</strong> branché en MCP, extraction par LLM), avec les mêmes garde-fous qu’en production : tests, revue, secrets qui ne quittent pas le serveur, traçabilité.",
    "<strong>Je refuse toute PR sans tests.</strong> Tests unitaires et d'intégration dès la première ligne, Clean Code, Conventional Commits ; je durcis les pipelines CI/CD pour bloquer sur main tout code non testé.",
    "J’apprends vite : <strong>Java / Spring Boot</strong> et <strong>Vue / Nuxt</strong> en projet perso, avec une architecture clean et du code revu."
  ],
  "niveaux": [
    {
      "id": "decouverte",
      "libelle": "Découverte",
      "points": 1,
      "teinte": "#a78bfa"
    },
    {
      "id": "notions",
      "libelle": "Notions",
      "points": 2,
      "teinte": "#38bdf8"
    },
    {
      "id": "competent",
      "libelle": "Compétent",
      "points": 3,
      "teinte": "#4ade80"
    },
    {
      "id": "avance",
      "libelle": "Avancé",
      "points": 4,
      "teinte": "#fb923c"
    },
    {
      "id": "maitrise",
      "libelle": "Maîtrise",
      "points": 5,
      "teinte": "#f472b6"
    }
  ],
  "competences": [
    {
      "titre": "IA & agents",
      "icone": "agent",
      "teinte": "#e879f9",
      "vedette": true,
      "resume": "Agents, outils MCP et LLM branchés sur des données et des API : chez Decathlon et au quotidien.",
      "items": [
        [
          "Claude Code & orchestration d’agents",
          "avance"
        ],
        [
          "Outils & serveurs MCP",
          "avance"
        ],
        [
          "API LLM & function calling",
          "avance"
        ],
        [
          "Recherche documentaire & RAG",
          "avance"
        ],
        [
          "Python / FastAPI",
          "avance"
        ]
      ]
    },
    {
      "titre": "Salesforce Marketing Cloud",
      "icone": "mail",
      "resume": "Campagnes CRM internationales et outillage sur l'API SOAP.",
      "items": [
        [
          "AMPScript",
          "maitrise"
        ],
        [
          "Journey Builder",
          "maitrise"
        ],
        [
          "Automation Studio",
          "maitrise"
        ],
        [
          "Data Extensions",
          "maitrise"
        ],
        [
          "Content Builder",
          "maitrise"
        ],
        [
          "SQL",
          "avance"
        ],
        [
          "API SOAP",
          "avance"
        ]
      ],
      "teinte": "#6cc4ff"
    },
    {
      "titre": "Front-end",
      "icone": "code",
      "resume": "Applications React / Next.js à fort trafic, design systems.",
      "items": [
        [
          "React",
          "maitrise"
        ],
        [
          "Next.js",
          "maitrise"
        ],
        [
          "TypeScript",
          "avance"
        ],
        [
          "TailwindCSS",
          "avance"
        ],
        [
          "Storybook",
          "avance"
        ],
        [
          "Vue / Nuxt",
          "avance"
        ]
      ],
      "teinte": "#a78bfa"
    },
    {
      "titre": "Back-end & API",
      "icone": "server",
      "resume": "API REST, génération de contenus, outils internes.",
      "items": [
        [
          "Node.js",
          "avance"
        ],
        [
          "NestJS",
          "avance"
        ],
        [
          "API REST",
          "avance"
        ],
        [
          "Java / Spring Boot",
          "competent"
        ]
      ],
      "teinte": "#fb923c"
    },
    {
      "titre": "Qualité",
      "icone": "check",
      "resume": "Le test fait partie du développement, pas de l'après.",
      "items": [
        [
          "Jest / React Testing Library",
          "maitrise"
        ],
        [
          "Playwright",
          "avance"
        ],
        [
          "CI/CD GitHub",
          "avance"
        ],
        [
          "Revue de code",
          "maitrise"
        ]
      ],
      "teinte": "#4ade80"
    },
    {
      "titre": "Cloud, infra & observabilité",
      "icone": "cloud",
      "resume": "Pratiqués en mission chez Decathlon.",
      "items": [
        [
          "Docker",
          "avance"
        ],
        [
          "Datadog",
          "avance"
        ],
        [
          "Kubernetes",
          "competent"
        ],
        [
          "Helm",
          "competent"
        ],
        [
          "Kafka",
          "competent"
        ],
        [
          "Dynatrace",
          "competent"
        ]
      ],
      "teinte": "#38bdf8"
    },
    {
      "titre": "Data, CRM & growth",
      "icone": "chart",
      "resume": "Segmentation, conformité et acquisition.",
      "items": [
        [
          "Segmentation clients",
          "avance"
        ],
        [
          "Conformité RGPD",
          "avance"
        ],
        [
          "Génération de leads",
          "avance"
        ],
        [
          "Scraping Playwright",
          "avance"
        ]
      ],
      "teinte": "#f472b6"
    }
  ],
  "parcours": [
    {
      "periode": "2026 → aujourd'hui",
      "contrat": "Lille · Freelance",
      "entreprise": "Decathlon",
      "poste": "Expert Salesforce Marketing Cloud & développeur React / Node.js · CRM international",
      "points": [
        "<strong>Campagnes CRM SFMC internationales</strong> : emails multi-locales et contenus dynamiques (AMPScript), Journey Builder, Data Extensions, SQL, Automation Studio, segmentation.",
        "<strong>Outillage sur l’API SOAP SFMC</strong> : outils internes (NestJS, Next.js, TypeScript) de gestion des clés de traduction Phrase par pays et de versionnage des previews d’emails.",
        "<strong>Plateforme IA conversationnelle</strong> : développement sur l’assistant IA interne du groupe.",
        "<strong>Traductions avec Phrase</strong> : sanitization des clés TreatAsContent pour qu'une apostrophe ne casse plus le rendu.",
        "<strong>Back-end Java / Spring Boot</strong> : pair programming sur l'API de création des campagnes ; infra Docker, Kubernetes, Helm, CI/CD, Kafka ; observabilité Datadog, Dynatrace."
      ]
    },
    {
      "periode": "2024 → 2025",
      "contrat": "Lille · Freelance",
      "entreprise": "WayKonect — groupe TotalEnergies",
      "poste": "Développeur web React / Next.js · plateforme de gestion des cartes carburant",
      "points": [
        "Parcours de création de carte : 5 types de cartes, plus de 150 champs de formulaire.",
        "Tunnels de paiement, rapports mensuels téléchargeables, notifications.",
        "Design system ; tests Jest / RTL et Playwright ; CI GitHub, montée de version Node.js."
      ]
    },
    {
      "periode": "2023 → 2024",
      "contrat": "Bordeaux · Freelance",
      "entreprise": "HelloWork",
      "poste": "Développeur fullstack · emploi et recrutement",
      "points": [
        "<strong>Espace recruteur</strong> : génération automatisée des sites carrière en marque blanche des grands comptes (Node.js / TypeScript, Next.js, TailwindCSS)."
      ]
    },
    {
      "periode": "2021 → 2023",
      "contrat": "Freelance · régie projet",
      "entreprise": "Missions Sales & Growth",
      "poste": "Éditeurs SaaS et startups B2B",
      "points": [
        "<strong>Ekko.so</strong> — lead fullstack React / Next.js / Node.js.",
        "<strong>Scenario.gg</strong> — front-end senior, génération d'images par IA, SSR Next.js.",
        "<strong>WOO, lemlist, LaGrowthMachine, Scalezia, TAK, MyBizDev</strong> — growth engineering, automation, React."
      ]
    },
    {
      "periode": "2018 → 2021",
      "contrat": "Paris · CDI",
      "entreprise": "leboncoin",
      "poste": "Développeur front-end",
      "points": [
        "<strong>Core team</strong> : migration du legacy React vers Next.js et librairie de composants commune (Storybook, Rollup, SemVer).",
        "<strong>Livraison</strong> : achat en ligne, Adyen, Mondial Relay ; <strong>Premium</strong> : options payantes.",
        "<strong>Qualité</strong> : 100 % de couverture RTL ; <strong>Cyber Security Champion</strong> (OWASP)."
      ]
    },
    {
      "periode": "2015 → 2020",
      "contrat": "Paris · CDI puis freelance",
      "entreprise": "Inqom, Beev, MinuteBuzz, Gymlib",
      "poste": "Front-end React, puis growth & UX à Station F",
      "points": [
        "Web app React / Redux de comptabilité en ligne ; archivage à valeur probante des factures.",
        "Stratégie produit et UX au lancement d'une marketplace de véhicules électriques."
      ]
    }
  ],
  "projets": [
    {
      "nom": "Cours : construire des agents IA",
      "categorie": "Projet perso · Formation",
      "statut": "live",
      "teinte": "#4ade80",
      "image": "assets/projets/cours.svg",
      "lien": "agents/fr/",
      "libelleLien": "Ouvrir le cours",
      "resume": "Cours gratuit en français et en anglais : 10 modules et 23 exercices de code dans le navigateur, couverts par 117 tests, sur modèle simulé.",
      "tags": [
        "Agents IA",
        "Évaluation",
        "Garde-fous",
        "Monaco"
      ]
    },
    {
      "nom": "Graph-Warden",
      "categorie": "Open source · Knowledge graph",
      "statut": "live",
      "teinte": "#a78bfa",
      "image": "assets/projets/graph-warden.svg",
      "lien": "https://github.com/Graph-Warden/graph-warden",
      "libelleLien": "Voir le code",
      "resume": "Graphe de connaissance gouverné pour agents IA, en alpha, sous licence Apache-2.0 : droits vérifiés à chaque saut, provenance, audit, accès MCP et REST.",
      "tags": [
        "Knowledge graph",
        "MCP",
        "REST",
        "Open source"
      ]
    },
    {
      "nom": "Outillage emails SFMC",
      "categorie": "Decathlon · Outillage CRM",
      "statut": "interne",
      "teinte": "#38bdf8",
      "image": "assets/projets/sfmc.svg",
      "resume": "Outils internes sur l’API SOAP de Salesforce Marketing Cloud : gestion des clés de traduction Phrase par pays et versionnage des previews d’emails.",
      "tags": [
        "NestJS",
        "Next.js",
        "TypeScript",
        "API SOAP",
        "Phrase"
      ]
    },
    {
      "nom": "JARVIS",
      "categorie": "Projet perso · Agent vocal",
      "statut": "prive",
      "teinte": "#e879f9",
      "image": "assets/projets/jarvis.svg",
      "resume": "Assistant vocal qui délègue les vraies tâches à des agents Claude Code. Le modèle appelle des outils typés ; un jeton éphémère garde la clé API côté serveur ; les lancements d’applis passent par une liste filtrée.",
      "tags": [
        "OpenAI Realtime",
        "Function calling",
        "Python",
        "FastAPI",
        "Claude Code"
      ]
    },
    {
      "nom": "Simon Brain · knowledge graph",
      "categorie": "Projet perso · Knowledge graph & MCP",
      "statut": "prive",
      "teinte": "#22d3ee",
      "image": "assets/projets/brain.svg",
      "resume": "Graphe de connaissance pour agents IA, d’après le LLM Wiki d’Andrej Karpathy : 182 nœuds typés, 1 280+ relations, alimenté automatiquement par mes sessions et exposé à mes agents en MCP. Détail dans la section Brain.",
      "tags": [
        "Knowledge graph",
        "MCP",
        "Python",
        "Hooks",
        "Monitoring"
      ]
    },
    {
      "nom": "Tri d’offres par LLM",
      "categorie": "Projet perso · Extraction",
      "statut": "prive",
      "teinte": "#facc15",
      "image": "assets/projets/offres.svg",
      "resume": "Extension de Claude Code qui extrait d’une offre de mission le client final, le TJM, la stack et les dates, note l’adéquation au profil et suit chaque candidature.",
      "tags": [
        "LLM",
        "Sortie structurée",
        "TypeScript",
        "Claude Code"
      ]
    },
    {
      "nom": "Cohorte",
      "categorie": "Projet perso · Fullstack",
      "statut": "prive",
      "teinte": "#a78bfa",
      "image": "assets/projets/cohorte.svg",
      "resume": "Staffing freelance par magic link, avec un registre anti-doublon consultant × client : une ESN ne peut plus présenter un profil déjà proposé par une autre.",
      "tags": [
        "Java 25",
        "Spring Boot 4",
        "PostgreSQL",
        "Nuxt 4",
        "Vue 3",
        "Docker"
      ]
    },
    {
      "nom": "Ce CV en ligne",
      "categorie": "WebGL · Performance",
      "statut": "live",
      "teinte": "#6cc4ff",
      "image": "assets/projets/cv.webp",
      "lien": "https://simon-coding.vercel.app",
      "libelleLien": "Vous y êtes",
      "resume": "Le site que vous lisez : nom formé en particules en WebGL brut, contenu servi en JSON, Lighthouse 93 à 100.",
      "tags": [
        "WebGL",
        "JavaScript",
        "Shaders",
        "Lighthouse"
      ]
    },
    {
      "nom": "Création de cartes carburant",
      "categorie": "WayKonect · TotalEnergies",
      "statut": "client",
      "teinte": "#fb923c",
      "image": "assets/projets/waykonect.svg",
      "resume": "Parcours de création de carte : 5 types de cartes, plus de 150 champs de formulaire, tunnels de paiement et rapports mensuels.",
      "tags": [
        "React",
        "Next.js",
        "Design system",
        "Playwright"
      ]
    },
    {
      "nom": "Sites carrière en marque blanche",
      "categorie": "HelloWork · Espace recruteur",
      "statut": "client",
      "teinte": "#4ade80",
      "image": "assets/projets/sites-carriere.svg",
      "resume": "Génération automatisée des sites carrière des grands comptes à partir d’un même socle, chacun à la marque du recruteur.",
      "tags": [
        "Node.js",
        "TypeScript",
        "Next.js",
        "TailwindCSS"
      ]
    },
    {
      "nom": "Librairie de composants",
      "categorie": "leboncoin · Design system",
      "statut": "interne",
      "teinte": "#f472b6",
      "image": "assets/projets/composants.svg",
      "resume": "Composants React communs aux équipes produit, versionnés et documentés, dans le cadre de la migration vers Next.js.",
      "tags": [
        "React",
        "Next.js",
        "Storybook",
        "Rollup",
        "SemVer"
      ]
    }
  ],
  "formation": [
    "École 42 — 2018",
    "TheFamily — 2015",
    "UX PM2 (UXalliance) — 2020",
    "HubSpot Inbound Marketing — 2018"
  ],
  "langues": "Français (langue maternelle) · Anglais (professionnel)",
  "stack": {
    "surtitre": "Stack technique",
    "intro": "Le cœur de mon quotidien : des agents IA pour aller plus vite, Salesforce Marketing Cloud côté CRM, React / Next.js et Node.js côté produit, et la qualité en continu."
  },
  "softSkills": {
    "surtitre": "Savoir-être",
    "intro": "Ce que les équipes retrouvent chez moi au quotidien, preuves à l’appui.",
    "items": [
      {
        "titre": "Exigence qualité",
        "icone": "bouclier",
        "teinte": "#4ade80",
        "texte": "Pas de PR sans tests. Je durcis la CI pour que main reste vert, sans négocier."
      },
      {
        "titre": "Apprentissage rapide",
        "icone": "fusee",
        "teinte": "#fb923c",
        "texte": "Java / Spring Boot et Vue / Nuxt pris en main en projet perso, architecture clean comprise."
      },
      {
        "titre": "Pont marketing ↔ tech",
        "icone": "pont",
        "teinte": "#6cc4ff",
        "texte": "Je parle CRM avec les équipes marketing et API avec les développeurs, et je traduis entre les deux."
      },
      {
        "titre": "Transmission",
        "icone": "equipe",
        "teinte": "#a78bfa",
        "texte": "Revue de code, pair programming, librairie de composants partagée : je fais monter l’équipe avec moi."
      },
      {
        "titre": "Autonomie",
        "icone": "boussole",
        "teinte": "#38bdf8",
        "texte": "Freelance et lead fullstack : je prends un sujet flou et je le mène jusqu’en production."
      },
      {
        "titre": "Sens produit",
        "icone": "cible",
        "teinte": "#f472b6",
        "texte": "Growth, UX et stratégie produit en startup : je code pour un résultat, pas pour un ticket."
      },
      {
        "titre": "Curiosité",
        "icone": "ampoule",
        "teinte": "#facc15",
        "texte": "IA au quotidien, sécurité (Cyber Security Champion OWASP), automation : je creuse ce qui sert."
      },
      {
        "titre": "Franchise",
        "icone": "bulle",
        "teinte": "#fb7185",
        "texte": "Je signale un risque tôt et clairement. Une alerte au bon moment coûte moins qu’un incident."
      }
    ]
  },
  "projetsIntro": "Agents IA, produits en production et outils internes, du CRM au front-end.",
  "statutsProjet": {
    "live": "En ligne",
    "prive": "Code privé",
    "interne": "Interne",
    "client": "Client"
  },
  "brain": {
    "surtitre": "Knowledge graph",
    "intro": "Simon Brain est la mémoire commune de mes agents. Je suis parti du <a href=\"https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f\" target=\"_blank\" rel=\"noopener\">LLM Wiki d’Andrej Karpathy</a> : un LLM tient à jour un wiki Markdown à partir de sources brutes. Chaque page est un nœud typé, chaque lien un arc. Je l’ai transformé en système qui se nourrit seul, se surveille et sert tous mes projets.",
    "chiffres": [
      {
        "valeur": "182",
        "libelle": "nœuds typés : concepts, analyses, connexions, entités, sources"
      },
      {
        "valeur": "1 280",
        "unite": "+",
        "libelle": "relations entre nœuds"
      },
      {
        "valeur": "−63",
        "unite": "%",
        "libelle": "de contexte injecté grâce au routage thématique"
      }
    ],
    "etapes": [
      {
        "titre": "Capturer",
        "texte": "Hooks sur chaque session d’agent"
      },
      {
        "titre": "Compiler",
        "texte": "Le LLM crée ou met à jour les nœuds"
      },
      {
        "titre": "Relier",
        "texte": "Liens, thèmes, index inversé"
      },
      {
        "titre": "Exposer",
        "texte": "Contexte au démarrage, accès MCP"
      },
      {
        "titre": "Surveiller",
        "texte": "Contrôles de santé à chaque session"
      }
    ],
    "pointDeDepart": {
      "titre": "Le pattern de départ",
      "items": [
        "Sources brutes immuables, wiki écrit par le LLM",
        "Un schéma qui fixe le format des pages",
        "Opérations manuelles : ingérer, interroger, vérifier",
        "Un index et un journal tenus à la main par le LLM"
      ]
    },
    "ajoutsTitre": "Ce que j’y ai ajouté",
    "ajouts": [
      {
        "titre": "Capture ambiante",
        "icone": "eclair",
        "teinte": "#6cc4ff",
        "texte": "Plus besoin d’ingérer à la main : mes conversations avec l’agent deviennent une source. À la fin de chaque session, un processus en arrière-plan demande au LLM ce qui mérite d’être gardé.",
        "exemple": "SessionEnd · PreCompact · flush.py"
      },
      {
        "titre": "Compilation automatique",
        "icone": "server",
        "teinte": "#a78bfa",
        "texte": "Les journaux du jour sont compilés en nœuds sans intervention. Un hash par fichier évite de recompiler ce qui n’a pas changé, un verrou empêche deux compilations en même temps.",
        "exemple": "compile.py · state.json · compile.lock"
      },
      {
        "titre": "Arcs transverses",
        "icone": "reseau",
        "teinte": "#22d3ee",
        "texte": "Un type de nœud « connexion » relie deux idées venues de projets différents, par exemple une même panne vue sur deux dépôts. C’est là que le graphe produit du sens et pas seulement du stockage.",
        "exemple": "25 nœuds connexion"
      },
      {
        "titre": "Routage thématique",
        "icone": "boussole",
        "teinte": "#4ade80",
        "texte": "Une couche de 13 thèmes fermés. Au démarrage, l’agent reçoit la carte des thèmes au lieu de l’index complet, puis ouvre seulement les nœuds utiles à la demande.",
        "exemple": "4 400 → 1 645 tokens"
      },
      {
        "titre": "Exposition aux agents",
        "icone": "prise",
        "teinte": "#e879f9",
        "texte": "Le contexte est injecté dans chaque session, quel que soit le projet. Le graphe est aussi accessible en MCP et en ligne de commande, et un index inversé envoie vers les bons nœuds.",
        "exemple": "SessionStart · MCP · index.json"
      },
      {
        "titre": "Monitoring actif",
        "icone": "chart",
        "teinte": "#fb923c",
        "texte": "La capture était tombée en panne sans bruit et l’est restée trois mois. Depuis, chaque session commence par des contrôles : erreurs récentes, capture silencieuse, retard de compilation, hooks réellement enregistrés.",
        "exemple": "4 contrôles au démarrage"
      },
      {
        "titre": "Reprise sur panne",
        "icone": "bouclier",
        "teinte": "#f472b6",
        "texte": "Quand une capture meurt en route (arrêt de WSL pendant l’appel au LLM), la session suivante la reprend. Au premier rattrapage, 11 sessions perdues ont été résumées.",
        "exemple": "5 orphelins repris par session"
      },
      {
        "titre": "Qualité et versionnage",
        "icone": "valide",
        "teinte": "#facc15",
        "texte": "Onze contrôles automatisés sur le graphe : liens cassés, nœuds orphelins, liens sans retour, thème manquant, contradictions repérées par le LLM. Chaque écriture donne aussi lieu à un commit git, avec une alerte si quelque chose reste non commité.",
        "exemple": "lint.py · git snapshot"
      }
    ]
  }
}
