first commit
This commit is contained in:
116
public/content/experiences.json
Normal file
116
public/content/experiences.json
Normal file
@@ -0,0 +1,116 @@
|
||||
{
|
||||
"items": [
|
||||
{
|
||||
"id": "almeria",
|
||||
"company": "Almeria",
|
||||
"logo": "/img/company/almeria.png",
|
||||
"role": "Développeur",
|
||||
"period": "Depuis 2023",
|
||||
"duration": "3 ans",
|
||||
"description": "Conception et développement d'applications web et de logiciels d'intégration ERP.",
|
||||
"missions": [
|
||||
"Analyse, conception et développement d'applications web",
|
||||
"Création de logiciels d'intégration ERP",
|
||||
"Maintenance et évolution des applications existantes"
|
||||
],
|
||||
"stack": ["Angular", "Express.js", "NestJS", "SQL Server", "MariaDB"],
|
||||
"type": "cdi",
|
||||
"current": true
|
||||
},
|
||||
{
|
||||
"id": "cerema",
|
||||
"company": "CEREMA",
|
||||
"logo": "/img/company/cerema.png",
|
||||
"role": "Technicien évaluation mesure trafic & mobilité",
|
||||
"period": "2021 - 2023",
|
||||
"duration": "2 ans",
|
||||
"description": "Spécialisé dans l'installation de capteurs et l'analyse de données de mobilité.",
|
||||
"missions": [
|
||||
"Installation de capteurs provisoires dans le secteur mobilité",
|
||||
"Optimisation des données dans l'innovation d'outils numériques",
|
||||
"Analyse et traitement des données de trafic et mobilité"
|
||||
],
|
||||
"stack": ["Analyse de données", "PHP", "MariaDB"],
|
||||
"type": "cdd",
|
||||
"current": false
|
||||
},
|
||||
{
|
||||
"id": "sncf",
|
||||
"company": "Réseau SNCF",
|
||||
"logo": "/img/company/sncf.png",
|
||||
"role": "Agent télécom",
|
||||
"period": "2019 - 2021",
|
||||
"duration": "2 ans",
|
||||
"description": "Maintenance des équipements de sonorisation, d'affichage et de téléphonie sur le réseau ferroviaire.",
|
||||
"missions": [
|
||||
"Maintenance préventive et corrective des équipements",
|
||||
"Installation et réparation des systèmes d'affichage en gare",
|
||||
"Gestion des équipements téléphoniques sur les voies ferrées"
|
||||
],
|
||||
"stack": ["Télécommunications", "Maintenance", "Équipements audio", "Affichage dynamique"],
|
||||
"type": "cdi",
|
||||
"current": false
|
||||
},
|
||||
{
|
||||
"id": "novoferm",
|
||||
"company": "Novoferm",
|
||||
"logo": "/img/company/novoferm.png",
|
||||
"role": "Stage développeur",
|
||||
"period": "2019",
|
||||
"duration": "7 semaines",
|
||||
"description": "Stage de développement d'une application web qui permet de récupérer des fichiers stockés dans SharePoint. Réparation et configuration de PC, imprimantes et téléphones.",
|
||||
"missions": [],
|
||||
"stack": [],
|
||||
"type": "stage",
|
||||
"current": false
|
||||
},
|
||||
{
|
||||
"id": "pivotpoint",
|
||||
"company": "Pivot Point",
|
||||
"logo": "/img/company/pivotpoint.png",
|
||||
"role": "Stage développeur",
|
||||
"period": "2018",
|
||||
"duration": "1 semaine",
|
||||
"description": "Stage de développement d'un site internet en PHP.",
|
||||
"missions": [],
|
||||
"stack": ["PHP"],
|
||||
"type": "stage",
|
||||
"current": false
|
||||
},
|
||||
{
|
||||
"id": "actemium",
|
||||
"company": "Actemium",
|
||||
"logo": "/img/company/actemium.png",
|
||||
"role": "Stage développeur",
|
||||
"period": "2018",
|
||||
"duration": "1 semaine",
|
||||
"description": "Stage de développement d'applications Windows d'automatisation.",
|
||||
"missions": [],
|
||||
"stack": [],
|
||||
"type": "stage",
|
||||
"current": false
|
||||
}
|
||||
],
|
||||
"skills": {
|
||||
"technical": [
|
||||
"Développement Frontend",
|
||||
"Développement Backend",
|
||||
"Analyse et traitement de données",
|
||||
"Mise en production",
|
||||
"Analyse de base de données",
|
||||
"Modélisation UML",
|
||||
"Maquettage",
|
||||
"Sécurité"
|
||||
],
|
||||
"soft": [
|
||||
"Gestion de projets",
|
||||
"Travail en équipe",
|
||||
"Analyse de projets",
|
||||
"Communication",
|
||||
"Autonomie",
|
||||
"Organisation",
|
||||
"Adaptation",
|
||||
"Veille technologique"
|
||||
]
|
||||
}
|
||||
}
|
||||
35
public/content/formations.json
Normal file
35
public/content/formations.json
Normal file
@@ -0,0 +1,35 @@
|
||||
{
|
||||
"items": [
|
||||
{
|
||||
"id": "cda-eni",
|
||||
"title": "Concepteur Développeur d'Applications",
|
||||
"school": "Campus ENI Nantes",
|
||||
"schoolUrl": "https://www.eni-ecole.fr",
|
||||
"period": "Depuis 2023",
|
||||
"description": "Formation sur la conception et le développement d'applications web et mobiles. Acquisition des compétences en architecture logicielle et gestion de projets informatiques."
|
||||
},
|
||||
{
|
||||
"id": "bts-sn",
|
||||
"title": "BTS Systèmes Numériques",
|
||||
"school": "Campus Saint Félix La Salle Nantes",
|
||||
"schoolUrl": "https://stfelixlasalle.fr",
|
||||
"period": "2021 - 2023",
|
||||
"description": "Formation technique supérieure en systèmes électroniques et informatiques, avec une spécialisation en informatique industrielle et en réseaux."
|
||||
},
|
||||
{
|
||||
"id": "bac-pro-sn",
|
||||
"title": "BAC PRO Systèmes Numériques",
|
||||
"school": "Campus Saint Félix La Salle Nantes",
|
||||
"schoolUrl": "https://stfelixlasalle.fr",
|
||||
"period": "2018 - 2021",
|
||||
"description": "Formation en systèmes électroniques et réseaux informatiques. Apprentissage des bases de l'installation et de la maintenance de systèmes numériques."
|
||||
},
|
||||
{
|
||||
"id": "brevet",
|
||||
"title": "Diplôme National du Brevet",
|
||||
"school": "Ensemble scolaire Saint Père en Retz",
|
||||
"schoolUrl": "https://www.ensemble-scolaire-saint-pere.fr",
|
||||
"period": "Avant 2018"
|
||||
}
|
||||
]
|
||||
}
|
||||
8
public/content/interests.json
Normal file
8
public/content/interests.json
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"items": [
|
||||
{ "id": "gaming", "label": "Jeux vidéo", "icon": "lucide:gamepad-2", "color": "violet" },
|
||||
{ "id": "movies", "label": "Films & Séries", "icon": "lucide:film", "color": "cyan" },
|
||||
{ "id": "dj", "label": "DJing / Tekno", "icon": "lucide:disc-3", "color": "magenta" },
|
||||
{ "id": "side", "label": "Projets personnels", "icon": "lucide:rocket", "color": "ice" }
|
||||
]
|
||||
}
|
||||
34
public/content/profile.json
Normal file
34
public/content/profile.json
Normal file
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"name": "Johan Leroy",
|
||||
"title": "Développeur Fullstack",
|
||||
"tagline": "Dev le jour, DJ la nuit",
|
||||
"bio": "Développeur fullstack passionné par les technos modernes. J'aime créer des expériences web performantes, propres et scalables — et accessoirement mixer de la tekno quand l'écran s'éteint.",
|
||||
"available": true,
|
||||
"availableLabel": "Ouvert aux opportunités",
|
||||
"hero": {
|
||||
"photo": "/img/pp/pp3.png",
|
||||
"photos": ["/img/pp/pp1.png", "/img/pp/pp2.png", "/img/pp/pp3.png"],
|
||||
"roles": ["Dev", "DJ", "Dev"],
|
||||
"cta": [
|
||||
{
|
||||
"label": "Télécharger mon CV",
|
||||
"href": "/assets/cv.pdf",
|
||||
"variant": "primary",
|
||||
"external": true
|
||||
},
|
||||
{
|
||||
"label": "Voir mes projets",
|
||||
"href": "/projets",
|
||||
"variant": "ghost",
|
||||
"external": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"socials": {
|
||||
"email": "contact@johanleroy.fr",
|
||||
"github": "https://github.com/JohanLeroy",
|
||||
"gitea": "https://git.lidge.fr/johanleroy",
|
||||
"website": "https://johanleroy.fr"
|
||||
},
|
||||
"cv": "/assets/cv.pdf"
|
||||
}
|
||||
71
public/content/projects.json
Normal file
71
public/content/projects.json
Normal file
@@ -0,0 +1,71 @@
|
||||
{
|
||||
"items": [
|
||||
{
|
||||
"id": "techos",
|
||||
"title": "Techos",
|
||||
"subtitle": "Plateforme hébergement & domaines",
|
||||
"description": "Plateforme client + admin de gestion d'hébergement web et de domaines pour une association, construite par-dessus WHMCS. Design system Liquid Glass dark + light mode.",
|
||||
"image": "/img/projet/techos.png",
|
||||
"category": "web",
|
||||
"status": "live",
|
||||
"url": "https://techos-asso.fr",
|
||||
"stack": ["Next.js 16", "React 19", "NestJS 11", "TailwindCSS 4", "shadcn/ui", "Redis", "WHMCS API"],
|
||||
"featured": true
|
||||
},
|
||||
{
|
||||
"id": "amarea",
|
||||
"title": "Amarea Tattoo",
|
||||
"subtitle": "Site du studio de tatouage Amarea",
|
||||
"description": "Site vitrine et gestion pour un studio de tatouage. Architecture découplée SPA + REST API avec gestion de médias.",
|
||||
"image": "",
|
||||
"category": "web",
|
||||
"status": "live",
|
||||
"stack": ["Vue 3", "Vite", "NestJS 11", "TypeORM", "MariaDB", "Tailwind 4"],
|
||||
"featured": true
|
||||
},
|
||||
{
|
||||
"id": "lidge",
|
||||
"title": "Lidge",
|
||||
"subtitle": "Portail abonnements services auto-hébergés",
|
||||
"description": "Plateforme personnelle pour gérer les abonnements à mes services auto-hébergés (Jellyfin, Cloud, Vault, Mail, Messenger, Git…) avec SSO, tickets et workflow d'accès.",
|
||||
"image": "",
|
||||
"category": "web",
|
||||
"status": "live",
|
||||
"stack": ["Nuxt 3", "NestJS 11", "TypeORM", "MariaDB", "JWT", "Nodemailer"],
|
||||
"featured": true
|
||||
},
|
||||
{
|
||||
"id": "ksauce-bot",
|
||||
"title": "Bot Discord KSauce",
|
||||
"subtitle": "Bot communautaire Discord",
|
||||
"description": "Bot Discord développé pour la communauté KSauce. Gestion de commandes, modération et fonctionnalités sur-mesure.",
|
||||
"image": "",
|
||||
"category": "bot",
|
||||
"status": "live",
|
||||
"stack": ["Node.js", "TypeScript", "Discord.js"],
|
||||
"featured": false
|
||||
},
|
||||
{
|
||||
"id": "lplv",
|
||||
"title": "Liberty Pour La Vie",
|
||||
"subtitle": "Site associatif (archivé)",
|
||||
"description": "Développement d'un site web complet pour l'association Liberty Pour La Vie. Projet fermé, plus en ligne.",
|
||||
"image": "/img/projet/lplv.png",
|
||||
"category": "web",
|
||||
"status": "archived",
|
||||
"stack": ["Java Spring Boot", "Thymeleaf", "Bootstrap", "MariaDB"],
|
||||
"featured": false
|
||||
},
|
||||
{
|
||||
"id": "monvoisingeek",
|
||||
"title": "Mon Voisin Geek",
|
||||
"subtitle": "Site vitrine (archivé)",
|
||||
"description": "Développement d'un site web vitrine simple pour Mon Voisin Geek. Projet fermé, plus en ligne.",
|
||||
"image": "/img/projet/monvoisingeek.png",
|
||||
"category": "web",
|
||||
"status": "archived",
|
||||
"stack": ["Angular", "Tailwind CSS", "Express.js", "MariaDB"],
|
||||
"featured": false
|
||||
}
|
||||
]
|
||||
}
|
||||
26
public/content/site.json
Normal file
26
public/content/site.json
Normal file
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"title": "Johan Leroy — Portfolio",
|
||||
"description": "Développeur fullstack — NestJS, Nuxt, Next.js, Vue. Dev le jour, DJ la nuit.",
|
||||
"url": "https://johanleroy.fr",
|
||||
"keywords": [
|
||||
"johan leroy",
|
||||
"développeur fullstack",
|
||||
"nestjs",
|
||||
"nuxt",
|
||||
"nextjs",
|
||||
"vue",
|
||||
"angular",
|
||||
"tailwindcss",
|
||||
"portfolio",
|
||||
"développeur web",
|
||||
"freelance",
|
||||
"nantes"
|
||||
],
|
||||
"ogImage": "/img/logo/android-chrome-512x512.png",
|
||||
"features": {
|
||||
"hero3D": false,
|
||||
"smoothScroll": true,
|
||||
"customCursor": false,
|
||||
"partyMode": true
|
||||
}
|
||||
}
|
||||
113
public/content/skills.json
Normal file
113
public/content/skills.json
Normal file
@@ -0,0 +1,113 @@
|
||||
{
|
||||
"primary": [
|
||||
{
|
||||
"id": "languages",
|
||||
"label": "Langages",
|
||||
"items": [
|
||||
{ "name": "TypeScript", "icon": "simple-icons:typescript", "level": "primary" },
|
||||
{ "name": "JavaScript", "icon": "simple-icons:javascript", "level": "primary" },
|
||||
{ "name": "Java", "icon": "simple-icons:openjdk", "level": "primary" },
|
||||
{ "name": "Python", "icon": "simple-icons:python", "level": "primary" },
|
||||
{ "name": "PHP", "icon": "simple-icons:php", "level": "primary" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "frameworks",
|
||||
"label": "Frameworks",
|
||||
"items": [
|
||||
{ "name": "NestJS", "icon": "simple-icons:nestjs", "level": "primary" },
|
||||
{ "name": "Nuxt", "icon": "simple-icons:nuxt", "level": "primary" },
|
||||
{ "name": "Next.js", "icon": "simple-icons:nextdotjs", "level": "primary" },
|
||||
{ "name": "Vue.js", "icon": "simple-icons:vuedotjs", "level": "primary" },
|
||||
{ "name": "Angular", "icon": "simple-icons:angular", "level": "primary" },
|
||||
{ "name": "Tailwind CSS", "icon": "simple-icons:tailwindcss", "level": "primary" },
|
||||
{ "name": "Astro", "icon": "simple-icons:astro", "level": "primary" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "databases",
|
||||
"label": "Bases de données",
|
||||
"items": [
|
||||
{ "name": "MariaDB", "icon": "simple-icons:mariadb", "level": "primary" },
|
||||
{ "name": "MySQL", "icon": "simple-icons:mysql", "level": "primary" },
|
||||
{ "name": "PostgreSQL", "icon": "simple-icons:postgresql", "level": "primary" },
|
||||
{ "name": "Redis", "icon": "simple-icons:redis", "level": "primary" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "tools",
|
||||
"label": "Outils & DevOps",
|
||||
"items": [
|
||||
{ "name": "Docker", "icon": "simple-icons:docker", "level": "primary" },
|
||||
{ "name": "Git", "icon": "simple-icons:git", "level": "primary" },
|
||||
{ "name": "AWS", "icon": "simple-icons:amazonwebservices", "level": "primary" },
|
||||
{ "name": "Terraform", "icon": "simple-icons:terraform", "level": "primary" },
|
||||
{ "name": "NGINX", "icon": "simple-icons:nginx", "level": "primary" },
|
||||
{ "name": "Plesk", "icon": "simple-icons:plesk", "level": "primary" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "ide",
|
||||
"label": "IDE & Éditeurs",
|
||||
"items": [
|
||||
{ "name": "WebStorm", "icon": "simple-icons:webstorm", "level": "primary" },
|
||||
{ "name": "PhpStorm", "icon": "simple-icons:phpstorm", "level": "primary" },
|
||||
{ "name": "PyCharm", "icon": "simple-icons:pycharm", "level": "primary" },
|
||||
{ "name": "Claude Code", "icon": "simple-icons:claude", "level": "primary" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "os",
|
||||
"label": "Systèmes",
|
||||
"items": [
|
||||
{ "name": "Debian", "icon": "simple-icons:debian", "level": "primary" },
|
||||
{ "name": "Ubuntu", "icon": "simple-icons:ubuntu", "level": "primary" },
|
||||
{ "name": "macOS", "icon": "simple-icons:macos", "level": "primary" }
|
||||
]
|
||||
}
|
||||
],
|
||||
"secondary": [
|
||||
{
|
||||
"id": "languages-2",
|
||||
"label": "Autres langages",
|
||||
"items": [
|
||||
{ "name": "C#", "icon": "simple-icons:dotnet", "level": "secondary" },
|
||||
{ "name": "C++", "icon": "simple-icons:cplusplus", "level": "secondary" },
|
||||
{ "name": "Dart", "icon": "simple-icons:dart", "level": "secondary" },
|
||||
{ "name": "Kotlin", "icon": "simple-icons:kotlin", "level": "secondary" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "frameworks-2",
|
||||
"label": "Autres frameworks",
|
||||
"items": [
|
||||
{ "name": "Spring", "icon": "simple-icons:spring", "level": "secondary" },
|
||||
{ "name": "Symfony", "icon": "simple-icons:symfony", "level": "secondary" },
|
||||
{ "name": "Express.js", "icon": "simple-icons:express", "level": "secondary" },
|
||||
{ "name": "FastAPI", "icon": "simple-icons:fastapi", "level": "secondary" },
|
||||
{ "name": "Flutter", "icon": "simple-icons:flutter", "level": "secondary" },
|
||||
{ "name": "GraphQL", "icon": "simple-icons:graphql", "level": "secondary" },
|
||||
{ "name": "Vuetify", "icon": "simple-icons:vuetify", "level": "secondary" },
|
||||
{ "name": "Bootstrap", "icon": "simple-icons:bootstrap", "level": "secondary" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "databases-2",
|
||||
"label": "Autres bases",
|
||||
"items": [
|
||||
{ "name": "MongoDB", "icon": "simple-icons:mongodb", "level": "secondary" },
|
||||
{ "name": "SQLite", "icon": "simple-icons:sqlite", "level": "secondary" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "cloud",
|
||||
"label": "Cloud & services",
|
||||
"items": [
|
||||
{ "name": "Firebase", "icon": "simple-icons:firebase", "level": "secondary" },
|
||||
{ "name": "Swagger", "icon": "simple-icons:swagger", "level": "secondary" },
|
||||
{ "name": "Postman", "icon": "simple-icons:postman", "level": "secondary" },
|
||||
{ "name": "Stripe", "icon": "simple-icons:stripe", "level": "secondary" }
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user