Architecte logiciel & IA

Des systèmes solides, pensés et construits pièce par pièce.

nanuq est mon atelier de développement logiciel et d'intelligence artificielle. J'y conçois des produits complets — de l'automatisation d'un flux métier jusqu'au SaaS multi-tenant — avec la même exigence qu'en architecture d'entreprise.

Illustration d'un ours polaire, emblème de nanuq
Emblème nanuq
nanuq
signifie « ours polaire » en inuktitut

Un architecte logiciel qui construit aussi pour lui-même

Architecte logiciel depuis plus de vingt ans, je conçois des systèmes d'entreprise en .NET / C# et Python : capture d'e-mails, traitement documentaire, intégrations OCR et API métier pour des environnements exigeants en fiabilité.

Cette exigence, je l'applique aussi bien aux plateformes que je conçois en entreprise qu'à mes projets personnels — automatisations, applications temps réel, outils sur mesure. nanuq est l'espace où je les rassemble. Je complète cette pratique par le cursus AI Engineer d'OpenClassrooms — titre RNCP niveau 7 « Expert en ingénierie et science des données » — pour ancrer dans un cadre formel ce que je construis déjà : mise en production de modèles, systèmes RAG, agents, MLOps.

Le nom vient de l'ours polaire : un animal solitaire, méthodique, parfaitement adapté à un environnement difficile — une image qui me convient bien pour designer et coder en dehors des sentiers battus.

.NET / Python
Stacks principales
AWS
Cloud & serverless
LLM
IA appliquée

Ce que je conçois et développe

Quatre applications conçues et développées seul, de l'architecture au déploiement. Les deux plateformes documentaires sont des produits d'entreprise, menés de bout en bout pour Arondor ; les autres sont des projets personnels.

SaaS multi-tenant — publication multi-canal

Borea

Un assistant de publication multi-canal pour collectivités : les annonces arrivent par e-mail relevé automatiquement, ou par saisie directe (texte, PDF, images). Un modèle de langage les modère, en extrait la date de l'événement, puis rédige une version adaptée à chaque canal — site Joomla, Facebook, Instagram, application citoyenne et écran d'affichage en mairie. Rien ne part sans validation humaine. La difficulté n'était pas de publier, mais de faire tenir ensemble cinq API aux exigences contradictoires, sans jamais qu'une défaillance de l'une n'empêche les autres de fonctionner.

Python / FastAPI Celery / Redis PostgreSQL React / Vite Mistral IMAP Meta Graph API Joomla Web Services PyMuPDF Docker / Caddy
Ingestion Modération Extraction média Rédaction par canal Validation humaine Diffusion

Orchestration & ingestion

  • Relève IMAP périodique filtrée par objet, planifiée hors du cycle web : la boîte peut être lente ou injoignable sans jamais figer l'interface.
  • Traitement asynchrone en file dédiée — un appel au modèle de langage dure des secondes, il ne bloque ni la relève suivante ni une validation en cours.
  • Extraction d'images depuis les PDF en deux modes complémentaires : images réellement incluses, ou pages entières rasterisées. Une affiche scannée ne contient aucune image exploitable au sens du format — il faut rendre la page.
  • Normalisation systématique en JPEG avec aplatissement de la transparence : le PNG est refusé par l'API Instagram, la conversion en amont évite un échec en fin de chaîne.

Modération & rédaction assistée

  • Modération à sévérité réglable (stricte, normale, souple) : un filtre trop zélé bloquait les partenariats associatifs et les tarifs municipaux, contenus parfaitement légitimes pour une mairie.
  • Contournement tracé : l'agent peut publier malgré un blocage, l'action reste enregistrée — l'IA propose, l'humain décide et en répond.
  • Une rédaction par canal, chacun avec ses contraintes propres : institutionnel sur le site, chaleureux sur Facebook, télégraphique sur l'écran du hall.
  • Détection de la date d'événement dans le contenu : elle pilote la fin de diffusion, calée au soir même. L'annonce d'une brocante cesse de s'afficher le lendemain, sans intervention.

Cinq canaux, cinq contrats différents

  • Instagram n'accepte pas d'envoi binaire : l'image doit être exposée à une URL publique que Meta vient lire, puis le conteneur média est interrogé jusqu'à confirmation avant publication — publier sans attendre produit des échecs silencieux.
  • Joomla exige un alias unique par article : sans suffixe généré, republier un titre identique est rejeté. L'image passe par l'API Media puis est liée à l'article dans la syntaxe attendue par le thème.
  • L'application citoyenne attend du multipart avec clé en paramètre d'URL, là où les autres veulent du JSON et un en-tête d'autorisation. Chaque canal a son adaptateur, aucun ne connaît les autres.
  • Un canal ne pousse rien : l'écran de la mairie lit un flux public dédié. Même modèle de données, diffusion inversée.

Exploitation & robustesse

  • Isolation des pannes : chaque canal renvoie son propre résultat. Un certificat expiré côté site institutionnel n'empêche ni la notification citoyenne ni l'affichage en mairie.
  • Messages d'erreur traduits en langage d'exploitant : les retours bruts des API sont interprétés en cause et action, pas recopiés tels quels.
  • Vérification de connexion sans effet de bord avant toute diffusion réelle — on valide une configuration sans notifier les administrés par erreur.
  • Écran d'affichage piloté depuis l'interface : période de diffusion, dépublication immédiate, rafraîchissement autonome. Le poste d'affichage est un simple navigateur, rien à administrer sur site.
5
canaux de diffusion
depuis une seule validation
4
formats d'entrée
e-mail, texte, PDF, image
1
validation humaine
obligatoire avant diffusion
0
canal bloquant
pour les autres en cas de panne
Origine — né d'un outil mono-client pour une commune de Dordogne, puis durci au contact du réel : chaque incident rencontré en production — un certificat serveur invalide, une API dont l'URL de base n'était documentée nulle part, une modération trop stricte sur des contenus légitimes — a donné lieu à un réglage exposé à l'exploitant plutôt qu'à un correctif enfoui dans le code.
Temps réel & données musicales

BeatBattle

Un blind test multijoueur pour animer des soirées : les joueurs rejoignent en scannant un QR code, l'animateur pilote depuis un grand écran, tout se synchronise par WebSocket sans rechargement. Trois modes de jeu, dont une frise chronologique à la Hitster où les équipes placent les morceaux dans le temps. La difficulté n'était pas le jeu, mais la donnée : constituer un catalogue musical fiable, daté à l'année près, et jouable sans dépendre d'une API en pleine partie.

Python / Starlette WebSockets natifs Spotify Web Playback SDK Deezer API MusicBrainz Mistral Docker / Caddy
Collecte Datation Audit Enrichissement Catalogue local

Le catalogue, vrai sujet du projet

  • Chaîne de constitution en étapes indépendantes et relançables : collecte, datation, pochettes, identifiants de lecture. Une étape qui échoue n'invalide pas les précédentes.
  • Les dates des plateformes sont celles des rééditions : recoupement systématique avec MusicBrainz pour retrouver la première parution, indispensable à un jeu qui repose sur les années.
  • Audit automatique croisant période d'activité de l'artiste et année annoncée : il isole les classiques mal datés, les inédits posthumes et les homonymes — un « Téléphone » indonésien s'était glissé dans la base.
  • Détection des remixes et versions alternatives par structure du titre plutôt que par liste de mots-clés, qui laissait passer « Pendulum Mix » ou « 12" Version ».

Temps réel & exploitation

  • État de partie en mémoire, source unique de vérité côté serveur : les clients n'affichent que ce que le serveur diffuse, aucun score ne se calcule sur le téléphone d'un joueur.
  • Zéro appel externe pendant une partie en mode Premium : tout vient du catalogue local. Les quotas des plateformes ne peuvent plus interrompre une soirée.
  • Régulation de débit verrouillée pour les collectes : sans elle, les appels parallèles partaient en rafale et déclenchaient des blocages de plusieurs heures.
  • Correction en cours de partie : l'animateur rectifie une année ou écarte un morceau depuis l'écran de jeu, le tour est réévalué et la base corrigée pour les parties suivantes.
2 800+
titres datés,
vérifiés et jouables
0
requête externe
pendant une partie
3
modes de jeu
sur un socle commun
6
suites de tests,
dont abus et triche
Origine — conçu pour les soirées d'une association, puis durci partie après partie : chaque anomalie repérée en jouant — une année fausse, un morceau injouable, un quota atteint en direct — a donné lieu à un outil de diagnostic ou de correction.

Vingt-cinq ans à faire parler les documents

Les plateformes présentées plus haut ne sortent pas de nulle part. Depuis 2000, je conçois des systèmes qui capturent, lisent et classent des documents — GED, LAD/RAD, OCR, dématérialisation — d'abord chez des éditeurs et intégrateurs, puis comme architecte. L'IA n'a pas changé le problème, elle a changé les outils disponibles pour le résoudre. C'est cette continuité qui me permet de savoir ce qu'un modèle de langage apporte réellement à une chaîne documentaire — et ce qu'il n'apporte pas.

Depuis 2015
Responsable R&D · Architecte
Arondor Capture — Paris

Plateformes de traitement documentaire : capture web LAD/RAD, numérisation de factures à l'échelle mondiale avec extraction vers un endpoint unique, applications AWS. Architecture, réalisation, management technique. C'est dans ce cadre que j'ai conçu et développé seul FlowerScan puis Alambic, présentés plus haut. Projets livrés pour CMA-CGM, le Crédit Agricole, BNP, Generali.

2023 – 2024
Chef de produit · Architecte logiciel senior
CRIM — Centre de Recherche Informatique de Montréal

Mise en application de recherche fondamentale en IA/ML. Refonte d'un logiciel scientifique de génération d'horaires vers une architecture hybride (frontend dissocié, conteneurisation, cloud). Chatbot de recherche sémantique (LangChain, Llama), enrichissement documentaire dans ElasticSearch.

2011 – 2015
Concepteur logiciel · Chef de projet
Byzaneo — Avignon · puis freelance

Gestion des flux de données d'entreprise : applications web, mobiles et APIs. En parallèle, conception d'un logiciel de traitement d'e-mails pour extraction et intégration en GED, et modules spécifiques pour Kofax Capture.

2008 – 2011
Consultant GED & dématérialisation — expert technique
OBS, filiale Océ France (Canon) — Noisy-le-Grand

Avant-vente, analyse de besoins, définition d'architectures, supervision d'équipes R&D internes et prestataires. Audit d'infrastructures. Interventions chez Cofinoga, le Crédit Agricole, Air France.

2004 – 2008
Architecte · Concepteur
Gras Savoye (WTW) — Neuilly-sur-Seine

Refonte complète du système GED : étude préalable, architecture SOA (moteur J2EE, frontal .NET), développement des modules moteurs, industrialisation. Consolidation et uniformisation technique de systèmes aux métiers divergents.

2000 – 2004
Ingénieur R&D
Logon SI — Rueil-Malmaison · Bruxelles

Conception d'« Octopus Navigator », outil de consultation interrogeant plusieurs systèmes de GED et d'archivage depuis une interface unique. Modules et connecteurs pour Kofax / Ascent Capture. Clients : TF1, EADS, Arcelor Mittal, Banque Générale du Luxembourg.

Formation

Master Génie du traitement de l'information (AFCEPF, 2000) · Master in International Business, Technical Pre-Sales & Marketing (DBS Lille, 1997) · Cursus AI Engineer, titre RNCP niveau 7 (en cours).

Certification

AWS Certified Cloud Practitioner. Environnements de prédilection : Python, .NET, Java, AWS, Docker, bases SQL, NoSQL et vectorielles.

De l'architecture d'entreprise à l'IA appliquée

Développement

  • .NET Framework / C#
  • Python — Flask, Starlette
  • Intégrations API (Microsoft Graph, OCR)
  • Architecture logicielle d'entreprise

Cloud & infrastructure

  • AWS — Lambda, Step Functions
  • DynamoDB, S3, SQS
  • CI/CD — GitHub Actions
  • Déploiement VPS

Intelligence artificielle

  • Intégration de modèles de langage
  • Vision par IA pour documents
  • RAG, agents, fine-tuning
  • MLOps — MLflow, déploiement de modèles
  • Cursus AI Engineer (RNCP niv. 7, en cours)

Un projet à concevoir ou à automatiser ?

Que ce soit pour un outil sur mesure, une intégration IA ou une refonte d'architecture, je suis disponible pour en discuter.

Écrire à nanuq