refonte: portfolio statique Astro (design moderne développeur)
Some checks failed
Deploy production / build-deploy (push) Failing after 56s

- Remplace l'ancien Astro hybrid + admin par un site one-page statique (sortie static)
- Thème clair/sombre sans flash, contenu typé (src/data/content.ts), zéro admin
- Icônes simple-icons (SVG monochrome), polices auto-hébergées (RGPD)
- SEO complet : canonical, Open Graph, Twitter Card, JSON-LD Person, robots.txt, sitemap.xml, image OG 1200x630
- CI Gitea de déploiement FTPS vers Plesk (.gitea/workflows/prod.yml)
This commit is contained in:
Johan LEROY
2026-06-19 16:03:09 +02:00
parent dc4e3820c4
commit ce17bf590b
189 changed files with 1836 additions and 9872 deletions

View File

@@ -1,116 +0,0 @@
{
"items": [
{
"id": "almeria",
"company": "Almeria",
"logo": "/api/files/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": "/api/files/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": "/api/files/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": "/api/files/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": "/api/files/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": "/api/files/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"
]
}
}

View File

@@ -1,35 +0,0 @@
{
"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"
}
]
}

View File

@@ -1,8 +0,0 @@
{
"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" }
]
}

View File

@@ -1,43 +0,0 @@
{
"name": "Johan Leroy",
"title": "Développeur",
"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": "/api/files/img/pp/pp3.png",
"photos": [
"/api/files/img/pp/pp1.png",
"/api/files/img/pp/pp2.png",
"/api/files/img/pp/pp3.png"
],
"roles": [
"Dev",
"DJ",
"Dev"
],
"cta": [
{
"label": "Télécharger mon CV",
"href": "/api/files/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",
"linkedin": "https://www.linkedin.com/in/johan-leroy-472409180/",
"website": "https://johanleroy.fr"
},
"cv": "/api/files/assets/cv.pdf"
}

View File

@@ -1,71 +0,0 @@
{
"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": "/api/files/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": "/api/files/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": "/api/files/img/projet/monvoisingeek.png",
"category": "web",
"status": "archived",
"stack": ["Angular", "Tailwind CSS", "Express.js", "MariaDB"],
"featured": false
}
]
}

View File

@@ -1,26 +0,0 @@
{
"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": "/api/files/img/logo/android-chrome-512x512.png",
"features": {
"hero3D": false,
"smoothScroll": true,
"customCursor": false,
"partyMode": true
}
}

View File

@@ -1,113 +0,0 @@
{
"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" }
]
}
]
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

@@ -1,36 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" fill="none">
<defs>
<filter id="glow" x="-50%" y="-50%" width="200%" height="200%">
<feGaussianBlur stdDeviation="1.2" result="blur" />
<feMerge>
<feMergeNode in="blur" />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
<linearGradient id="grad" x1="0" y1="0" x2="1" y2="1">
<stop offset="0%" stop-color="#00F0FF" />
<stop offset="100%" stop-color="#B967FF" />
</linearGradient>
</defs>
<rect
x="4" y="4" width="56" height="56" rx="10"
fill="#0A0A0F"
stroke="url(#grad)"
stroke-width="2"
/>
<g filter="url(#glow)">
<path
d="M38 14 L38 40 Q38 48 30 48 Q22 48 22 40"
stroke="#00F0FF"
stroke-width="4"
stroke-linecap="round"
fill="none"
/>
<circle cx="38" cy="14" r="3" fill="#FF2A6D" />
</g>
<line x1="8" y1="52" x2="56" y2="52" stroke="#00F0FF" stroke-width="0.5" opacity="0.3" />
<line x1="8" y1="54" x2="56" y2="54" stroke="#FF2A6D" stroke-width="0.5" opacity="0.3" />
</svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

View File

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 20 KiB

View File

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 39 KiB

View File

Before

Width:  |  Height:  |  Size: 8.4 KiB

After

Width:  |  Height:  |  Size: 8.4 KiB

View File

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

View File

Before

Width:  |  Height:  |  Size: 57 KiB

After

Width:  |  Height:  |  Size: 57 KiB

View File

@@ -0,0 +1,14 @@
KIT LOGO — Johan Leroy (prêt pour le web)
Logo détouré (vraie transparence) à partir de ../../logo.png, puis décliné aux bons formats.
- logo.png Logo du header — JL vert, fond TRANSPARENT (392x320). OK thème clair ET sombre.
- logo-master.png Master carré 1024x1024 transparent (pour régénérer d'autres tailles).
- favicon-16x16.png Favicon 16 (transparent)
- favicon-32x32.png Favicon 32 (transparent)
- favicon.ico Favicon multi-tailles 16/32/48 (transparent)
- apple-touch-icon.png 180x180, fond sombre #09090b (iOS ignore la transparence)
- android-chrome-192x192.png 192, fond sombre #09090b (maskable, zone de sécurité)
- android-chrome-512x512.png 512, fond sombre #09090b (maskable)
Source d'origine (fond damier non transparent) conservée à la racine du kit : ../../logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 615 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 269 KiB

BIN
public/images/logo/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

BIN
public/images/og.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

View File

Before

Width:  |  Height:  |  Size: 862 KiB

After

Width:  |  Height:  |  Size: 862 KiB

View File

Before

Width:  |  Height:  |  Size: 801 KiB

After

Width:  |  Height:  |  Size: 801 KiB

View File

Before

Width:  |  Height:  |  Size: 1.6 MiB

After

Width:  |  Height:  |  Size: 1.6 MiB

View File

Before

Width:  |  Height:  |  Size: 2.2 MiB

After

Width:  |  Height:  |  Size: 2.2 MiB

View File

Before

Width:  |  Height:  |  Size: 221 KiB

After

Width:  |  Height:  |  Size: 221 KiB

View File

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 54 KiB

View File

Before

Width:  |  Height:  |  Size: 82 KiB

After

Width:  |  Height:  |  Size: 82 KiB

View File

Before

Width:  |  Height:  |  Size: 130 KiB

After

Width:  |  Height:  |  Size: 130 KiB

View File

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 23 KiB

View File

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 37 KiB

View File

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB

View File

Before

Width:  |  Height:  |  Size: 72 KiB

After

Width:  |  Height:  |  Size: 72 KiB

View File

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 27 KiB

View File

Before

Width:  |  Height:  |  Size: 88 KiB

After

Width:  |  Height:  |  Size: 88 KiB

View File

Before

Width:  |  Height:  |  Size: 131 KiB

After

Width:  |  Height:  |  Size: 131 KiB

View File

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 36 KiB

View File

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 19 KiB

View File

Before

Width:  |  Height:  |  Size: 7.9 KiB

After

Width:  |  Height:  |  Size: 7.9 KiB

View File

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 7.5 KiB

View File

Before

Width:  |  Height:  |  Size: 111 KiB

After

Width:  |  Height:  |  Size: 111 KiB

View File

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

View File

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 35 KiB

View File

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

View File

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

View File

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 45 KiB

View File

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB

View File

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

View File

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 31 KiB

View File

Before

Width:  |  Height:  |  Size: 76 KiB

After

Width:  |  Height:  |  Size: 76 KiB

View File

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

View File

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 36 KiB

View File

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

View File

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

View File

Before

Width:  |  Height:  |  Size: 133 KiB

After

Width:  |  Height:  |  Size: 133 KiB

View File

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 37 KiB

View File

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 23 KiB

View File

Before

Width:  |  Height:  |  Size: 6.3 KiB

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 526 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 881 B

4
public/robots.txt Normal file
View File

@@ -0,0 +1,4 @@
User-agent: *
Allow: /
Sitemap: https://johanleroy.fr/sitemap.xml

9
public/sitemap.xml Normal file
View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://johanleroy.fr/</loc>
<lastmod>2026-06-19</lastmod>
<changefreq>monthly</changefreq>
<priority>1.0</priority>
</url>
</urlset>