▣
Agenda partagé
React / TypeScript / NestJS / TypeORM
Application d’agenda collaboratif : chaque utilisateur gère ses événements, partage son calendrier et invite d’autres personnes à ses événements.
Stack & outils
React
TypeScript
React Router
Axios
NestJS
TypeORM
SQLite
JWT
Passport
bcrypt
class-validator
Mes interventions
- Front-end React + TypeScript : vue calendrier, formulaire d’événement, centre de notifications et routes protégées
- API NestJS en modules : authentification, événements, partages de calendrier et invitations, y compris groupées
- Inscription, connexion et changement de mot de passe : JWT avec Passport, mots de passe hachés avec bcrypt
- Persistance avec TypeORM sur SQLite
Sécurité · OWASP
-
A01
Contrôle d’accès défaillant : Un utilisateur ne peut modifier que ses propres partages et n’accepte que ceux qui lui sont destinés
-
A05
Injection : Données reçues validées par des DTO class-validator (ValidationPipe)
-
A07
Défaillances d’authentification : Mots de passe hachés avec bcrypt, ancien mot de passe vérifié avant tout changement
Enjeu : Organiser un emploi du temps à plusieurs, avec des droits de partage clairs.
▣
Job Bot — veille d’offres d’emploi
TypeScript / Playwright / Prisma / CRON
Outil personnel qui collecte chaque jour les offres d’emploi de plusieurs sites, les filtre selon mon profil et m’envoie une synthèse par e-mail.
Stack & outils
TypeScript
Node.js
Playwright
Prisma
SQLite
node-cron
Nodemailer
Zod
Mes interventions
- Collecte multi-sources : API France Travail et Adzuna, Indeed, HelloWork et Remotive (Playwright pour les pages web)
- Filtrage par niveau et localisation, score de compatibilité avec mon profil, page de consultation filtrable
- Exécution planifiée par CRON, stockage Prisma, notification par e-mail et tests unitaires
Tests
-
Unitaires
Calcul du score de compatibilité et classement des offres par distance, avec le runner natif de Node.js
-
Réponses d’API simulées
Normalisation des réponses Apify et SerpAPI, et extraction des offres HelloWork (JSON Next.js) et Indeed (JSON-LD) à partir de données simulées, sans appel réseau
Enjeu : Automatiser une recherche répétitive et ne garder que les offres vraiment pertinentes.
GestaColoc
Node.js / Express / React / PostgreSQL
Application de gestion de colocation inspirée de Tricount : dépenses partagées, factures communes, tâches ménagères et invités, avec une interface pensée pour le mobile.
Stack & outils
Node.js
Express
React
Vite
PostgreSQL
Docker
Mes interventions
- API REST Express : authentification, groupes, dépenses, factures communes, tâches, invités et désaccords
- Interface React + Vite mobile-first : soldes, tâches et profil de chaque colocataire, panneau d’administration
- Base PostgreSQL dans un conteneur Docker, schéma et données de démonstration créés au démarrage
Enjeu : Simplifier le partage des dépenses et l’organisation de la vie en colocation.
▣
Ce portfolio
Symfony 7.4 / Twig / PHPUnit / VPS
Le site que vous consultez : une application Symfony déployée sur un VPS OVH que j’administre.
Stack & outils
PHP 8.2
Symfony 7.4
Twig
AssetMapper
PHPUnit
GitHub Actions
Nginx
Let’s Encrypt
Mes interventions
- Contenu structuré dans le contrôleur et rendu avec Twig, styles CSS écrits à la main
- Tests fonctionnels PHPUnit qui vérifient chaque section de la page
- Pipeline GitHub Actions : tests, puis audit des CVE des dépendances PHP et JavaScript à chaque push et chaque semaine ; une faille connue bloque la mise en production
- Déploiement automatique sur VPS : Nginx, PHP-FPM et certificat HTTPS Let’s Encrypt
Tests
-
Fonctionnels
PHPUnit (WebTestCase) : chaque page est appelée en HTTP et son contenu vérifié, y compris la réponse 404 d’une catégorie inconnue
-
Intégration continue
Tests exécutés par GitHub Actions à chaque push : un échec bloque le déploiement
Sécurité · OWASP
-
A02
Mauvaise configuration de sécurité : Production sans mode debug, secret généré sur le serveur et vérification que le profiler Symfony n’est pas exposé
-
A03
Chaîne d’approvisionnement logicielle : Audit des CVE des dépendances PHP et JavaScript en CI, qui bloque la mise en production
-
A04
Défaillances cryptographiques : HTTPS avec certificat Let’s Encrypt sur le VPS
-
A05
Injection : Échappement automatique des sorties Twig contre le XSS
Enjeu : Présenter mon parcours avec la même exigence de qualité que mes projets.
▣
Site CV administrable
Symfony / Doctrine / GitHub Actions
Site personnel en Symfony dont le contenu (compétences, expériences, formations) se gère depuis un espace d’administration protégé.
Stack & outils
PHP
Symfony
Doctrine
Twig
Security
Bootstrap
GitHub Actions
Mes interventions
- Entités Doctrine pour les compétences, expériences, formations et utilisateurs
- Inscription, connexion et espace d’administration avec Symfony Security
- Déploiement automatique sur VPS par GitHub Actions via SSH
Sécurité · OWASP
-
A01
Contrôle d’accès défaillant : Espace d’administration réservé aux utilisateurs connectés avec Symfony Security
Enjeu : Mettre à jour son CV en ligne sans toucher au code.
▣
Carnet d’adresses
Symfony / Doctrine / Authentification
Application Symfony de gestion de contacts, accessible après inscription et connexion.
Stack & outils
PHP
Symfony
Doctrine
Twig
Security
EasyAdmin
Mes interventions
- Entités Doctrine Contact et Utilisateur, logique métier isolée dans un service
- Création, modification et suppression des contacts ; inscription et connexion avec Symfony Security
- Import de contacts depuis un fichier CSV par une commande Symfony, et export CSV
Enjeu : Maîtriser le cycle complet d’une application Symfony sécurisée.
▣
Studio de la Tanière
Next.js / React / MySQL / Site vitrine
Site vitrine d’une maison d’édition : présentation du studio, catalogue de livres, page d’achat, contact et mentions légales.
Stack & outils
Next.js
React
JavaScript
MySQL
CSS Modules
Mes interventions
- Pages construites avec l’App Router de Next.js et des CSS Modules
- Catalogue des ouvrages avec une page dédiée par livre
- Préparation du back-end avec une base MySQL
Enjeu : Donner une vitrine moderne et rapide à une petite maison d’édition.
Hackathon Pôle emploi — Trouve ton festival
Next.js / TypeScript / NestJS / Open data
Hackathon organisé par Pôle emploi les 12 et 13 octobre 2023 : en équipe, nous avons conçu une application grand public qui exploite le jeu de données ouvert des festivals en France (data.gouv.fr).
Stack & outils
Next.js
TypeScript
NestJS
Prisma
Tailwind CSS
Open data
Mes interventions
- Front-end Next.js / TypeScript : page de détail d’un festival avec routage dynamique par identifiant
- Ajout d’un événement depuis l’interface, relié à l’API NestJS
- Préparation en amont des briques communes : profil utilisateur et upload d’image
Enjeu : Livrer en deux jours une application qui rend des données publiques utiles au grand public.