Mon TFE d'abord, puis mes projets d'école et personnels, du plus récent au plus ancien. Le reste de mon code est sur GitHub.
FaceX
FaceX prend les présences par reconnaissance faciale : un Raspberry Pi avec une caméra à l'entrée de la classe reconnaît les étudiants en les comparant à la photo de leur carte étudiant, et professeurs et étudiants suivent les présences dans une application web.
Au départ, c'était un projet de groupe pour le cours de Projet d'intégration en troisième année, où je m'occupais de l'application web : le tableau de suivi des professeurs (cours, plages horaires, retards, statistiques par étudiant) et la mise en place des tests. Je l'ai ensuite poursuivi seul pour mon TFE, environ 300 heures de travail avec une enseignante comme cliente, pour en faire une boîte à outils pour les professeurs :
- La prise de présences depuis le téléphone du professeur lors des sorties : chaque photo part par un WebSocket authentifié (jeton de session Supabase, professeurs uniquement) vers un serveur Python qui reconnaît les visages et enregistre les présences
- Moins de faux positifs : la première version associait un visage inconnu à l'étudiant le plus ressemblant ; après avoir testé des seuils de 0,4 à 0,8, les correspondances sous 0,6 sont maintenant rejetées, avec une reconnaissance en 1 à 2 secondes
- Un anti-spoofing qui déjoue les photos et les vidéos, et aucun double enregistrement
- Des groupes d'étudiants avec leur historique, pour que les étudiants soient mélangés différemment à chaque séance
- Des notifications push web (Supabase Realtime, Edge Functions, clés VAPID) quand une présence est enregistrée ou qu'un groupe change, sans application mobile
- Une page d'administration avec des rôles (administrateur, professeur, étudiant) pour gérer et désactiver les comptes
J'ai aussi étudié la centralisation de toute la reconnaissance sur un seul serveur : les coûts en bande passante et en GPU ne tenaient pas la route, elle reste donc sur le Raspberry Pi de chaque classe, et le serveur ne gère que les présences prises au téléphone. L'application web est déployée sur Netlify, avec une preview pour chaque pull request ; le serveur tourne dans Docker sur un VPS derrière Nginx, avec Let's Encrypt, un pare-feu, Fail2Ban et SSH par clés uniquement. Aucune image de visage n'est conservée, seulement les encodages, et le TFE aborde le RGPD, puisqu'il s'agit de données de mineurs.
Dans une vraie classe de première primaire, 19 élèves sur 20 ont été reconnus ; le seul raté portait de grosses lunettes de couleur.
Code : application web · serveur de reconnaissance
CarSplit
Dans ma famille, on se partage les voitures, et CarSplit sert à répartir équitablement le carburant et l'assurance : il enregistre qui a conduit quelle voiture, sur quelle distance et avec quelle consommation, puis calcule qui doit combien à qui.
- Un boîtier sur la prise OBD-II : un ESP32 avec un transceiver CAN interroge la voiture en ISO-TP chaque seconde pendant le trajet, enregistre chaque trajet en mémoire flash et l'envoie en Wi-Fi une fois la voiture garée à la maison ; le reste du temps, il dort et ne se réveille que pour vérifier la tension de la batterie
- La consommation est estimée à partir du débit de carburant, du débit d'air ou de la pression d'admission, selon ce que la voiture expose, puis recalée sur les vrais pleins
- Une intégration Home Assistant maison, en Python, stocke les trajets, calcule la répartition avec son propre moteur de calcul testé et l'affiche dans une carte du tableau de bord ; la deuxième voiture n'a pas besoin de boîtier et est suivie via l'intégration de son constructeur
- Le conducteur est identifié quand son iPhone se connecte à la voiture, grâce à un raccourci iOS
- Testable sans voiture : des tests unitaires du firmware, un mode simulation qui fait tourner le vrai code OBD face à une voiture simulée, et un deuxième ESP32 qui joue le rôle du calculateur de la voiture sur un banc d'essai
La partie Home Assistant tourne déjà à la maison ; il reste à installer le boîtier dans la voiture.
The Better Game
Une version web non officielle de The Game, le jeu de cartes coopératif de Steffen Benndorf, développée en vibe coding pour jouer entre amis en temps réel, chacun sur son appareil.
- Le serveur fait foi pour l'état de la partie (Node.js, Express, Socket.IO) ; le client est en React, Vite et Tailwind CSS
- Les règles sont regroupées dans un package TypeScript partagé ; avec la gestion des salons, plus de 200 tests les couvrent
- Un mode solo, les variantes officielles Expert, l'extension On Fire et un mode Duel
- Des marqueurs sur les piles pour se coordonner sans parler, l'annulation du dernier coup, la reconnexion automatique, des sons générés avec la Web Audio API et des vidéos tuto générées par code

Y jouer : thebettergame.netlify.app
Proxideal
Une application web pour une agence d'intérim : les entreprises publient des offres, les intérimaires postulent et les administrateurs gèrent les comptes. SolidJS côté front, une API Express et PostgreSQL documentée avec Swagger, déployée avec Docker sur un VPS.
Ma contribution : la page de notifications, la gestion des utilisateurs avec l'envoi d'e-mails de création de compte, les offres d'emploi (création, modification, suppression), l'authentification JWT par cookies, ainsi que la mise en page de l'administration et le responsive.
Code : GitHub
Simulateur de week-end de F1
Un week-end de Formule 1 simulé en C, des essais libres et des qualifications jusqu'au sprint et à la course. Chaque voiture tourne dans son propre processus créé avec fork(), les temps au tour passent par une mémoire partagée System V, et les résultats et les points du championnat sont enregistrés en CSV et en JSON.
KIR4
Un petit robot espion sur deux roues, inspiré des drones de Watch Dogs 2 et de Rainbow Six Siege, construit avec un camarade pour notre projet de fin de secondaire. Il se pilote en Wi-Fi avec un joystick virtuel, depuis le navigateur d'un téléphone ou d'un ordinateur, et diffuse sa caméra en direct.
- Une coque imprimée en 3D à partir du modèle libre ZeroBot Pro, en PLA noir avec des pneus en filament flexible rouge pour l'adhérence
- Un Raspberry Pi Zero W avec sa caméra, deux moteurs DC et leur contrôleur, deux batteries 18650 avec un chargeur USB, et un convertisseur ADC pour lire la tension de la batterie
- Nous avons dessiné le circuit, testé chaque composant au multimètre, puis tout soudé et assemblé
- Un serveur Node.js sur le Pi commande les moteurs en PWM, diffuse la caméra, prend des photos, allume ses LED et remonte la tension de la batterie et la température du processeur


PC sur mesure
J'ai monté des PC sur mesure pour plus de dix amis, de l'aide au choix des pièces jusqu'à l'assemblage. Chaque config avait ses propres besoins, du PC gamer à la station de travail : choisir des composants compatibles sans dépasser le budget, tout assembler, puis faire tourner la machine au mieux.