Des systèmes qui évoluent. Une ingénierie qui dure.
Je conçois et pilote des plateformes logicielles distribuées, de la compréhension des enjeux métier jusqu'à l'architecture, au développement et à la mise en production.
Je conçois et pilote des plateformes logicielles distribuées, de la compréhension des enjeux métier jusqu'à l'architecture, au développement et à la mise en production.
Depuis 2011
Software Architecture
Technical Leadership
À propos
Je suis Lead Developer chez Hubency, où je pilote l'évolution de l'ERP interne d'un intégrateur de services spécialisé dans la gestion des déchets. Je conçois le socle technique, développe les fonctionnalités les plus complexes et travaille avec les Product Owners pour transformer les besoins métier en solutions durables et évolutives.
J'ai commencé en freelance en 2011, pendant mes études, avant de diriger une équipe de dix ingénieurs chez Haydar Technologies. Mon approche est pragmatique : comprendre avant de construire, privilégier la simplicité quand elle est possible et intégrer la sécurité dès la conception.
En dehors du travail, j'explore d'autres terrains techniques : impression 3D, robotique, homelab, intelligence artificielle exécutée en local et électronique. Je consacre également du temps à mon aquarium planté.
Ce qui me motive : comprendre les problèmes en profondeur et concevoir des systèmes utiles, robustes et capables de durer.
Expérience
Depuis 2023
Lead Developer · Hubency
Pilotage technique de l'ERP interne : architecture, socle de la plateforme, fonctionnalités les plus difficiles, arbitrage des urgences de production et coordination des prestataires.
TypeScript
Node.js
RabbitMQ
MongoDB
Redis
Keycloak
Vue 3
2019 à 2023
Lead Developer · Haydar Technologies
Direction d'une équipe de dix ingénieurs en Scrum, revue de code et mentorat. Conception et livraison de TAIPAN, ADAPA et Volkswagen d3 GUI, avec Kubernetes et CI/CD GitLab sur serveurs bare metal.
Python
Go
Node.js
GraphQL
RabbitMQ
Keycloak
Kong
Kubernetes
2016 à 2019
Développeur Full Stack · Atayen
Coordination d'une équipe de dix, en contact direct avec le client. Wallet SaTT-Token, plateforme de trading 3xchange, stabilisation et sécurisation du CRM social Iframe-apps.
PHP
Symfony
Node.js
AngularJS
MongoDB
Solidity
Web3
2011 à 2022
Consultant et développeur · Freelance
Cahier des charges et infrastructure pour Boxstage, interfaces AngularJS pour Soomville, application de gestion de dossiers pour l'agence Continental Tours, plateforme de randonnée Wanderer Guide.
Symfony
Laravel
AngularJS
Formation
2013 à 2016
Cycle d'ingénieur en informatique · ESPRIT, Tunis
Projet de fin d'études chez One Solution : la plateforme Wanderer Guide, en Symfony.
2010 à 2013
Licence en développement des systèmes informatiques · ISET CH, Tunis
Stage de fin d'études : conception et réalisation du site de l'institut.
Expertise
Architecture et génie logiciel
Distributed Systems
Software Architecture
API Design
Scalability
Security by Design
Domain Modeling
Ingénierie backend
Node.js
Express.js
TypeScript / JavaScript
MongoDB
REST APIs
Event-driven Architecture
Infrastructure et DevOps
Linux
Docker
CI/CD
Deployment & Automation
Monitoring & Observability
Infrastructure Management
Leadership technique
Technical Strategy
Architecture Decisions
Code Reviews
Developer Mentoring
Product & Engineering Collaboration
Réalisations
Hubency · depuis 2023 · Lead Developer
L'ERP interne d'un intégrateur de services de gestion des déchets : un monorepo de microservices TypeScript et Node.js, et deux front-ends Vue 3 et Quasar.
Contexte
Deux front-ends, un back-office et un extranet client, partagent la même plateforme.
Problème
Un ERP doit répondre vite à ses utilisateurs, alors qu'une partie du travail est longue : produire des PDF, envoyer des e-mails, lire des documents. Ces traitements ne doivent pas bloquer l'API.
requêtetâche asynchroneéchec
Vue générique, sans élément interne. Une requête traverse la gateway, qui s'appuie sur Keycloak, puis l'API, qui lit et écrit dans MongoDB et Redis. Un traitement long est publié dans RabbitMQ ; l'orchestrateur de workflows le distribue aux workers (PDF, mail, scraper de mails, notifications, migrations, lecture de documents par OCR), qui déposent un fichier sur le stockage de fichiers ou envoient un e-mail. Une tâche en échec part dans une dead-letter queue.
Architecture
Les traitements longs passent par RabbitMQ : l'API publie une tâche, un orchestrateur de workflows la distribue aux workers.
Les schémas, DTO et contrats vivent dans des bibliothèques partagées du monorepo (Turborepo), utilisées par tous les services.
Les données sont dans MongoDB (Mongoose, migrations), avec Redis et un stockage de fichiers.
Tests Jest, conteneurs Docker, intégration continue GitLab CI.
Ingénierie assistée par IA : agents Claude Code, revue et spécification automatisées.
Stack
TypeScript
Node.js
Express
MongoDB
Redis
RabbitMQ
Keycloak
Vue 3
Quasar
Turborepo
Jest
Docker
GitLab CI
Décisions et compromis
Les microservices ont été consolidés dans un monorepo, pour deux raisons : la gestion des versions et la simplicité des rollbacks.
Des microservices détaillés, découpés en plusieurs composants.
Pas de Kubernetes pour l'instant : ce serait du sur-dimensionnement tant que le besoin n'existe pas. La stack est déjà prête, le passage sera donc simple le jour venu.
L'infrastructure, d'abord provisionnée sur AWS avec Terraform, a été migrée vers des serveurs dédiés pour son coût.
Un système de migration de données simple.
Sécurité et fiabilité
L'authentification est confiée à Keycloak, sur lequel s'appuie la gateway.
Une tâche en échec est isolée dans une dead-letter queue.
Le monorepo garde les rollbacks simples.
Réalisation
J'ai co-conçu l'architecture microservices initiale (API, authentification, orchestrateur, mailer, services PDF et notification), puis co-piloté sa consolidation en monorepo.
Je porte le socle de la plateforme et je prends les fonctionnalités les plus difficiles de bout en bout.
Je prends les décisions d'architecture, et je cadre les demandes avec les Product Owners : faisabilité, chiffrage, spécification.
J'arbitre les urgences de production face à la roadmap, et je coordonne les prestataires externes : cadrage, revue de code, qualité de livraison.
Je suis le premier contributeur du code : 58 % des commits hors fusions (1 266 sur 2 174, novembre 2026).
Ce que j'en retiens
Je livre d'abord le MVP, et je ne cherche pas à couvrir 100 % des cas métier.
Haydar Technologies · 2019 à 2023 · Lead Developer
Un boîtier de test d'intrusion plug-and-play, conçu pour les pentesters et les RSSI.
Problème
Offrir aux pentesters et aux RSSI un test d'intrusion prêt à l'emploi : un boîtier qu'on branche, piloté depuis une interface web, avec des moteurs d'attaque qui peuvent aussi tourner à distance, sur d'autres machines. Ces moteurs doivent être authentifiés un par un.
requêtemessage MQTT
Vue d'ensemble. L'interface web et le noyau sont en Flask ; le noyau s'appuie sur Redis (cache et sessions des moteurs d'attaque) et sur MongoDB et PostgreSQL. Il échange avec les agents par un broker MQTT, dans les deux sens. Chaque agent porte des moteurs d'attaque, peut tourner à distance sur une autre machine et possède son propre certificat.
Architecture
L'architecture est proche de celle de l'ERP, mais les workers sont des agents, qui peuvent tourner à distance sur d'autres machines.
Les agents communiquent en MQTT.
Redis sert de cache et gère les sessions au niveau des moteurs d'attaque ; les données sont dans MongoDB et PostgreSQL.
Stack
Python
Flask
MQTT
Redis
RabbitMQ
MongoDB
PostgreSQL
Docker
Harbor
GitLab CI
Sécurité et fiabilité
Tout le système est géré par certificats : chaque agent a son propre certificat.
Les bonnes pratiques de sécurité sont appliquées dans le code : requêtes préparées, encodage des données, validation des entrées, contrôle des accès, journalisation.
Réalisation
J'ai pensé tout le système : l'infrastructure, dont j'ai dirigé la mise en place, et les workflows.
J'ai développé le noyau de l'application en Flask, front-end et back-end, et les moteurs d'attaque.
J'ai développé le back-office de gestion des clients et des licences.
J'ai mis en place les environnements de production, de test et de développement, avec la CI/CD GitLab et Harbor sur serveurs bare metal.
J'ai supervisé la migration sous-traitée vers une nouvelle version : cahier des charges, recette et suivi qualité des livraisons.
J'ai coordonné l'équipe : découpage, affectation des tâches, revue de code.
Haydar Technologies · Lead Developer
Une plateforme d'analyse de données et de calcul de réputation par intelligence artificielle.
Problème
Calculer une réputation par intelligence artificielle demande de collecter des données avec des crawlers, puis de les analyser : un travail réparti entre plusieurs workers, qu'il faut coordonner et suivre.
requêtetâche asynchrone
Vue d'ensemble, sur un cluster Kubernetes bare metal. L'interface React s'authentifie auprès de Keycloak (OpenID) et passe par l'API gateway Kong, configurée avec Keycloak, pour joindre l'API. L'API publie le travail dans RabbitMQ ; l'orchestrateur délègue à chaque worker, crawler ou analyse, ses tâches. Un microservice suit, calcule et stocke les statistiques des crawlers. Grafana et Prometheus assurent la supervision.
Architecture
Une architecture de type agents dès 2020, dans sa forme de l'époque : un orchestrateur délègue à chaque worker ses tâches, à travers RabbitMQ.
L'authentification repose sur Keycloak, fournisseur OpenID, configuré avec l'API gateway Kong.
L'API ajoute une couche sur Express, organisée en clean architecture.
Les statistiques des crawlers ont leur propre microservice.
Les données sont dans MongoDB et PostgreSQL ; la supervision passe par Grafana et Prometheus.
Stack
Node.js
Express
Python
React
RabbitMQ
Keycloak
Kong
MongoDB
PostgreSQL
Kubernetes
Harbor
Grafana
Prometheus
Réalisation
J'ai rédigé le document de spécification des exigences (SRS) et conçu la solution en UML : analyse fonctionnelle, architecture technique, composants à développer.
J'ai conçu et mis en œuvre l'architecture globale : microservices, broker de messages, workers et workflows.
J'ai développé l'API, une couche sur Express (Node.js) en clean architecture, et une librairie Python pour la connexion à RabbitMQ et la gestion des queues.
J'ai développé l'orchestrateur qui délègue à chaque worker ses tâches, et un microservice qui suit, calcule et stocke les statistiques des crawlers.
J'ai posé le socle de l'interface React : authentification Keycloak, menu, pages, routes, principaux formulaires et workflows.
J'ai mis en place le cluster Kubernetes sur serveurs bare metal, le registre Harbor pour les images Docker et les manifests de chaque mise en production.
Haydar Technologies · Lead Developer
Un système de distribution et de collecte de données vers les véhicules connectés. Le « GUI » du nom, c'est l'interface de monitoring que j'y ai apportée.
Contexte
Le backend qui distribue et collecte les données des véhicules connectés est réparti sur plusieurs clusters et serveurs.
Problème
Pour le surveiller, il fallait une interface de monitoring, une API pour l'alimenter, et des échanges authentifiés entre serveurs.
requêteauthentification serveur à serveur (ZeroMQ)
Vue d'ensemble. L'interface de monitoring React interroge l'API GraphQL, découpée en microservices (Apollo, Express, Node.js), qui s'adresse aux services backend du système de distribution et de collecte de données. Ces services sont répartis sur plusieurs clusters Kubernetes, et les serveurs s'authentifient entre eux avec ZeroMQ. Une partie de l'application, rétro-ingénierée, a été réécrite en Go.
Architecture
Toute l'API est en microservices GraphQL, avec Apollo sur Express et Node.js.
Les microservices sont répartis sur plusieurs clusters Kubernetes.
La partie rétro-ingénierée a été réécrite en Go.
Les données sont dans MongoDB ; l'infrastructure passe par Terraform et Ansible.
Stack
React
GraphQL
Apollo
Node.js
Express
Go
ZeroMQ
MongoDB
Kubernetes
Terraform
Ansible
Sécurité et fiabilité
Les serveurs s'authentifient entre eux avec ZeroMQ.
Les clusters Kubernetes sont sécurisés selon les bonnes pratiques.
Réalisation
J'ai apporté le front qui sert à monitorer la partie backend : c'est le « GUI » du nom.
J'ai fait la conception globale de l'application, et mis en œuvre l'architecture microservices, avec la place de chaque élément sur les différents clusters et serveurs.
J'ai développé toute l'API en microservices GraphQL (Apollo, Express, Node.js), et le socle React : menu, datatables, pages principales.
J'ai développé l'authentification serveur à serveur avec ZeroMQ, et appliqué les bonnes pratiques de sécurisation des clusters Kubernetes.
J'ai rétro-ingénieré une partie de l'application et je l'ai réécrite en Go.
Revue de code, refactorisation et correction de bugs ; coordination de l'équipe, découpage et affectation des tâches.
Vos sessions Claude Code, Codex et Mistral Vibe sous forme d'appel d'équipe animé, en direct : qui travaille, qui attend qui, qui a besoin de vous. Extension VS Code, commande terminal, application de bureau. Tourne en local, zéro token.
Firmware étendu et application Android pour un robot bipède Otto DIY, en Bluetooth : 17 danses, évitement d'obstacles, suivi de la main, un moonwalk chanté.
En dehors du code
Impression 3D
Passer du modèle à l'objet : une autre façon de concevoir, avec les contraintes de la matière.
Robotique et électronique
Un robot bipède Otto DIY, piloté en Bluetooth : j'ai étendu son firmware et écrit son application Android (otto).
Homelab et auto-hébergement
Quand un matériel n'a pas de logiciel pour Linux, je l'écris : c'est le cas du hub ARGB AsiaHorse Umbra, dont j'ai documenté le protocole (asiahorse-umbra-linux).
IA locale et LLM
Faire tourner l'intelligence artificielle en local, et outiller le travail avec les agents : agent-standup, par exemple, tourne en local, zéro token.
Aquarium planté
Un aquarium planté, auquel je consacre du temps : un système vivant, qui se règle avec patience.
Un défi technique intéressant ? Parlons-en.
Pour parler d'un sujet technique ou simplement faire connaissance, le plus simple est de m'écrire.