Jérémy Colard.
Portrait de Jérémy Colard

Carnet de bord et systèmes

Être utile,
en restant libre de créer.

Ingénierie logicielle, agents autonomes et architectures Cloud. Des outils construits pour résoudre des besoins concrets, sans artifice commercial ni promesse magique.

Journal

Une vidéo pour entrer dans « Aix, au-delà du regard »

Aix en Vue prépare « Aix, au-delà du regard », une exposition de photographes aveugles et malvoyants, labellisée pour le bicentenaire de la photographie. Elle ouvre le 14 janvier à l'Office de Tourisme d'Aix. À l'entrée, un écran diffusera en boucle une vidéo qui prépare le visiteur sans rien dévoiler des œuvres. Karine, la présidente de l'association, et moi la terminons aujourd'hui.

Le chemin n'a pas été direct. Depuis des semaines, YouTube et Instagram nous montrent Claude branché en quelques clics à une foule d'outils de montage, pour presque rien. Quand on essaie, rien ne fonctionne comme annoncé. On a même envisagé de passer au forfait Team pour accéder à ses fonctions d'animation.

Ce qui débloque tout, c'est de partir du texte et de séparer le travail. Karine écrit le script, avec ses partis pris : ni prouesse ni compassion, des sous-titres pour ceux qui n'entendent pas, des titres lus à voix haute. On donne ce script à Claude et on lui demande la liste exacte des assets dont il a besoin pour le monter.

Je produis ensuite les plans dans Google Flow, par séquences de huit secondes, puis les musiques. Claude reprend le script et l'ensemble des fichiers, et monte la vidéo comme un chef : l'ordre des plans, les titres, les sous-titres, le rythme lent que demandait le script.

Le résultat nous bluffe tous les deux. Sept minutes, en ligne ce soir, et une méthode qu'on garde pour les prochaines vidéos de l'association.

Aix en VueClaudeGoogle FlowVoir la vidéo ↗

Allumer la lumière dans SCP-087

SCP-087 est un petit jeu d'horreur : un escalier qui descend sans fin dans le noir, une lampe qui éclaire à quelques mètres, et une entité qui finit par vous attraper. Quand elle y parvient, le jeu se ferme, littéralement. Ce soir, je veux voir ce qu'il y a dans ce noir : la géométrie, le monstre, la façon dont les étages s'enchaînent.

Le jeu tourne sur Unity 3.5. Toute sa logique tient dans Assembly-UnityScript.dll, du UnityScript compilé pour Mono. Je décompile la DLL en C#, je lis le script z_instantiate qui pilote la descente, et je réécris ce qui m'intéresse dans un fichier source à moi avant de recompiler.

Trois verrous sautent. La lumière d'abord : au démarrage, je crée un objet LabLight attaché au joueur, une lumière ponctuelle de 45 mètres de portée, je coupe le brouillard et je remonte la lumière ambiante. La fermeture ensuite : l'original appelle Application.Quit() dès que la main du monstre atteint sa cible. Je plafonne l'interpolation de l'attaque à 0,78, et si je recule au-delà de 6,5 mètres, les mains reprennent leur position d'origine. L'attaque se rejoue à volonté. Le hasard enfin : le monstre n'apparaît qu'après l'étage 20, avec une chance sur soixante par étage. Un appel à SpawnDeathAtFloor(0) le pose dès le premier palier.

Un HUD affiche en continu la hauteur, l'étage, l'état de l'attaque et la distance exacte au monstre. Quatre touches pilotent le labo : L pour la lumière, M pour faire apparaître le monstre, O pour une ombre, Q pour l'anti-fermeture. Deux scripts .bat échangent la DLL modifiée et l'originale, sans injecteur comme BepInEx.

À 22 h 13, la DLL patchée est en place, moins d'une heure après l'extraction du jeu. Je descends l'escalier en plein jour, et le monstre m'attend au premier palier.

Unity 3.5C#MonoReverse engineering

Hope Sphère Studio, des livres scannés adaptés aux lecteurs DYS

Les bénévoles de Hope Sphère adaptent à la main des livres pour des enfants et des adultes dyslexiques, dyspraxiques ou dysphasiques. Leurs sources sont souvent des scans fatigués : papier jauni, pages qui transparaissent, reliures courbées, aquarelles mêlées au texte. Le premier prototype, en React, faisait tout dans le navigateur. Il n'avait pas d'OCR, saturait la mémoire au bout de quelques pages et oubliait tout au rechargement. Hier matin, je repars de zéro.

Le backend est en FastAPI, sur Python 3.12, et le front en React 19. PyMuPDF extrait les pages, OpenCV les nettoie. La binarisation Sauvola est vectorisée avec cv2.boxFilter, sans aucune boucle Python, quelle que soit la taille de l'image. Les aquarelles sont détourées : une fermeture morphologique soustrait le fond du papier, un alpha doux garde les bords, et je retire la frange de couleur laissée par le papier. L'OCR tourne avec RapidOCR en ONNX, sur CPU, 27 % plus vite que Tesseract et sans binaire système à maintenir.

Le texte reconnu devient un arbre à sept niveaux, de la section jusqu'au graphème, en passant par la phrase, le mot et la syllabe. La coloration syllabique, l'atténuation des lettres muettes et l'alternance de couleurs entre phrases s'appliquent chacune à leur niveau, sans balises qui se chevauchent. Les profils de lecture règlent la police (OpenDyslexic, Luciole ou Lexend, embarquées sans CDN), la taille, l'interlignage et les espacements. L'export produit un PDF vectoriel avec fitz.Story et un EPUB 3 accessible. 226 tests automatisés couvrent l'ensemble.

Hier soir, je veux en faire une application Windows : un installeur en C# compilé avec csc.exe, un Python embarqué, une archive portable de 201 Mo. Cette nuit, c'est l'échec. Smart App Control bloque l'installeur, Chrome, Edge et Defender signalent un virus sur un binaire non signé, et les chemins Python se cassent. Vers 1 h du matin, j'abandonne le bureau pour Cloud Run.

La mise en production est une série de murs, éprouvés sur Le Petit Prince scanné, 86 pages. Le navigateur coupe la requête au bout de 2 min 30, alors que l'OCR dure 4 minutes. L'envoi se fait donc par morceaux de 10 Mo, l'API répond 202 tout de suite, traite en tâche de fond et publie sa progression en SSE. SQLite refuse ensuite d'écrire son journal sur le bucket monté en FUSE : la base vit en mémoire dans /tmp et part sur Cloud Storage par sqlite3.backup() à chaque commit. Puis Cloud Run coupe le CPU dès la réponse envoyée, et le flag --no-cpu-throttling règle ça. Enfin, le Studio gèle en montant 100 000 éléments d'un coup. Je découpe l'arbre en une section par page, et react-virtual ne monte plus que les pages visibles.

Il est 3 h, la quatrième révision est en ligne. Une seule instance tourne, pour protéger la base, et les imports des bénévoles passent l'un après l'autre. Le Petit Prince s'ouvre dans le Studio, page par page, et le navigateur ne bronche plus.

Hope SphèreFastAPIReact 19OpenCVRapidOCRCloud Run

CinéMatch, choisir sa séance en swipant

Le soir, à Toulouse, je perds plus de temps à choisir un film qu'à le regarder. Toulourama recense les séances du Pathé Wilson, de l'American Cosmograph, de l'ABC et d'Utopia, mais rien ne croise les horaires avec mes envies, les notes IMDb et le tarif du jour. Il y a trois jours, j'ai commencé CinéMatch pour le seul Pathé Wilson. Aujourd'hui, il couvre les quatre salles.

C'est une PWA en JavaScript vanilla, sans framework ni bundler. Les films défilent en cartes à swiper : j'ai écrit le moteur de gestes à la main, avec inertie et rotation selon l'angle du glissement. Envie, pas envie, déjà vu, chaque choix est rangé dans le localStorage. Un service worker sert les fichiers statiques en stale-while-revalidate et les données en network-first, et l'application s'installe sur l'écran d'accueil.

Les séances viennent de Toulourama, que le navigateur ne peut pas interroger directement à cause de CORS. Plutôt que de faire tourner un serveur, je passe par un script Google Apps Script qui récupère le HTML de chaque cinéma et le renvoie en JSON. Une fois par jour, à l'ouverture, l'application interroge les quatre salles en parallèle. Si le réseau lâche, elle retombe sur le cache local, puis sur une base pré-générée par un script Python avec BeautifulSoup.

Le plus pénible est le rapprochement avec OMDb pour récupérer les notes IMDb. Les titres sont en français sur Toulourama, souvent internationaux sur IMDb, et chargés de mentions comme VF, VOST, 3D ou IMAX. Je nettoie le titre, je tente une recherche directe, puis une recherche plus large en seconde passe. Le parsing n'est pas plus simple : chaque cinéma a sa propre structure HTML, et il m'a fallu quelques scripts d'exploration pour la comprendre.

Dernier ajout de la journée : chaque séance affiche son vrai prix. 5 € à l'ABC le mercredi ou avant 13 h, 4,50 € au Cosmograph le mardi et le jeudi après 21 h ou avant 13 h, 5 € pour la première séance du matin à Utopia. Ce soir, la base compte 48 films sur trois jours de programmation, et je sais ce que je vais voir.

JavaScriptPWAApps ScriptOMDbPython

Karine parle, l'agent publie

Karine préside Aix en Vue, une association de personnes déficientes visuelles. Elle prépare des affiches, des newsletters, des annonces, et chaque support lui demande une série de manipulations pensées pour des gens qui voient l'écran. Aujourd'hui, elle dicte, et un agent fait le reste.

L'agent tourne sur Claude Pro. Sa mémoire vit dans Firestore, ses fichiers dans Cloud Storage. J'ai écrit ses consignes pour qu'il réponde sans jargon et qu'il pose toujours son résultat en fin de message, sous forme d'artefact interactif, toujours au même endroit. Pour une lectrice d'écran, cette régularité compte plus que n'importe quelle mise en forme.

Chaque texte validé part en version audio avec la voix Sulafat, puis l'agent l'envoie par Brevo aux adhérents. Une affiche contrastée sort du même échange qu'une newsletter.

Ce matin, Karine prépare la lettre de la semaine à la voix, du premier mot jusqu'à l'envoi.

Claude ProFirestoreCloud StorageBrevo

Ce site se publie en deux secondes

Je veux un atelier où mon agent et moi écrivons, testons et publions sans pipeline CI/CD, sans dépendances à installer, sans attendre. Ce soir, la page que vous lisez sort de cet atelier.

Tous les outils sont en Python pur, bibliothèque standard uniquement. L'authentification passe par OAuth2 avec un compte de service, et les secrets restent dans Secret Manager. Une page vit dans Firestore, qui reste la source de vérité. À chaque publication, une copie de secours part dans Cloud Storage, puis le script appelle directement l'API REST de Firebase Hosting pour créer une version, envoyer le fichier et la publier.

L'aller-retour complet prend moins de deux secondes. Je récupère la page, on l'édite ensemble dans un artefact, et quand elle me plaît, une commande la met en ligne.

PythonFirestore RESTCloud StorageFirebase Hosting

Des agents d'entreprise prêts pour le rendez-vous client

Chez Aceo Tech, Google Cloud Partner à Paris et Toulouse, les consultants doivent montrer ce qu'un agent multimodal change pour un client, et ils ont rarement plus d'une heure pour le faire. Je monte une plateforme qui génère ces démonstrations sur des cas d'usage réels.

Les agents sont construits avec l'ADK et tournent sur Cloud Run. Les données de démonstration sont dans BigQuery. Chaque démonstration vit dans son propre projet, isolé des autres, avec un niveau de sécurité qui tient face à une DSI.

Cette semaine, la plateforme sert pour la première fois en rendez-vous d'ingénierie.

Cloud RunADKBigQuery

Fleetis, cinquante minutes pour voir son vrai bénéfice

Thibaut lance Fleetis, une activité de gestion de véhicules et de conciergerie. Je n'y connais rien en voitures, mais je sais lire une marge. On s'assoit ensemble, on dessine l'écran sur une feuille, et cinquante minutes plus tard l'outil existe.

Le cœur de l'application est un calcul. À chaque encaissement, elle retire la commission, déduit les charges rattachées au véhicule et affiche le bénéfice net. Chaque véhicule a sa fiche et sa propre ligne de rentabilité, ce qui permet de voir en un coup d'œil celui qui travaille et celui qui coûte.

Aujourd'hui, Thibaut saisit son premier encaissement de 300 € et lit son bénéfice réel sur son téléphone.

FleetisMobile

Les heures de chantier se comptent toutes seules

Sunelio pilote ses chantiers à distance, et ses ouvriers notent leurs heures comme ils peuvent. Je construis une application pensée pour le téléphone, qu'on prend en main sans formation.

Chaque chantier porte sa liste de tâches. Les tâches sont attribuées aux ouvriers, qui les valident sur place avec une photo prise depuis l'application. Les heures se calculent automatiquement, et l'avancement de chaque chantier se lit au pourcentage de tâches terminées.

Cette semaine, les équipes valident leurs premières tâches depuis l'application.

SunelioMobile

Une comptabilité de secours pour l'association Zenith

Le logiciel comptable gratuit de l'association Zenith, Paheco, plante au mauvais moment. Les bénévoles ont besoin d'un module fiable qui ne dépende pas de lui. Je le recrée dans AppSheet.

Les recettes et les dépenses sont saisies avec une catégorie comptable. Chaque ligne accepte son justificatif en photo ou en PDF. Les soldes et les balances se calculent seuls à partir des écritures. Les devis et les factures sont générés depuis l'application, et leur paiement se suit sur un tableau Kanban, de l'émission à l'encaissement.

Ce soir, la trésorière saisit les écritures du mois dans le nouveau module.

ZenithAppSheet

Violentoclic, un outil d'urgence sans compte

Une association d'aide aux victimes me demande un outil d'urgence. La contrainte de départ est l'anonymat : personne ne doit avoir à créer de compte ni à laisser son nom pour demander de l'aide.

L'application s'ouvre sans identification. Une carte interactive affiche autour de la personne les centres d'aide, les médecins et les services juridiques. L'interface bascule instantanément entre le français, l'anglais, l'espagnol et l'arabe.

Le projet ne part pas en production. Les exigences du RGPD pour ce type de données sont trop lourdes pour l'association. L'application reste une démonstration complète, et je la range ici telle qu'elle est.

GéolocalisationMultilingue

Une étagère solidaire et des heures de bénévolat signées

Hope-Sphère accompagne des enfants atteints de troubles Dys. L'association distribue des livres adaptés et repose sur des bénévoles dont l'engagement mérite d'être compté. Je construis deux outils qui partagent la même base.

Le premier est l'étagère solidaire : un catalogue que les familles consultent et depuis lequel elles demandent un livre dans le format qui leur convient, epub ou audio. Le second est un module RH. Chaque bénévole y déclare ses heures et ses tâches, puis valide son mois par signature électronique. Côté administration, le volume horaire se calcule par bénévole et par activité.

Aujourd'hui, les premières familles parcourent le catalogue.

Hope-SphèreSignature électronique

Des micro-applications à la place des tableurs

Les équipes support d'Airbus suivent leurs véhicules de service et leur matériel informatique dans des Google Sheets devenus trop lourds. Les erreurs de saisie s'accumulent, et du matériel disparaît sans que personne sache qui l'a pris. Je remplace ces fichiers par une suite de petites applications reliées entre elles.

La première gère la réservation des véhicules de service pour les techniciens itinérants. La seconde gère le stock informatique : on commande une pièce ou un ordinateur, le stock se décompte en temps réel, et chaque mouvement garde son historique, qui a pris quoi et quand. Des tableaux de bord suivent la consommation.

Ce soir, les techniciens réservent leur premier véhicule depuis l'application.

AirbusAppSheet

Compagnon, les tickets ServiceNow traités sur le terrain

Les techniciens itinérants d'Airbus dépannent les utilisateurs sur les sites de Blagnac et de Saint-Martin. Pour mettre à jour un ticket, ils retournent à leur bureau, faute d'accès mobile à ServiceNow. Je construis une application compagnon qui vit dans leur poche.

Pas d'API complexe : un script personnalisé fait le lien avec l'ERP. Le technicien consulte et met à jour ses incidents sur place, les range dans un Kanban, prend ses notes et appelle l'utilisateur depuis la fiche. Gemini résume chaque incident pour qu'il sache en quelques secondes de quoi il retourne. Un bouton synchronise le tout avec la base centrale.

Sur le terrain, on estime le gain à trente minutes par technicien et par jour.

AirbusServiceNowGemini

Petit Pas, le carnet de sevrage des familles

L'association En Faim Sans Fil accompagne des familles dont l'enfant est nourri par sonde, pendant le sevrage. Le protocole est médical, précis, et les parents notent tout à la main. Je construis Petit Pas pour leur retirer cette charge.

Les parents créent le protocole de traitement, puis saisissent les quantités, les débits et les durées en quelques touches. Des graphiques montrent la progression de l'enfant jour après jour. Des rappels et un planning intégré tiennent le rythme. Un bouton exporte les résultats par e-mail pour le médecin.

Aujourd'hui, une première famille démarre son protocole dans l'application.

En Faim Sans FilSanté

Cent bénévoles pour La Méka

La Méka, le festival de l'humour de Pibrac, accueille depuis sept ans des milliers de spectateurs. En coulisses, il faut recruter cent bénévoles, les affecter aux bons pôles et suivre leurs présences. Jusqu'ici, tout se fait à la main.

Je construis un portail où chaque bénévole s'inscrit seul et indique ses préférences. Les chefs d'équipe valident les profils et les affectent selon les besoins de leur pôle. Les e-mails de confirmation partent automatiquement, et un pôle complet ferme ses inscriptions sans intervention. Chaque inscription, désinscription ou modification est journalisée.

Ce soir, le lien d'inscription part sur les réseaux du festival.

La MékaBénévolat

GéoStock, se repérer dans un hangar

Dans un entrepôt Airbus grand comme un hangar à avions, les techniciens passent un temps fou à chercher une salle ou un équipement. Je construis GéoStock pour qu'ils trouvent leur chemin et se concentrent sur la maintenance.

Chaque étage a son plan, sur lequel apparaissent les interventions passées et à venir. Chacun peut y ajouter ses propres points d'intérêt. Les rapports, les incidents et l'inventaire se saisissent salle par salle, directement sur place. Un scan de QR code localise et vérifie un équipement.

À partir de demain, le rapport se fait sur le téléphone, plan compris, sans ordinateur portable sous le bras.

AirbusQR code

Une opération boursière saisie en quelques secondes

Un client investit en bourse et veut suivre chaque opération sans y passer de temps. Je conçois une application où l'on enregistre une opération en quelques secondes, depuis son téléphone.

Une matrice suit chaque position, de l'ouverture à la clôture. Des tableaux de bord comparent la rentabilité des différentes stratégies et l'évolution du portefeuille. Un calendrier affiche les gains et les pertes jour par jour, et un clic sur une date ouvre le détail des transactions.

Aujourd'hui, le client enregistre ses premières opérations, sur mobile, tablette et PC.

FinanceMobile

Un programme d'entraînement qui suit mes règles

Les applications de sport que j'essaie sont peu personnalisables, limitées dans les exercices et approximatives dans le suivi. Je construis la mienne, selon mes objectifs et mes règles.

Chaque jour, l'application affiche le programme à faire, calculé à partir du planning et des objectifs. Le suivi enregistre les répétitions, les charges, la masse musculaire et le poids, et trace la progression sur chacun. Des notifications rappellent les séances.

L'application est en ligne, et elle est ouverte au test.

SportAppSheetTester l'application ↗

Une messagerie pour En Faim Sans Fil

L'association En Faim Sans Fil redonne aux enfants nourris par sonde le plaisir de manger. L'équipe n'a aucun outil numérique pour gérer ses membres et ses tâches, et tout passe par des échanges éparpillés. Je construis une application de coordination.

Le centre de l'application est une messagerie intégrée, proche de WhatsApp dans l'usage. Chaque salon de discussion a son propre calendrier et son tableau Kanban. Les documents, les tâches et les événements sont rattachés au salon concerné. Quand une tâche ou un message concerne directement quelqu'un, il reçoit une notification sur son téléphone et par e-mail.

Ce soir, toute l'équipe rejoint ses premiers salons.

En Faim Sans FilMessagerie

Ritsy répond aux membres d'Aix en Vue

Les membres d'Aix en Vue posent toujours les mêmes questions : qu'est-ce qui se passe cette semaine, comment s'inscrire, qui contacter. Je leur donne une interlocutrice, Ritsy, intégrée à leur application AppSheet.

Ritsy connaît le programme. Elle recommande des activités selon le profil du membre, détaille chaque événement et explique le fonctionnement de l'application. Elle affiche directement la ressource demandée, ce qui permet de s'inscrire à une activité ou d'appeler un contact en un clic. Les bénévoles s'en servent aussi pour préparer newsletters, articles et rapports.

Si elle vous appelle « null », c'est qu'elle ne vous connaît pas encore. Elle apprend.

Aix en VueAppSheetIA

La vie scolaire d'ISPRA dans une seule application

ISPRA Institut dépense plusieurs milliers d'euros par an dans des outils de vie scolaire éparpillés et mal reliés. Je regroupe tout dans une plateforme unique, aux couleurs de l'école.

L'accès dépend du profil : administration, enseignant ou élève. Les plannings se construisent par classe, par salle et par enseignant. On y trouve aussi la communication interne, la saisie des notes et la génération des bulletins, l'appel, les statistiques et la gestion du personnel.

Avec une seule plateforme à la place de plusieurs abonnements, le coût de gestion de l'école baisse de 90 %.

ISPRA InstitutÉducation

Cent cinquante membres, cinquante activités par mois, et un tableur qui ne suit plus

Aix en Vue vient de passer le cap des cent cinquante membres. L'association propose près de cinquante activités par mois, et les bénévoles tiennent tout à bout de bras, entre fichiers partagés, e-mails et beaucoup de bonne volonté.

Je pars sur AppSheet. Le choix est pragmatique : l'association vit déjà dans Google Workspace, ses données sont dans des Google Sheets, et une app no-code se maintient sans moi le jour où je ne suis plus là. Je garde les feuilles comme source de données et je reprends le modèle proprement. Une table pour les membres, une pour les activités, une table de liaison pour les inscriptions, des références entre elles pour qu'AppSheet génère seul les vues de détail et les listes associées.

Il n'y a qu'une seule application, avec deux visages. Le rôle de chaque utilisateur est stocké dans la table des membres. Des security filters basés sur USEREMAIL() décident de ce que chacun voit. Un membre accède au programme et à ses inscriptions, un bénévole ouvre en plus l'espace de gestion. Les slices font le reste : activités à venir, inscriptions du jour, membres à relancer.

Côté bénévoles, presque tout passe par les automations. Les e-mails et les campagnes partent depuis des bots. Les reçus fiscaux sont générés à partir d'un modèle Google Docs rempli par AppSheet puis envoyés en PDF. Les articles rédigés dans l'app sont poussés vers le site par un bouton qui déclenche un webhook. La déclaration des heures et des disponibilités alimente quelques tableaux de statistiques construits avec les vues graphiques natives.

Ce soir, l'application part en production. Demain matin, les premiers membres s'inscriront depuis leur téléphone. Les bénévoles, eux, ouvriront un seul outil au lieu de cinq.

Aix en VueAppSheetGoogle SheetsApps ScriptVoir le site de l'association ↗

Un problème à résoudre

Écrivez-moi en trois lignes : qui, quoi, ce que ça vous coûte aujourd'hui.

Écrire à Jérémy

j.colard31@gmail.com