Skip to content
<Thierno DIALLO/>

About me

A little more about who I am.

My route into software was not a childhood master plan. I first imagined myself studying mechanical or electrical engineering. A high-school teacher steered me toward computer engineering instead, arguing that in 2014 it was where the opportunities were — and a couple of technology-heavy TV shows had already made the field look intriguing. The practical choice turned into a genuine one once I discovered that I enjoyed designing systems as much as coding them.

Today I work mainly on Java and Quarkus backend systems for healthcare software. I like taking a problem end to end: understand an ambiguous context, compare technologies, shape the architecture, implement something reliable, and document it so others can maintain and extend it. That approach has taken me through identity and security integrations, multi-country platform capabilities, unfamiliar healthcare technologies, and AI-agent workflows for developers. The technology is different every time. What stays the same is the part I find interesting: turning complexity into something coherent and useful.

Most of that work comes down to balance. Left to me, reliability comes first, then security, performance, maintainability, simplicity, and extensibility — but the context regularly reshuffles that order, and no design maximizes all of them at once. The real question is how much weight each one deserves in the situation at hand. Getting that judgment right, and being able to explain it afterwards, is one of the skills that defines a good software engineer.

Ownership, for me, does not stop at designing and implementing. I keep an eye on where the work is going, try to spot the next blockers before they become urgent, and pull in the people who should be involved, product side included, while the plan can still change — so what we agree on works for everyone, not only for the developers. Colleagues can expect me to think things through, keep the work moving, care about consistency, and treat their blockers as problems worth stopping for.

Looking ahead, I want to grow into hands-on technical leadership and, over time, deepen my expertise in software architecture. I'd like to build that on stronger cloud and platform engineering foundations, without leaving the code behind.

Away from the keyboard, I love playing football, watching the matches, and running outdoors to clear my head and stay fit. Want to know which football club I support? Send me a message — I have a few solid arguments ready for that one too, though I'll admit they're far less objective than the technical ones. 😉

Senior Software EngineerMontpellier, France

Education

Engineering Degree (Diplôme d'ingénieur)

September 2018 – October 2021

École Centrale de Lyon

Selected through a competitive process for the double-degree program with École Supérieure Polytechnique de Dakar. This general engineering curriculum complemented a background that had until then been focused mainly on computing, giving me a broader view of engineering problems and the habit of working alongside engineers from other disciplines.

Engineering Degree in Computer Engineering (Diplôme d'ingénieur de conception)

October 2017 – October 2021

École Supérieure Polytechnique de Dakar

A selective engineering cycle, entered after my DUT, where I learned to design systems rather than only program them. It covered software engineering as a whole, and that breadth is still what my work rests on.

University Diploma of Technology (DUT) in Computer Science

October 2015 – July 2017

École Supérieure Polytechnique de Dakar

Admitted through a competitive entrance examination and a review of academic records. Two years of computer science that gave me my first technical foundation, and my first projects built for real users.

Professional Work

AI Agent Governance and Developer Enablement

January 2026 – Present

CompuGroup Medical (CGM)

As AI coding agents became part of daily work, their rapid adoption exposed inconsistent quality, duplicated effort, and the absence of shared standards. In response, I led the creation of a common framework for the team.

I authored a governance model that settles the essential questions: who owns a skill, how contributions are reviewed, how each one is tested independently and released in preview first, how skills compose, how activation rules keep two of them from competing for the same request, and what quality thresholds are expected before anything is shared. To make evaluation repeatable and objective, I designed a weighted scoring rubric and implemented a deterministic Python tool that scores skills and workflows, flags critical issues, and ranks improvements by impact.

I also built reusable agent skills the team could compose — Jira issue management, GitLab pipelines and merge requests, local Git operations, feature-environment resolution, automated quality evaluation, and Kubernetes diagnostics restricted to read-only investigation, so an agent can help diagnose a cluster without being able to change it. Two orchestration workflows combine those skills into structured troubleshooting and evaluation processes, each with an explicit contract, declared dependencies, safety guardrails, and defined failure handling.

The framework is used across the team. I still review contributions, help colleagues build and debug their own workflows, unblock them when an agent or a tool integration misbehaves, and adjust the model as feedback comes in.

OIDC Federated Authentication

March 2026 – July 2026

CompuGroup Medical (CGM)

Company-wide Single Sign-On was the next step for a multi-tenant healthcare SaaS platform used in several countries. I designed and implemented the enterprise identity-provider integration end to end. The decision that shaped everything else was to delegate authentication while keeping roles, permissions, and organizational access under the platform's control, and without removing the existing username-and-password login.

I owned the architecture, the security model, the Java/Quarkus implementation, the coordination with stakeholders, and the technical documentation. The integration uses the OIDC Authorization Code Flow with PKCE and Pushed Authorization Requests, with state and nonce validation.

Most of the difficulty was in what happens after the login. I designed server-side management of authentication state and external tokens, including refresh and cleanup tied to the session lifecycle, and a provider-agnostic identity-mapping model that refuses ambiguous account matches. I also solved callback routing for dynamic test environments without weakening redirect validation.

The integration is now in production and actively used by healthcare professionals, providing secure federated authentication while preserving internal authorization boundaries.

Dynamic Integration Configuration

January 2026 – March 2026

CompuGroup Medical (CGM)

Third-party integrations did not all use the same connection settings: endpoints varied by deployment environment and by user profile, and the configuration was scattered across files and application code. Routing a test or pilot user to a non-production endpoint, while healthcare professionals kept using the production one, usually meant a code change and a redeployment — with no simple way to make an exception for a single user.

I took ownership of replacing that with a three-tier resolution model, evaluated for each user and each integration: a value set for a specific user wins over the integration's own strategy, which in turn wins over the database-managed default. Endpoint routing was only the trigger, though — I designed the service around the general case, defining any configuration whose value depends on who the user is: their attributes, their profile, or whatever criterion a given integration needs.

I designed the JPA data model, implemented the Java/Quarkus service and its API, and documented the architecture in a formal design document (an RFC) with technical diagrams. Strategy and Factory patterns keep each integration's rules in its own place, so adding one does not mean touching the resolution flow.

Endpoint changes and individual exceptions are now configuration rather than deployments. The system runs in production today.

Zero-Downtime Storage Migration to Azure

February 2025 – November 2025

CompuGroup Medical (CGM)

Every clinical document on the platform passes through a single storage service, originally backed by self-hosted MinIO and one of the services I had helped build. When the company moved the platform to Azure, a colleague and I took on the storage workstream. Doctors use the product during their consultation hours, so there was no maintenance window long enough to move every document at once. The migration had to run with the platform live, and without losing a single file.

Rather than a single cutover, we made the service talk to both backends at once and moved the routing decision into the database: each MinIO tenant record pointed to the Azure tenant replacing it, and each clinic's bucket pointed to whichever tenant physically held it. Migrating a bucket became a database update instead of a deployment, and a feature toggle could send all traffic back to MinIO instantly, since nothing had been deleted there — precisely to preserve backward compatibility.

I wrote the Python migration tooling, run as a Kubernetes job: parallel copying, a bookkeeping table that made every run resumable, and object counts compared on both sides before any routing record was repointed — copy, verify, then switch. We ran it outside consultation hours, migrating a set of buckets, stopping, and later picking up where we had left off. I also wrote the backward-compatible read and write paths that let the two backends coexist while buckets moved across one by one.

The workstream ran for about nine months, from design through to the final cutover, with no downtime and no data loss. Once production had been stable on Azure, I owned the cleanup that removed the old implementation, its toggle, provisioning scripts, and dependencies.

OAuth 2.0 Token Exchange

September 2024 – February 2025

CompuGroup Medical (CGM)

CGM products in several countries needed to reuse selected platform services on behalf of users who were already authenticated, without asking them to sign in again — and without the platform having to understand several external token formats. I designed and implemented an OAuth 2.0 Token Exchange capability end to end to bridge that gap.

I built it on the OAuth 2.0 Token Exchange standard (RFC 8693) and owned the full lifecycle: protocol architecture, security design, the Java/Quarkus implementation, the OpenAPI contract, and the documentation consumers rely on. Each partner's token validation sits behind the same interface, so the platform can accept several external issuers while the exchange flow itself stays unaware of any of them.

Requested scopes are constrained by the partner's own permissions before a uniform internal token is issued, so a partner product can only reach the services it is registered for — least privilege, enforced at the boundary rather than in each downstream service.

The capability is used in production by CGM products, giving cross-product service access a single, auditable security boundary.

Healthcare Smart-Card and DMP Integration Investigation

October 2023 – March 2024

CompuGroup Medical (CGM)

French healthcare smart cards and the DMP — the national shared medical record — opened an entirely new integration surface for the platform: physical card readers, software running on the practitioner's workstation, real-time card events, regulated transactions, and healthcare protocols nobody on the team had worked with before.

I led the initial technical investigation and built a working proof of concept covering the CPS professional card, the patient Carte Vitale, and the main DMP document workflows.

I mapped and tested the ecosystem end to end: reader sessions, practitioner and patient card access, asynchronous insertion and removal events, and the document exchanges the DMP requires. I produced reproducible Postman examples and technical documentation, and helped define an architecture that separates frontend event handling from backend transactional operations.

My role was to make the integration path actionable, not to build the final production feature. I delivered working examples, architecture diagrams, live demonstrations, knowledge-transfer sessions, and implementation support to the delivery teams, who built on it to complete the capability doctors use heavily today.

Graph-Based Classification and Feature Variation

June 2023 – September 2023

CompuGroup Medical (CGM)

A single healthcare codebase had to vary services, interface components, and business behavior by country, region, practitioner type, and specialization — without turning into a maze of conditional branches. I helped investigate and implement the classification system built to solve that.

A colleague and I led the initial technology spike. I evaluated Apache AGE against the previously proposed Neo4j, reproducing the critical taxonomy and graph-traversal queries in both. Apache AGE kept the same Cypher-based graph modeling, but ran inside the PostgreSQL infrastructure the platform already operated — so the team got the graph capabilities it needed without adding a second database to deploy, monitor, and back up.

Once the decision was approved, I contributed substantially to the shared Java/Quarkus implementation, and to the documentation, developer guidelines, demonstrations, and onboarding that made it usable by other teams.

The production system combines graph-based resolution and Redis caching that lets a service declare which variant it needs instead of branching on context. It runs across the platform today, supporting several countries from one codebase while keeping variation logic in one place.

Software Engineer Internship – Digital Credit Platform

March 2021 – July 2021

KimiaPay

KimiaPay wanted to validate a digital salary-advance product for employees with limited access to traditional credit, where partner employers would take part in approving requests and guaranteeing repayment. I was the sole technical owner within a startup team, during my final-year engineering internship.

The central challenge was architectural: turning a financial product with several actors, approval stages, security requirements, and room to grow into a coherent system that one developer could deliver in four months.

I designed a service-oriented architecture that includes a cross-platform mobile application for borrowers, a web back office for administrators and employer representatives, backend business services, and a centralized data layer connected through REST/JSON APIs. I then carried that architecture through implementation, testing, and deployment.

The product covered token-based authentication, identity and employment-data collection, role-based access, multi-level approval, loan tracking, and the full lifecycle of a request from submission through repayment or dispute. I selected AppGyver and Backendless to accelerate delivery under the project's constraints, and wrote custom JavaScript where needed. The finished product was deployed, ready for a pilot phase.

Software Engineering Internship – Quarkus Migration Feasibility Study

May 2020 – August 2020

Amadeus

Amadeus wanted to know whether migrating a flight-search application server from Spring/JBoss to Quarkus was technically feasible and worth the investment. My second-year engineering internship was that evaluation. The goal was not to change the application's business behavior, but to determine how it could run on Quarkus and document the implications for future migrations.

Embedded in an agile engineering team, I built the Quarkus version of the application and investigated the compatibility issues it surfaced: external dependencies, CDI, unsupported Spring annotations, and class loading. Depending on the constraint, I used CDI producers, adapted selected components, wrote Quarkus extensions, or ran both applications side by side in debug mode to find where they diverged. I also reported genuine framework limitations to the Quarkus community.

The migration was intentionally left incomplete once its scope exceeded the four-month placement. What I delivered instead was a decision-ready technical reference: the blockers encountered, the solutions found, the trade-offs made, and the migration costs to expect. Early measurements pointed to substantial startup improvements, whose limitations I documented clearly.

Amadeus was left with a reusable basis for evaluating future migrations, and I came away with a much better sense of framework compatibility and of what a migration really involves: how to assess one, plan it, and carry it out without taking unnecessary risks. Working entirely in English in an international team — daily collaboration, meetings, technical discussions, documentation — also strengthened my professional communication.

Computer Science Reinforcement Instructor

October 2019 – January 2020

École Centrale de Lyon

École Centrale de Lyon's intensive curriculum sometimes left students needing more time, and another way into difficult concepts. Because of my computer-science background, the school selected and paid me to run the computer-science reinforcement sessions.

I prepared lessons and exercises, re-explained the concepts that had not landed, reviewed assignments, ran practical workshops, and gave one-to-one support. The sessions covered algorithms through Python, UML and application design, and the broader computer-science ideas the curriculum assumed.

Teaching a concept twice the same way rarely works. Most of the job was finding where a student's understanding had broken, then explaining it in another way.

Computer Lab Monitor Coordinator

September 2019 – April 2020

École Centrale de Lyon

École Centrale de Lyon kept its computer rooms open at night so students could work after the regular staff had left. A team of paid student monitors supervised them, and I coordinated that team and acted as the administration's main contact.

I collected availability, built the schedules, covered last-minute absences, and balanced monthly hours so that work and pay stayed broadly even across the team. I also watched over how the rooms were used, handled incidents reported by students, passed on what I could not resolve, and kept the administration informed when something went wrong.

The job came down to keeping a schedule fair and the rooms open when plans changed at short notice, and to being the person both the team and the school could call.

Software Developer Internship – Collaborative Skills-Sharing Platform

June 2017 – July 2017

SUITE

SUITE was exploring a collaborative mobile application that would make niche and local know-how easier to share and find, through training content, help requests, service offers, and events online or in person. During my DUT internship, I was the sole developer of the mobile client.

I owned that work from requirements analysis through architecture and implementation. I modeled the user roles and the domain with UML, built the cross-platform application in React Native, and integrated it with an existing Django REST Framework API provided by the SUITE team. The client consumed REST/JSON endpoints and offered distinct features for visitors, learners, trainers, and administrators.

By the end of the internship I had implemented and presented the core screens and end-to-end flows — browsing training content, authentication, posting help requests, and publishing trainings, events, and offers. That was my first mobile product taken end to end: choosing the technology, modeling the domain, integrating an API I did not write, and demonstrating the result.

Projects

Laajal Sa Diine

Laajal Sa Diine is a platform of short audio answers to everyday questions about Islam. I designed and built it on my own to make that kind of guidance easier to find: a React and TypeScript client on top of a Node.js REST API, with MongoDB holding the library and Amazon S3 the audio files.

The hardest part was content discovery: a weighted full-text index tuned for French ranks matches across several fields, while combinable filters and infinite scrolling make the library easier to explore. I also implemented JWT-protected administration, with separate permissions for content, administrator management, and backups.

Putting it into production was the other half of the work, and I wanted to own that path rather than hand it to a managed platform. I provisioned a Hetzner Cloud server myself, deployed the services with Docker, routed them through Traefik, and pointed DNS at it through Cloudflare.

The site is online today, used by listeners, and I still maintain it myself — the infrastructure as much as the code.

  • React
  • TypeScript
  • Node.js
  • Express
  • MongoDB
  • Amazon S3
  • Docker
  • Traefik
  • Cloudflare
  • Hetzner Cloud

Waste-Container Fill-Level Alert System

GSF wanted its collection teams to know how full waste containers were before planning their routes. That became an academic project at École Centrale de Lyon between September 2019 and April 2020, where I was technical lead of the team building a connected system to measure fill levels and report them at regular intervals.

I led the electronics design and implementation, defining the communication path from an ultrasonic sensor and Arduino board to a LoRa gateway connected to GSF's servers. I wrote the Arduino/C++ firmware and configured measurements and transmissions at 30-minute intervals to limit device activity and conserve battery power.

I coordinated with the mechanical team, which used the school's FabLab to build an enclosure suited to a dirty and demanding environment. We field-tested the prototype in several containers. Without an intermediate relay, the LoRa link reached about 100 metres, which set the practical limit on how far a gateway could sit from a container.

The project strengthened my experience in embedded systems, low-power design, long-range communication, and multidisciplinary technical leadership.

  • Arduino
  • C++
  • LoRa
  • Ultrasonic Sensor

French Robotics Cup 2019 – Atom Factory

The 2019 French Robotics Cup asked teams to build autonomous robots for Atom Factory: a 100-second match with several scoring actions available and no prescribed order to perform them in. Strategy counted as much as reliable execution. I worked on École Centrale de Lyon's entry from September 2018 to June 2019.

As technical lead of the electronics team, I contributed extensively to the Python embedded software running on LEGO EV3 controllers, and coordinated the electronics work from implementation through to integration. Deciding what the robot would attempt in its 100 seconds meant working closely with the mechanical team, so that match strategy, physical capability, and software behavior all agreed.

We applied closed-loop control concepts from our ECL coursework to regulate the robots' movement and positioning. Our robots passed official homologation and competed in the event.

Very little of the result depended on the code alone: a strategy the mechanics could not execute cost exactly as many points as a mechanism the software could not drive.

  • Python
  • LEGO MINDSTORMS EV3
  • Embedded Systems
  • Closed-Loop Control

Persistence-of-Vision LED Display

For Polytechnique Day in 2018, the Robotech Club at École Supérieure Polytechnique de Dakar built a persistence-of-vision LED display that showed text sent from a smartphone over Bluetooth. The LED assembly was mounted on a motor that spun it 60 times per second, and the controller lit the right LEDs at each angular position so the eye read stable text rather than a blur.

As head of the club's IT department, I developed the native Android application in Java, agreed the communication format with the electronics team, and handled Bluetooth connection failures and retries. I also split the software work into tasks, set deadlines, and tracked delivery so the software side stayed in step with the other teams.

The finished display was demonstrated at the event. My part of it was the smartphone side — the app and its Bluetooth link — and the coordination with the electronics team: the message format had to be settled early, because neither side could test on its own until it existed.

  • Java
  • Android SDK
  • Bluetooth

Classroom Booking Desktop Application

A school in Senegal needed a clearer way for staff and teachers to see classroom schedules, find free rooms, and book them for upcoming courses. During my DUT, a friend and I volunteered to build the school a Java desktop application.

I designed the MySQL database and implemented the Java backend with JDBC, while my friend built the Swing interface. The backend checked availability before saving a booking, so two courses could not claim the same room at the same time.

It was my first substantial collaborative software project, and most of the difficulty was not the code: we had to agree where the frontend stopped and the backend began, keep our work in step, and integrate two halves built separately. We did all of that without version control, which is exactly how I learned what Git is for. We finished the application and handed it over to the school with its source code.

  • Java
  • Swing
  • JDBC
  • MySQL

Technical Skills

Backend

  • Java
  • Quarkus
  • Python
  • Maven
  • JPA / Hibernate

Identity & API Security

  • OAuth 2.0
  • OpenID Connect
  • JSON Web Tokens
  • OpenAPI

Data & Messaging

  • PostgreSQL
  • Apache AGE
  • MongoDB
  • Redis
  • Liquibase
  • RabbitMQ
  • MinIO

Cloud & Operations

  • Docker
  • Kubernetes
  • Helm
  • Microsoft Azure
  • AWS

Web Engineering

  • TypeScript
  • JavaScript
  • Node.js
  • React

Testing & Tooling

  • JUnit 5
  • Apache JMeter
  • Postman
  • Git
  • GitLab
  • UML

AI-Assisted Engineering

  • GitHub Copilot
  • Windsurf
  • Claude Code