# 👋 Salut, moi c'est Johan 🎧 Dév le jour, DJ la nuit 💻 Développeur fullstack passionné par les technos modernes 🚀 J'aime créer des expériences web performantes, propres et scalables 📍 Basé à Nantes, France · 🌐 [johanleroy.fr](https://johanleroy.fr) · 💼 Dév fullstack @ Qualiobee > 🦊 Bienvenue sur **mon forge perso**. Je code principalement ici, loin de Microsoft. --- ## 🧠 À propos de moi - 🔭 Je bosse sur des projets en **NestJS 11**, **Nuxt 3**, **Next.js 16**, **Vue 3**, **MariaDB**, **TailwindCSS 4** - ⚙️ Stack préférée : `NestJS` + `Nuxt` / `Next.js` + `TypeORM` + `MariaDB` + `Tailwind` - ☁️ Infra AWS (ECS, Lambda, RDS, CloudFront, SES) pilotée en **Terraform** - 🛠️ Reverse proxy & hébergement : `NGINX`, `Apache`, `Plesk` - 🔐 Auth : `JWT` access+refresh, `OAuth2 PKCE`, cookies httpOnly, chiffrement AES-256-GCM - 📨 Queues & temps réel : `BullMQ`, `Redis`, `Socket.IO`, `SQS` - 🧩 J'aime structurer mes projets avec des archis propres (Strategy/Adapter, services découplés) - 🎨 Fan de UI bien léchée : design systems glass, dark/light mode, animations douces, UX fluide - 🏗️ Profil « builder » : open-source, **8+ services auto-hébergés**, projets perso en continu - 🎵 DJ & passionné de tekno, mes projets web ont parfois un petit beat qui groove 😎 --- ## 🚀 Mes projets | Projet | Description | Stack | Lien | |--------|-------------|-------|------| | **Techos** | Plateforme client + admin de gestion d'hébergement web & domaines (WHMCS), design system « Liquid Glass » clair/sombre | `Next.js 16` · `NestJS 11` · `Tailwind 4` · `Redis` · `WHMCS` | [techos-asso.fr](https://techos-asso.fr) | | **Amarea Tattoo** | Site vitrine + gestion d'un studio de tatouage, archi découplée SPA + API REST avec gestion de médias | `Vue 3` · `Vite` · `NestJS 11` · `TypeORM` · `MariaDB` | [amarea-tattoo.fr](https://amarea-tattoo.fr) | | **Lidge** | Portail d'abonnements à mes services auto-hébergés (Cloud, Vault, Git) avec SSO, tickets & workflow d'accès | `Nuxt 3` · `NestJS 11` · `TypeORM` · `MariaDB` · `JWT` | [lidge.fr](https://lidge.fr) | | **Arboretum** 🌱 | Outil **open-source** : dashboard pour piloter des worktrees git & des sessions d'agents IA, lancé en `npx git-arboretum` | `Node.js` · `Vue 3` · `TypeScript` | [git-arboretum.com](https://git-arboretum.com/) | | **Bot Discord KSauce** | Bot communautaire Discord : commandes, modération & fonctionnalités sur-mesure | `Node.js` · `TypeScript` · `Discord.js` | [ksauce.lidge.fr](https://ksauce.lidge.fr/) | | **Liberty Pour La Vie** | Site web complet pour l'association Liberty Pour La Vie | `Java` · `Spring Boot` · `Thymeleaf` · `MariaDB` | [libertypourlavie.fr](https://libertypourlavie.fr/) | | **Mon Voisin Geek** | Site vitrine _(projet archivé)_ | `Angular` · `Express.js` · `MariaDB` | — | --- ## 🛠️ Technologies & Outils ### 🧑‍💻 Langages ![Java](https://img.shields.io/badge/-Java-007396?style=for-the-badge&logo=openjdk&logoColor=white) ![JavaScript](https://img.shields.io/badge/-JavaScript-F7DF1E?style=for-the-badge&logo=javascript&logoColor=black) ![TypeScript](https://img.shields.io/badge/-TypeScript-3178C6?style=for-the-badge&logo=typescript&logoColor=white) ![Python](https://img.shields.io/badge/-Python-3776AB?style=for-the-badge&logo=python&logoColor=white) ![PHP](https://img.shields.io/badge/-PHP-777BB4?style=for-the-badge&logo=php&logoColor=white) ![C#](https://img.shields.io/badge/-C%23-239120?style=for-the-badge&logo=dotnet&logoColor=white) ![C++](https://img.shields.io/badge/-C++-00599C?style=for-the-badge&logo=cplusplus&logoColor=white) ![Dart](https://img.shields.io/badge/-Dart-0175C2?style=for-the-badge&logo=dart&logoColor=white) ![Kotlin](https://img.shields.io/badge/-Kotlin-7F52FF?style=for-the-badge&logo=kotlin&logoColor=white) ### 🧩 Frameworks & Libraries ![NestJS](https://img.shields.io/badge/-NestJS-E0234E?style=for-the-badge&logo=nestjs&logoColor=white) ![Next.js](https://img.shields.io/badge/-Next.js-000000?style=for-the-badge&logo=nextdotjs&logoColor=white) ![React](https://img.shields.io/badge/-React-61DAFB?style=for-the-badge&logo=react&logoColor=black) ![Vue.js](https://img.shields.io/badge/-Vue.js-4FC08D?style=for-the-badge&logo=vuedotjs&logoColor=white) ![Nuxt](https://img.shields.io/badge/-Nuxt-00DC82?style=for-the-badge&logo=nuxt&logoColor=white) ![Angular](https://img.shields.io/badge/-Angular-DD0031?style=for-the-badge&logo=angular&logoColor=white) ![Astro](https://img.shields.io/badge/-Astro-BC52EE?style=for-the-badge&logo=astro&logoColor=white) ![Vite](https://img.shields.io/badge/-Vite-646CFF?style=for-the-badge&logo=vite&logoColor=white) ![Pinia](https://img.shields.io/badge/-Pinia-FFD859?style=for-the-badge&logoColor=black) ![Socket.IO](https://img.shields.io/badge/-Socket.IO-010101?style=for-the-badge&logo=socketdotio&logoColor=white) ![Vuetify](https://img.shields.io/badge/-Vuetify-1867C0?style=for-the-badge&logo=vuetify&logoColor=white) ![shadcn/ui](https://img.shields.io/badge/-shadcn%2Fui-000000?style=for-the-badge&logo=shadcnui&logoColor=white) ![Spring](https://img.shields.io/badge/-Spring-6DB33F?style=for-the-badge&logo=spring&logoColor=white) ![Express.js](https://img.shields.io/badge/-Express.js-000000?style=for-the-badge&logo=express&logoColor=white) ![Symfony](https://img.shields.io/badge/-Symfony-000000?style=for-the-badge&logo=symfony&logoColor=white) ![Flutter](https://img.shields.io/badge/-Flutter-02569B?style=for-the-badge&logo=flutter&logoColor=white) ![FastAPI](https://img.shields.io/badge/-FastAPI-009688?style=for-the-badge&logo=fastapi&logoColor=white) ![GraphQL](https://img.shields.io/badge/-GraphQL-E10098?style=for-the-badge&logo=graphql&logoColor=white) ![TailwindCSS](https://img.shields.io/badge/-TailwindCSS-06B6D4?style=for-the-badge&logo=tailwindcss&logoColor=white) ![Bootstrap](https://img.shields.io/badge/-Bootstrap-7952B3?style=for-the-badge&logo=bootstrap&logoColor=white) ### 🗄️ Bases de données ![MariaDB](https://img.shields.io/badge/-MariaDB-003545?style=for-the-badge&logo=mariadb&logoColor=white) ![MySQL](https://img.shields.io/badge/-MySQL-4479A1?style=for-the-badge&logo=mysql&logoColor=white) ![SQL Server](https://img.shields.io/badge/-SQL%20Server-CC2927?style=for-the-badge&logoColor=white) ![PostgreSQL](https://img.shields.io/badge/-PostgreSQL-4169E1?style=for-the-badge&logo=postgresql&logoColor=white) ![SQLite](https://img.shields.io/badge/-SQLite-003B57?style=for-the-badge&logo=sqlite&logoColor=white) ![MongoDB](https://img.shields.io/badge/-MongoDB-47A248?style=for-the-badge&logo=mongodb&logoColor=white) ![Redis](https://img.shields.io/badge/-Redis-DC382D?style=for-the-badge&logo=redis&logoColor=white) ### ☁️ Cloud & Infrastructure ![AWS](https://img.shields.io/badge/-AWS-232F3E?style=for-the-badge&logo=amazonwebservices&logoColor=white) ![Azure](https://img.shields.io/badge/-Azure-0078D4?style=for-the-badge&logoColor=white) ![Terraform](https://img.shields.io/badge/-Terraform-7B42BC?style=for-the-badge&logo=terraform&logoColor=white) ![AWS Lambda](https://img.shields.io/badge/-AWS%20Lambda-FF9900?style=for-the-badge&logo=awslambda&logoColor=white) ![Amazon ECS](https://img.shields.io/badge/-Amazon%20ECS-FF9900?style=for-the-badge&logo=amazonecs&logoColor=white) ![Firebase](https://img.shields.io/badge/-Firebase-FFCA28?style=for-the-badge&logo=firebase&logoColor=black) ### 🧰 Outils & DevOps ![Git](https://img.shields.io/badge/-Git-F05032?style=for-the-badge&logo=git&logoColor=white) ![Gitea](https://img.shields.io/badge/-Gitea-609926?style=for-the-badge&logo=gitea&logoColor=white) ![GitLab](https://img.shields.io/badge/-GitLab-FC6D26?style=for-the-badge&logo=gitlab&logoColor=white) ![Docker](https://img.shields.io/badge/-Docker-2496ED?style=for-the-badge&logo=docker&logoColor=white) ![CI/CD](https://img.shields.io/badge/-CI%2FCD-2088FF?style=for-the-badge&logo=githubactions&logoColor=white) ![Plesk](https://img.shields.io/badge/-Plesk-52BBE6?style=for-the-badge&logo=plesk&logoColor=white) ![Postman](https://img.shields.io/badge/-Postman-FF6C37?style=for-the-badge&logo=postman&logoColor=white) ![Swagger](https://img.shields.io/badge/-Swagger-85EA2D?style=for-the-badge&logo=swagger&logoColor=black) ![JWT](https://img.shields.io/badge/-JWT-000000?style=for-the-badge&logo=jsonwebtokens&logoColor=white) ![OAuth2](https://img.shields.io/badge/-OAuth2-3EAAAF?style=for-the-badge&logo=auth0&logoColor=white) ![Stripe](https://img.shields.io/badge/-Stripe-635BFF?style=for-the-badge&logo=stripe&logoColor=white) ![Jest](https://img.shields.io/badge/-Jest-C21325?style=for-the-badge&logo=jest&logoColor=white) ![Vitest](https://img.shields.io/badge/-Vitest-6E9F18?style=for-the-badge&logo=vitest&logoColor=white) ### 🖥️ IDE & Éditeurs ![PhpStorm](https://img.shields.io/badge/-PhpStorm-000000?style=for-the-badge&logo=phpstorm&logoColor=white) ![WebStorm](https://img.shields.io/badge/-WebStorm-000000?style=for-the-badge&logo=webstorm&logoColor=white) ![PyCharm](https://img.shields.io/badge/-PyCharm-000000?style=for-the-badge&logo=pycharm&logoColor=white) ![Eclipse](https://img.shields.io/badge/-Eclipse-2C2255?style=for-the-badge&logo=eclipseide&logoColor=white) ![VS Code](https://img.shields.io/badge/-VS%20Code-007ACC?style=for-the-badge&logoColor=white) ![Android Studio](https://img.shields.io/badge/-Android%20Studio-3DDC84?style=for-the-badge&logo=androidstudio&logoColor=white) ![Claude Code](https://img.shields.io/badge/-Claude%20Code-D97757?style=for-the-badge&logo=claude&logoColor=white) ### 🧱 Serveurs & Réseaux ![NGINX](https://img.shields.io/badge/-NGINX-009639?style=for-the-badge&logo=nginx&logoColor=white) ![Apache](https://img.shields.io/badge/-Apache-D22128?style=for-the-badge&logo=apache&logoColor=white) ### 💻 OS ![Windows](https://img.shields.io/badge/-Windows-0078D6?style=for-the-badge&logoColor=white) ![macOS](https://img.shields.io/badge/-macOS-000000?style=for-the-badge&logo=macos&logoColor=white) ![Debian](https://img.shields.io/badge/-Debian-A81D33?style=for-the-badge&logo=debian&logoColor=white) ![Ubuntu](https://img.shields.io/badge/-Ubuntu-E95420?style=for-the-badge&logo=ubuntu&logoColor=white) --- ## 🎧 Côté musique Dév le jour, **DJ la nuit** 🌙 La **tekno** et la musique électronique, c'est mon échappatoire après le clavier, et ça déteint forcément sur mes projets : un petit beat qui groove n'est jamais bien loin 😎 🎶 **Mes mixs** → [soundcloud.com/skuuuu](https://soundcloud.com/skuuuu) [![SoundCloud](https://img.shields.io/badge/-SoundCloud-FF5500?style=for-the-badge&logo=soundcloud&logoColor=white)](https://soundcloud.com/skuuuu) ![DJ](https://img.shields.io/badge/-DJ%20%2F%20Mix-1DB954?style=for-the-badge&logo=ableton-live&logoColor=white) ![Vinyl](https://img.shields.io/badge/-Musique%20électronique-8E44AD?style=for-the-badge&logo=applemusic&logoColor=white) --- ## ☕ Un petit café ? Si mes projets ou mon travail open-source te sont utiles, tu peux m'offrir un café, ça fait toujours plaisir et ça alimente la prochaine nuit de code (et de mix) 🎶 [![Buy Me A Coffee](https://img.shields.io/badge/-Offrir%20un%20café-FFDD00?style=for-the-badge&logo=buymeacoffee&logoColor=black)](https://buymeacoffee.com/johanleroy) --- ## 📫 Me contacter Tu veux collaborer ? Juste discuter ? - ✉️ **Email** : contact@johanleroy.fr - 🌐 **Site web / Portfolio** : [johanleroy.fr](https://johanleroy.fr) - 💼 **LinkedIn** : [Johan Leroy](https://www.linkedin.com/in/johan-leroy-472409180/) - 🐙 **Aussi sur GitHub** : [github.com/JohanLeroy](https://github.com/JohanLeroy) --- > _"Code propre, sono sale." — Johan_ 🎶