Files
portfolio/src/data/content.ts
Johan LEROY 43e2640cd7
All checks were successful
Deploy production / build-deploy (push) Successful in 35s
update projets add kys
2026-07-21 11:32:44 +02:00

340 lines
11 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* ============================================================
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 <TechIcon/>
}
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: "20232025",
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: "20212023",
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: "20192021",
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: "20212023",
desc: "Systèmes électroniques & informatiques, informatique industrielle & réseaux.",
},
{
title: "BAC PRO Systèmes Numériques",
school: "Saint Félix La Salle, Nantes",
period: "20182021",
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"
}`;