/* ============================================================ Contenu du portfolio — SOURCE DE VÉRITÉ unique. Pour modifier le site (textes, projets, expériences…), c'est ici que ça se passe. Tout est typé. ============================================================ */ export type ProjectStatus = "live" | "dev" | "archived" | "oss"; export interface Project { id: string; title: string; subtitle: string; desc: string; stack: string[]; status: ProjectStatus; link?: string; img?: string; /** Variante du logo pour le thème sombre (logo « blanc »). Si absent, `img` est utilisé partout. */ imgDark?: string; } export interface Experience { company: string; logo: string; role: string; period: string; duration: string; desc: string; missions: string[]; stack: string[]; current?: boolean; } export interface Formation { title: string; school: string; period: string; desc?: string; } export interface StackGroup { label: string; items: string[]; // noms de technos, résolus en icônes par } export interface Interest { name: string; note: string; icon: "gamepad" | "film" | "music" | "code"; } export const profile = { name: "Johan Leroy", role: "Développeur fullstack", lede: "Je conçois et développe des applications web performantes, propres et scalables, du front jusqu'à la mise en production. Basé à Nantes, profil « builder » : open-source, auto-hébergement, projets perso.", bio: "Développeur fullstack passionné par les technologies modernes, j'aime construire des produits complets : penser l'architecture, soigner l'expérience, déployer et maintenir. J'expérimente en continu via mes projets perso, mes services auto-hébergés et l'open-source.", }; export const social = { email: "contact@johanleroy.fr", github: "https://github.com/JohanLeroy", gitea: "https://git.lidge.fr/johanleroy", linkedin: "https://www.linkedin.com/in/johan-leroy-472409180/", soundcloud: "https://soundcloud.com/skuuuu", }; /* URL du bouton « café » — à remplacer par le service retenu (Buy Me a Coffee, Ko-fi, Liberapay, PayPal.me, Stripe…). */ export const coffeeUrl = "https://buymeacoffee.com/johanleroy"; export const stats = [ { n: "~3 ans", l: "d'expérience pro" }, { n: "6+", l: "projets livrés" }, { n: "8+", l: "services auto-hébergés" }, { n: "OSS", l: "contributeur open-source" }, ]; /* Liste unique, dans l'ordre de développement (du plus récent au plus ancien). */ export const projects: Project[] = [ { id: "kys", title: "Keep Your Smile", subtitle: "Site e-commerce", desc: "Site client e-commerce de la marque de vêtement Keep Your Smile", stack: ["Next.js", "NestJS 11"], status: "dev", link: "https://keepyoursmile.fr", img: "/images/projets/kys.png", imgDark: "/images/projets/kys-dark.png", }, { id: "techos", title: "Techos", subtitle: "Plateforme hébergement & domaines", desc: "Plateforme client + admin de gestion d'hébergement web et cloud pour une association, bâtie sur WHMCS.", stack: ["Next.js 16", "React 19", "NestJS 11", "Tailwind 4", "shadcn/ui", "Redis", "WHMCS API"], status: "dev", link: "https://techos-asso.fr", img: "/images/projets/techos.png", imgDark: "/images/projets/techos-dark.png", }, { id: "ksauce", title: "Bot Discord KSauce", subtitle: "Bot communautaire Discord", desc: "Communauté KSauce : commandes, modération et fonctionnalités sur-mesure.", stack: ["Node.js", "TypeScript", "Discord.js"], status: "dev", link: "https://ksauce.lidge.fr/", img: "/images/projets/ksauce.png", imgDark: "/images/projets/ksauce-dark.png", }, { id: "amarea", title: "Amarea Tattoo", subtitle: "Site vitrine", desc: "Vitrine + gestion pour une tatoueuse indépendante. Architecture découplée SPA + API REST avec gestion de médias.", stack: ["Vue 3", "Vite", "NestJS 11", "TypeORM", "MariaDB", "Tailwind 4"], status: "live", link: "https://amarea-tattoo.fr", img: "/images/projets/amarea.png", }, { id: "arboretum", title: "Arboretum", subtitle: "IDE nouvelle génération", desc: "Outil IDE open-source : piloter des worktrees git et des sessions d'agents IA.", stack: ["Node.js", "Vue 3", "TypeScript", "npx"], status: "oss", link: "https://git-arboretum.com/", img: "/images/projets/arboretum.png", imgDark: "/images/projets/arboretum-dark.png", }, { id: "lplv", title: "Liberty Pour La Vie", subtitle: "Site associatif", desc: "Gestion complet pour l'association Liberty Pour La Vie pour facilité l'adoption d'un chat.", stack: ["Java", "Spring Boot", "Thymeleaf", "Bootstrap", "MariaDB"], status: "live", link: "https://libertypourlavie.fr/", img: "/images/projets/lplv.png", }, { id: "mvg", title: "Mon Voisin Geek", subtitle: "Site vitrine", desc: "Vitrine de service informatique de voisinage. Projet désormais fermé.", stack: ["Angular", "Tailwind CSS", "Express.js", "MariaDB"], status: "archived", img: "/images/projets/monvoisingeek.png", }, ]; export const experiences: Experience[] = [ { company: "Qualiobee", logo: "/images/entreprises/qualiobee.png", role: "Développeur fullstack", period: "Depuis 2025", duration: "1 an", desc: "Édition d'un SaaS de gestion pour organismes de formation (conformité Qualiopi) : , extranet et intégration facturation et LMS.", missions: [ "Développement fullstack : API NestJS + front Nuxt", "Architecture serverless AWS (Lambda, S3)", "Intégration Pennylane & Tiime (devis, factures, synchronisation clients)", "Synchronisation calendrier ICS", "Extranet apprenant", "Intégration LMS", ], stack: ["NestJS", "Nuxt 2", "TypeORM", "MariaDB", "AWS", "Terraform"], current: true, }, { company: "Almeria", logo: "/images/entreprises/almeria.png", role: "Développeur", period: "2023–2025", duration: "2 ans", desc: "Conception et développement d'applications web et de logiciels d'intégration ERP.", missions: [ "Analyse, conception & développement d'applications web", "Création de logiciels d'intégration ERP", "Maintenance & évolution des solutions", ], stack: ["Angular", "Express.js", "NestJS", "SQL Server", "MariaDB"], }, { company: "CEREMA", logo: "/images/entreprises/cerema.png", role: "Technicien évaluation, mesure trafic & mobilité", period: "2021–2023", duration: "2 ans", desc: "Installation de capteurs et analyse de données de mobilité.", missions: [ "Pose de capteurs provisoires (mobilité)", "Optimisation des données et outils numériques", "Analyse du trafic & de la mobilité", ], stack: ["Analyse de données", "PHP", "MariaDB"], }, { company: "Réseau SNCF", logo: "/images/entreprises/sncf.png", role: "Agent télécom", period: "2019–2021", duration: "2 ans", desc: "Maintenance des équipements de sonorisation, d'affichage et de téléphonie sur le réseau ferroviaire.", missions: [ "Maintenance préventive & corrective", "Affichage dynamique en gare", "Téléphonie sur les voies", ], stack: ["Télécoms", "Maintenance", "Audio", "Affichage"], }, { company: "Novoferm", logo: "/images/entreprises/novoferm.png", role: "Stage développeur", period: "2019", duration: "7 semaines", desc: "Application web de récupération de fichiers SharePoint ; réparation et configuration de postes, imprimantes et téléphones.", missions: [], stack: [], }, { company: "Pivot Point", logo: "/images/entreprises/pivotpoint.png", role: "Stage développeur", period: "2018", duration: "1 semaine", desc: "Développement d'un site internet en PHP.", missions: [], stack: ["PHP"], }, { company: "Actemium", logo: "/images/entreprises/actemium.png", role: "Stage développeur", period: "2018", duration: "1 semaine", desc: "Développement d'applications Windows d'automatisation.", missions: [], stack: [], }, ]; export const formation: Formation[] = [ { title: "Expert en Architecture et Développement Logiciel", school: "Campus ENI, Nantes", period: "Depuis 2025", desc: "Architecture logicielle avancée, conception de systèmes distribués, DevOps, cloud, sécurité, performance et pilotage de projets techniques", }, { title: "Concepteur Développeur d'Applications", school: "Campus ENI, Nantes", period: "2023-2025", desc: "Conception & dév d'applications web/mobiles, architecture logicielle, gestion de projet.", }, { title: "BTS Systèmes Numériques", school: "Saint Félix La Salle, Nantes", period: "2021–2023", desc: "Systèmes électroniques & informatiques, informatique industrielle & réseaux.", }, { title: "BAC PRO Systèmes Numériques", school: "Saint Félix La Salle, Nantes", period: "2018–2021", desc: "Systèmes électroniques & réseaux, installation & maintenance.", }, { title: "Diplôme National du Brevet", school: "Saint Père en Retz", period: "avant 2018", }, ]; /* Grille unique, groupée par catégorie (technos « cœur » d'abord, puis le reste). */ export const stack: StackGroup[] = [ { label: "Langages", items: ["TypeScript", "JavaScript", "Java", "Python", "PHP", "C#", "C++", "Dart", "Kotlin", "HTML5", "CSS3"] }, { label: "Frameworks & libs", items: ["NestJS", "Nuxt", "Next.js", "React", "Vue.js", "Angular", "Astro", "Tailwind CSS", "Spring", "Symfony", "Express.js", "FastAPI", "Flutter", "GraphQL", "Socket.io", "Chart.js", "Discord.js", "Vuetify", "Bootstrap"] }, { label: "Bases de données & ORM", items: ["MariaDB", "MySQL", "PostgreSQL", "Redis", "MongoDB", "SQLite", "TypeORM", "Prisma", "Sequelize"] }, { label: "Outils & DevOps", items: ["Docker", "Git", "Gitea", "GitLab", "GitHub Actions", "AWS", "Terraform", "NGINX", "Apache", "Vite", "pnpm", "Plesk"] }, { label: "Tests & Qualité", items: ["Jest", "Vitest", "Playwright", "ESLint", "Prettier"] }, { label: "Services & outils", items: ["Firebase", "Swagger", "Postman", "Stripe", "HubSpot"] }, { label: "IDE & Éditeurs", items: ["WebStorm", "PhpStorm", "PyCharm", "IntelliJ IDEA", "VS Code", "Claude Code"] }, { label: "Systèmes", items: ["Debian", "Ubuntu", "Windows", "macOS"] }, ]; export const softTech = [ "Dév. Frontend", "Dév. Backend", "Analyse & traitement de données", "Mise en production", "Analyse de BDD", "Modélisation UML", "Maquettage", "Sécurité", ]; export const softHuman = [ "Gestion de projet", "Travail en équipe", "Communication", "Autonomie", "Organisation", "Adaptation", "Veille techno", ]; export const interests: Interest[] = [ { name: "Jeux vidéo", note: "// détente", icon: "gamepad" }, { name: "Films & Séries", note: "// veille culture", icon: "film" }, { name: "Musique électronique / DJing", note: "// loisir", icon: "music" }, { name: "Projets personnels", note: "// always building", icon: "code" }, ]; /* Texte tapé dans le mockup terminal du hero (état final = contenu no-JS). */ export const terminalText = `$ whoami johan-leroy $ cat about.json { "name": "Johan Leroy", "role": "Développeur fullstack", "stack": ["TypeScript", "NestJS", "Nuxt", "Next.js"], "location": "Nantes, France" }`;