00 — Architecte logiciel · Développeur fullstack senior

Gaël Laloum

Je conçois et livre des applications web de bout en bout : architecture propre, CI/CD dès le premier jour, et un code que votre équipe peut reprendre après moi.

En mission · ouvert aux missions freelance et aux CDI · remote de préférence

14+
ans d'expérience
6
entreprises
875+
tests automatisés

01 — Parcours

Mes expériences professionnelles

Postes en CDI et missions freelance, du plus récent au plus ancien. Chaque fiche se déplie sur le contexte, les réalisations et la stack.

01

Architecte & développeur fullstack freelance

@ Ctrl+Shift

En freelance pour Ctrl+Shift, je prends en charge des applications TypeScript de l'architecture à la mise en production, de la boutique Shopify headless à l'outil sur mesure. Genaveh, chocolatier luxembourgeois, a fait appel à moi trois fois en moins d'un an.

missions livrées
4
missions confiées par le même client
3
applications en production
2
TypeScriptReact 19Node.jsShopifyGraphQLTanStack StartRemixPrismaDockerGitLab CI
janv. 2025 → Présent
1 an 9 mois
France · remote
  1. oct. 2026 1 semaine

    Référencement Google & moteurs IA

    Genaveh · client récurrent

    ↓ Voir les détails

    Sept mois après la refonte de leur boutique, Genaveh revient pour être mieux compris des moteurs de recherche et des assistants IA. Six types de données structurées et un /llms.txt, générés depuis Shopify.

    types de données structurées schema.org
    6
    tests unitaires
    33
    nouvelle dépendance npm
    0
    TypeScriptReact 19TanStack StartShopify Storefront APIGraphQLschema.orgJSON-LDRsbuildNode.js
    Le problème

    Pour un moteur de recherche ou un assistant IA, une page produit n’est que du texte : rien ne dit explicitement qu’il s’agit d’un produit, à quel prix, en stock ou non, vendu par quelle marque et dans quelles boutiques. Sur le site de Genaveh, aucune donnée structurée n’était publiée et /llms.txt renvoyait une 404.

    Ce que j’ai livré
    • 6 types schema.org : Organization et WebSite sur tout le site, Store pour les deux boutiques physiques, Product sur les fiches produit, BreadcrumbList sur les pages à fil d’Ariane, FAQPage sur la page contact
    • Un /llms.txt dynamique : description de la boutique, collections, boutiques et pages clés, régénéré depuis Shopify et mis en cache une heure
    • Un gain de performance au passage : la bibliothèque de cartographie Mapbox se retrouvait dans le bundle principal à cause d’un import ; elle n’est plus chargée que sur la page contact
    • Fiable : 33 tests unitaires sur la génération, sans aucune dépendance ajoutée
    Sous le capot
    • Générateurs purs : chaque type est une fonction qui prend les données Shopify déjà chargées par la page et renvoie du JSON-LD, testable sans serveur ; le rendu passe par le head() du routeur TanStack, qui l’échappe côté serveur
    • Une seule source de vérité : le fil d’Ariane visible et son JSON-LD sont construits par la même fonction, mêmes niveaux, mêmes libellés, mêmes URL localisées
    • Prix identiques à l’affichage : Offer pour un produit à variante unique (avec SKU et code-barres GTIN), AggregateOffer sinon, disponibilité PreOrder pour les produits en précommande
    • Parsing strict : adresses et horaires des boutiques sont lus depuis le store locator ; un format non reconnu est omis, jamais deviné
    • URL canonique en constante : derrière le proxy, la production génère des URL en http:// ; aucun lien absolu ne dépend de la requête
    • FAQ : le balisage s’active tout seul dès que des questions sont publiées dans Shopify
    Dans la foulée
    • Migration Vite → Rsbuild : montée de version de TanStack Start, sortie Nitro remplacée par un serveur srvx, plugins Paraglide et Sentry passés en variante Rspack
    • Barre de livraison offerte dans le panier, avec seuil selon le pays de livraison, en trois langues
    • Précommandes des calendriers de l’Avent, signalées sur les boutons d’achat et transmises à la commande
    Choix assumés
    Option écartéePourquoi
    Recopier la FAQ dans le codeLe balisage est généré depuis la section FAQ du CMS : une seule saisie, aucun risque d’écart avec la page
    Déduire les horaires d’un texte libreUne donnée fausse dans Google est pire qu’une donnée absente
    URL absolues tirées de la requêteEn production, elles sortent en http:// derrière le proxy
    Vitest ou JestLe runner de tests natif de Node suffit : zéro dépendance, rien à maintenir
  2. janv. 2026 → mars 2026 2 mois

    Boutique Shopify headless

    Genaveh

    ↓ Voir les détails

    La boutique en ligne de Genaveh, chocolatier luxembourgeois, reconstruite en front sur mesure au-dessus de Shopify. Shopify garde le catalogue, le paiement et les commandes ; le site, lui, est rendu côté serveur en React, en trois langues, et l'équipe du client compose ses pages sans passer par un développeur.

    sections de contenu pilotées depuis Shopify
    18
    domaines métier isolés dans un monorepo
    6
    langues : français, anglais, allemand
    3
    TypeScriptReact 19TanStack StartTanStack QueryShopify Storefront APIGraphQLTailwind CSSParaglide JSRedisNodemailerSentryPlaywrightStorybookTurborepoDocker
    Le problème

    Un thème Shopify classique enferme la boutique dans son moteur de templates : mises en page figées, peu de contrôle sur le rendu, et chaque nouvelle page de contenu demande une intervention technique. Pour une marque qui vend en France, au Luxembourg et en Allemagne, il fallait un site sur mesure sans perdre ce que Shopify fait bien : catalogue, paiement, commandes.

    Ce que nous avons construit

    Un storefront headless développé en binôme : Shopify sert de back-office, le front est une application React rendue côté serveur.

    • Parcours d’achat complet : catalogue, fiches produit à variantes (sélection reflétée dans l’URL), collections filtrables et triables, recherche prédictive, panier en tiroir et en page avec mises à jour optimistes, Shop Pay
    • Espace client : inscription, connexion, activation, mot de passe oublié, historique et suivi de commandes, carnet d’adresses
    • Contenu en autonomie : 18 sections (hero, bannières, sliders produits, FAQ, avis Trustpilot, carte des boutiques Mapbox…) que l’équipe du client assemble page par page depuis l’admin Shopify, sans redéploiement
    • International : français, anglais, allemand ; 245 pays, chacun avec sa devise et ses prix
    • Contact sécurisé : formulaire protégé par Cloudflare Turnstile vérifié côté serveur, e-mails HTML dans la langue du visiteur
    Sous le capot

    Un monorepo découpé par domaine métier plutôt que par type de fichier :

    apps/web        TanStack Start : routes, rendu serveur, server functions
    domains/        6 domaines, chacun avec ses requêtes, composants et traductions
      account · acquisition · commerce · discovery · payment · platform
    packages/       socle partagé
      graphql · storefront · design-system · paraglide · environment · mail
    

    Une fonctionnalité vit dans un seul dossier : le panier dans payment, la recherche dans discovery, les comptes clients dans account. Chaque domaine n’expose que ses composants d’écran et ses fonctions serveur.

    • Rendu serveur : pages rendues par TanStack Start, appels à Shopify dans des server functions ; la clé privée de l’API Storefront ne quitte jamais le serveur
    • Données typées : 78 requêtes, mutations et fragments GraphQL, types générés depuis le schéma Shopify
    • Pages composables : les sections sont des metaobjects Shopify référencés par un metafield ; chaque type est rendu par son composant React
    • Cache : couche Redis devant l’API Storefront, désactivée en développement
    • Traductions : Paraglide JS, messages compilés en fonctions typées, une clé manquante casse le build
    • Exploitation : Sentry, consentement cookies, analytics (Shopify, Meta Pixel, Klaviyo, Rybbit), tests e2e Playwright, image Docker de production
    Choix assumés
    Option écartéePourquoi
    Thème Shopify LiquidRendu et mise en page bornés par le moteur de thème
    Pages codées en durChaque nouvelle page aurait demandé un développeur ; les sections metaobjects rendent l’équipe autonome
    Appels Shopify depuis le navigateurExpose la clé d’API et empêche de mettre les réponses en cache côté serveur
    Découpage par type de fichierUne fonctionnalité éclatée dans tout le dépôt ; par domaine, elle tient dans un dossier
  3. janv. 2026 1 semaine

    Application Shopify de facturation

    Genaveh

    ↓ Voir les détails

    Une application Shopify qui génère et envoie automatiquement une facture PDF aux couleurs de la boutique, dans la langue du client, à chaque commande payée. Conçue, développée et mise en production en autonomie, de l'architecture au déploiement.

    intervention manuelle par commande payée
    0
    langues : français, anglais, allemand
    3
    mises en page d'email personnalisables
    6
    TypeScriptRemixReactShopifyGraphQLPDFKitNode.jsPrismaNodemailerReact EmailZodTipTapParaglide JSDockerGitLab CI
    Le problème

    Shopify n’envoie pas de facture PDF au client final : le marchand doit la produire et l’expédier lui-même, commande par commande. Une tâche répétitive, source d’oublis, et rarement traduite dans la langue de l’acheteur.

    Ce que j’ai construit

    Une application intégrée à l’interface d’administration Shopify, qui prend tout en charge dès le paiement :

    • Zéro intervention — chaque commande payée déclenche la génération de la facture et son envoi par email au client
    • Aux couleurs de la boutique — logo, couleurs, police, mentions légales et 6 mises en page d’email au choix
    • Dans la langue du client — factures et emails en français, anglais et allemand, langue détectée depuis la commande
    • Pilotable depuis Shopify — liste des commandes avec recherche, téléchargement ou renvoi d’une facture, éditeur de texte riche pour les emails
    • Fiable — un webhook relivré par Shopify ne renvoie pas une facture déjà envoyée ; une panne SMTP passagère déclenche une nouvelle tentative automatique
    • En production — déployée automatiquement par un pipeline CI/CD
    Sous le capot
    Commande payée
    └─ Webhook orders/paid       → vérification HMAC + idempotence par ID de livraison
    └─ Admin API GraphQL         → commande complète (lignes, taxes, adresses, client)
    └─ PDFKit                    → facture générée en flux, dans la langue du client
    └─ Nodemailer + React Email  → envoi SMTP, PDF en pièce jointe
    
    • Remix (loaders / actions) — toute la logique métier côté serveur ; les modules .server.ts ne sont jamais embarqués dans le bundle client
    • Intégration Shopify — OAuth, sessions et vérification HMAC via @shopify/shopify-app-remix ; interface embarquée dans l’Admin avec Polaris et App Bridge
    • Données — configuration stockée dans les metafields de la boutique ; Prisma + SQLite ne conservent que les sessions et le suivi des webhooks
    • Sécurité — mot de passe SMTP chiffré en AES-256-GCM, aucune donnée client ni commande persistée, webhooks de conformité RGPD gérés
    • Résilience SMTP — délais bornés (10 s à la connexion, 30 s sur le socket) et réponse 503 sur erreur transitoire pour que Shopify relance
    • Formulaires et contenu — validation Zod + React Hook Form, éditeur riche TipTap, libellés de facture traduits avec Paraglide JS
    • Déploiement — image Docker multi-étapes, pipeline GitLab CI vers Dokploy, derrière Cloudflare ; documentation API générée avec TypeDoc
    Choix assumés
    ChoixPourquoi
    Metafields Shopify plutôt qu’une base dédiéeLa configuration suit la boutique : aucune donnée marchand à héberger ni à migrer
    PDF généré en fluxAucun fichier temporaire sur le serveur : la facture part directement en téléchargement ou en pièce jointe
    Idempotence par ID de webhookShopify peut livrer plusieurs fois le même événement : le client ne reçoit qu’une facture
  4. janv. 2025 → avr. 2025 3 mois

    Convertisseur InDesign → Web

    Projet interne

    ↓ Voir les détails

    Un moteur qui transforme une maquette Adobe InDesign en page web fidèle au pixel près. Le texte reste du vrai texte — sélectionnable, indexable, accessible — là où les solutions classiques produisent une image ou un PDF figé.

    tests automatisés
    ~200
    types de fichiers InDesign interprétés
    7
    dépendances de production
    5
    TypeScriptReact 19ViteNode.jsfast-xml-parseradm-zipsharpVitest
    Le problème

    Plaquettes, catalogues, magazines : la mise en page professionnelle se fait sur Adobe InDesign. Pour publier ces documents sur le web, on se contente souvent d’un PDF ou d’une capture — lourds, illisibles sur mobile, invisibles pour Google comme pour les lecteurs d’écran.

    Ce que j’ai construit

    Un convertisseur qui lit le fichier source InDesign (.idml) et le restitue en composants React positionnés au pixel près :

    • Fidélité visuelle — textes, images, dégradés, formes vectorielles, transparences et polices d’origine
    • Contenu vivant — le texte se sélectionne, se copie, se recherche et s’indexe
    • Adaptatif — la page s’ajuste à la largeur de l’écran sans déformer la typographie
    • Fiable — ~200 tests automatisés sur la logique de conversion, soit ~0,7 ligne de test par ligne de code
    • Léger — 5 dépendances de production, aucun service externe
    Sous le capot

    Trois phases strictement séparées, chacune avec ses propres types TypeScript :

    .idml (ZIP de XML)
    └─ Parse    → ParsedIdml        valeurs InDesign brutes (points, références)
    └─ Resolve  → ResolvedDocument  valeurs prêtes pour le web (px, CSS)
    └─ Render   → composants React  HTML à positionnement absolu
    

    Un bug se localise immédiatement : une valeur en pixels fausse vient forcément du résolveur, jamais du parseur ni des composants.

    • Lecture du format — décompression en mémoire et parsing de 7 types de fichiers XML (pages, textes, styles, couleurs, polices…) avec fast-xml-parser
    • Géométrie — matrices affines 2D pour passer du repère de la double page à celui de chaque page, groupes imbriqués compris
    • Styles — reproduction de la cascade à 4 niveaux d’InDesign et de l’héritage basedOn ; les chaînes d’héritage sont aplaties une fois par document, pas à chaque fragment de texte
    • Couleurs — conversion CMJN → RVB, teintes et dégradés linéaires (angle InDesign → CSS)
    • Images — trois modes de stockage (base64, embarqué, lié) et conversion TIFF → JPEG via sharp
    • Mise à l’échelle — transform: scale() plutôt que des pourcentages : seule primitive CSS qui redimensionne aussi tailles de police, interlignages et approches
    Choix assumés
    Option écartéePourquoi
    Navigateur headless / PDFProduit une image figée, pas un DOM interrogeable
    CanvasNi sélection de texte, ni accessibilité
    Flexbox / GridInDesign ne connaît que des coordonnées : le positionnement absolu est le seul mapping 1:1 sans perte
02

Architecte logiciel

@ Exodata

R&D et définition des standards techniques. Conception d'un socle applicatif en Clean Architecture, mise en place de la stratégie DevOps complète, et livraison de plusieurs produits métier fullstack.

Clean ArchitecturePHPSymfonyJavaVue.jsTypeScriptFlutterDartPostgreSQLDockerGitLab CI/CDTraefikNginx
nov. 2020 → juil. 2023
2 ans 8 mois
France · remote
↓ Voir les détails

Contexte

Poste en CDI consacré à la R&D sur les nouvelles technologies : définir les bonnes pratiques au sein de l’entreprise, puis architecturer et développer les logiciels qui en découlent.

Projets clés

Socle applicatif Clean Architecture

Industrialisation des futurs développements via un framework interne PHP. Séparation stricte Domain/Infrastructure avec une gestion générique des sources de données clients — la même application fonctionne quelle que soit la base du client.

Stratégie DevOps complète

Déploiement d’un GitLab self-hosted, définition d’une pipeline CI/CD (tests automatisés, code coverage, qualité de code, releases automatiques) et containerisation Docker avec reverse proxy Traefik.

  • PHPUnit : tests unitaires et d’intégration du domaine métier PHP et de la couche Symfony — exécutés en CI à chaque merge request.
  • Vitest + Vue Test Utils : tests unitaires des composants et composables Vue.js 3.
  • flutter_test : tests unitaires des services et widgets Flutter pour l’app LHI.
Progiciel métier Assurance

Application fullstack en Clean Architecture pour le secteur de l’assurance :

  • Back : domaine métier en PHP pur, infrastructure Symfony
  • Front : Vue.js 3 + TypeScript
  • Base : PostgreSQL
Application mobile LHI — ARS Réunion

Portail Flutter/Dart permettant à des agents de terrain de déclarer des logements insalubres et de suivre leurs dossiers.

  • Gestion des dossiers via API REST
  • Intégration GitLab en temps réel (consultation projets, création d’issues)
  • Mode hors connexion complet
Dédoublonnage de base de données

Intervention sur un système de déduplication à grande échelle développé en Java.

03

Consultant Java / Java EE

@ Akka Technologies · Thales

Mission en régie chez Thales sur une application web de gestion des vulnérabilités logicielles pour le service MCS (Maintien en Condition de Sécurité), développée en méthode agile SCRUM.

JavaGroovyJ2EEJavaScriptPostgreSQLMavenJenkinsSonarQubeSeleniumGitBootstrapSCSS
sept. 2018 → juin 2019
9 mois
Gennevilliers, France
↓ Voir les détails

Contexte

Application web Groovy pour le service MCS de Thales, permettant de collecter et analyser des bulletins de sécurité provenant de sources officielles (CERT-FR, CERT-IST, RedHat…), de les croiser avec les installations clients, et de produire un scoring de criticité avec des recommandations de mise à jour.

Réalisations

  • Collecte automatisée : scripts shell avec curl et parsing regex pour récupérer les bulletins de sécurité multi-sources.
  • Scoring de criticité : comparaison des vulnérabilités détectées avec les installations clients pour établir un niveau d’alerte et des conseils de mise à jour.
  • Développement de features : correction de bugs et ajout de fonctionnalités sur la web app Groovy.
  • TDD : tests unitaires JUnit, couverture de code SonarQube, build et déploiement Jenkins.
  • Tests fonctionnels : scripts Selenium pour tests automatisés multi-navigateurs (compatibilité JS/CSS).
  • Migrations SQL : rédaction et exécution de scripts de migration de base de données.
  • Documentation : rédaction de documentation technique et utilisateur.
04

Analyste Programmeur

@ Misys

Développement de plugins Eclipse pour démocratiser l'accès à une API de pricing de modèles financiers auprès de profils non-développeurs (Quants), puis déploiement d'une solution PaaS basée sur Eclipse CHE.

Java SEJ2EEGWTSpringGroovyMavenDockerJenkinsJavaScriptJSONGitJZY3D
déc. 2015 → août 2017
1 an 8 mois
Paris, France
↓ Voir les détails

Contexte

Misys (aujourd’hui Finastra) édite des logiciels pour le secteur financier. La mission consistait à rendre accessible une API de pricing de modèles financiers complexes à des utilisateurs non-développeurs (des Quants), via des plugins Eclipse personnalisés.

Réalisations

Plugins Eclipse — API de pricing
  • Interface simplifiée permettant aux Quants de paramétrer et lancer des calculs de pricing sans écrire de code.
  • Visualisation des résultats sous forme de graphiques 2D, 3D et 4D via la librairie JZY3D.
Solution PaaS Eclipse CHE

Dans le cadre d’une politique de développement d’une solution PaaS avec les services existants :

  • Déploiement de la solution Eclipse CHE (IDE en ligne) avec Docker et Jenkins (déploiement continu).
  • Plugin API pricing : portage du plugin Eclipse Desktop vers l’environnement CHE online.
  • Plugin Groovy : support complet du langage Groovy dans l’IDE (auto-complétion, syntax highlighting, typage fort).
  • Plugin graphiques : portage de la visualisation JZY3D dans l’environnement web.
Tests
  • Tests unitaires JUnit 4 + Mockito sur les services de calcul de pricing (mocking de l’API financière).
  • Intégration continue via Jenkins : exécution automatique des suites de tests à chaque build.
Présentation

Présentation en anglais de la solution CHE personnalisée à une large audience interne internationale.

05

Analyste Programmeur

@ Magillem

Développement d'outillage Java autour du standard IP-XACT et du format FrameMaker (Adobe) pour automatiser la génération, la validation et l'analyse statistique de documentation technique.

JavaGroovyEMFXPathDOM4JMavenGitSWTJFaceAsposeJUnit
sept. 2014 → sept. 2015
1 an
Paris, France
↓ Voir les détails

Contexte

Magillem développe des outils de gestion de propriété intellectuelle électronique (IP-XACT). La mission consistait à automatiser des flux de traitement documentaire complexes en Java, avec développement d’APIs, de plugins Eclipse et d’outils d’analyse.

Réalisations

API de conversion FrameMaker → format propriétaire
  • Utilisation du framework EMF pour générer un modèle de données depuis la DTD de FrameMaker (Adobe).
  • Traversal du document via XPath pour extraire et transformer le contenu conditionnel.
  • Application de Design Patterns pour garantir l’extensibilité de l’API.
Outil de profiling XML

Analyse de couverture de l’API sur des documents clients réels :

  • Parsing efficace du XML avec DOM4J.
  • Comparaison des balises présentes dans les documents vs balises supportées par l’API.
  • Export des résultats dans un tableur Excel avec statistiques et charts (librairie Aspose).
Pipeline d’analyse multi-documents
  • Script Groovy + script .sh pour exécuter l’API de profiling en batch sur de multiples documents.
  • Plugin Eclipse pour piloter l’outil via une interface graphique (gestion des arguments via IPreferenceStore).
Interface graphique Eclipse — génération IP-XACT

Interface SWT/JFace permettant de configurer les paramètres de génération de documents IP-XACT depuis l’IDE Eclipse.

Tests unitaires
  • Tests JUnit 4 couvrant les cas de parsing XML, la conversion XPath et la logique de transformation de format.
06

Analyste Programmeur

@ Enablon

Support utilisateur, correction de bugs et évolutions sur les solutions internes. Chef de projet et développeur sur une application interne de suivi du processus de signature de contrats.

JavaSQLJavaScript
oct. 2012 → oct. 2014
2 ans
Courbevoie, France
↓ Voir les détails

Contexte

Enablon édite des solutions logicielles pour la gestion du risque, la conformité et la durabilité (EHS). Première expérience professionnelle, combinant support utilisateur et développement applicatif.

Réalisations

Application de suivi des signatures de contrats

Pilotage complet end-to-end d’une application interne pour le service juridique :

  • Analyse métier : étude du processus de signature et modélisation des flux.
  • Choix technique : évaluation et décision de la solution avec le client interne (service juridique).
  • Développement : implémentation de l’application.
  • Tests & documentation : élaboration des jeux de test, rédaction de la documentation utilisateur.
  • Formation : formation des utilisateurs sur le logiciel livré.
Support & évolutions produit
  • Aide aux utilisateurs sur les solutions internes (helpdesk).
  • Analyse et correction de bugs, mise en place d’évolutions produit.
  • Travail avec les bureaux internationaux de l’entreprise : US, UK, Australie, Canada.

02 — Stack technique

Technologies maîtrisées

● expert ● maîtrisé ● exploré

// Architecture

  • Clean Architecture
  • Domain-Driven Design
  • REST API
  • SOAP / WS
  • Microservices

// Backend

  • TypeScript
  • PHP / Symfony
  • Java / J2EE
  • Groovy
  • Node.js
  • Spring
  • Shopify

// Frontend

  • React
  • Vue.js 2/3
  • JavaScript
  • GWT
  • Bootstrap / SCSS
  • Remix

// Mobile

  • Flutter
  • Dart

// DevOps

  • Docker
  • GitLab CI/CD
  • Jenkins
  • Traefik
  • Nginx / Apache

// Base de données

  • PostgreSQL
  • SQL
  • Prisma
  • GraphQL

// Outils

  • Git
  • Maven
  • SonarQube
  • Selenium
  • JUnit

03 — Contact

Une mission, un poste ?

En mission en ce moment, mais ouvert aux missions freelance comme aux postes en CDI. Remote de préférence, présentiel ponctuel possible.

Email · réponse sous 48 h

contact@glaloum.com

Écrire un email
↗ LinkedIn

+33 6 32 80 07 82

Écrire sur WhatsApp Envoyer un SMS Appeler

Pour une réponse rapide, précisez :

  • le contexte et l'objectif
  • la stack
  • la date de démarrage et la durée
  • le rythme et le lieu