Laravel
Angular
Health-Tech

La première application dédiée aux approches non médicamenteuses (INM) scientifiquement validées.

Kalya Pro

Le contexte

Un patient souffre de migraines. Son médecin lui parle de magnésium, une amie lui conseille le yoga, un forum lui vend du curcuma. Qu'est-ce qui marche, et avec quel niveau de preuve ? Pour les approches non médicamenteuses (les INM : phytothérapie, micronutrition, thérapies manuelles, activité physique adaptée, thérapies brèves...), la réponse existe dans la littérature scientifique, mais elle est dispersée dans des milliers de publications que personne n'a le temps de lire.

Kalya Pro est née de ce constat. Le projet, porté par la startup Kalya Santé, consiste à répertorier ces approches, à évaluer leur efficacité pour chaque problème de santé à partir des études disponibles, et à restituer tout ça de façon lisible. J'y ai passé quatre ans, de 2022 à 2026, sur l'application, son API et son service d'authentification.

Page d'accueil Kalya Pro

Ce que fait l'application

L'utilisateur arrive avec une question (« sommeil », « arthrose du genou », « thé vert ») et repart avec un état des connaissances : quelles interventions ont été étudiées pour ce problème, avec quel résultat, et sur combien de publications ça repose.

flowchart LR
A["🔎 Une recherche"] --> B["🩺 Un problème de santé"]
B --> C["🌿 Les interventions évaluées"]
C --> D["📊 Le Kalya Score"]
D --> E["📚 Les publications sources"]

style A fill:#009DBE,color:#fff
style B fill:#096C8C,color:#fff
style C fill:#54B195,color:#fff
style D fill:#70B62C,color:#fff
style E fill:#232C33,color:#EAEEF2

Chaque fiche croise un problème de santé et une intervention. C'est cette relation, « telle approche est évaluée pour tel problème », qui structure toute l'application. Autour, on trouve un fil d'actualité scientifique (les nouvelles méta-analyses, résumées en deux phrases), des fiches sécurité avec les contre-indications, une recherche guidée pour ceux qui ne savent pas par où commencer, et un espace pour sauvegarder ce qu'on a lu.

Application Kalya Pro

L'interface est sombre par défaut. Un choix fait pour les professionnels de santé qui passent de longues sessions dans l'outil, pas pour faire joli : on y lit des tableaux d'évaluation pendant une heure, autant que les yeux tiennent.

Trois publics, une seule application

Public Accès Ce qu'il vient chercher
Grand public Gratuit Comprendre les INM, suivre l'actualité scientifique
Professionnels de santé Premium Les évaluations détaillées, la bibliographie, les fiches sécurité, des outils d'aide à la prescription
Marques partenaires B2B Référencer leurs produits sur la marketplace

Un seul code, trois usages. Les contenus premium sont verrouillés côté serveur, l'interface se contente d'afficher ce que l'utilisateur a le droit de voir.

Le Kalya Score : lire l'efficacité d'un coup d'œil

Le cœur scientifique du projet, c'est un score de 0 à 4 attribué à chaque couple problème / intervention. Il résume ce que les publications disponibles disent de cette intervention pour ce problème. L'algorithme a été conçu avec une équipe de recherche universitaire ; mon rôle a été de l'implémenter et de le faire tourner sur l'ensemble de la base.

Pour qu'il se lise sans légende, les couleurs vont du froid au chaud :

Score Couleur Ce que ça veut dire
0 Gris Pas assez de données
1 Bleu profond Preuves faibles
2 Bleu Preuves modérées
3 Vert d'eau Bonnes preuves
4 Vert vif Preuves solides

Un professionnel qui parcourt trente fiches dans la journée n'a pas besoin de lire le chiffre. La couleur suffit.

Quatre ans, quatre versions d'Angular

Un projet qu'on démarre en 2022 et qu'on maintient jusqu'en 2026 ne ressemble plus du tout à sa première version. Voilà à quoi ça ressemble, vu de l'intérieur :

Année Ce qui a changé
2022 Première version. Angular 14, Laravel 9, déjà bilingue FR/EN
2023 L'application passe sur mobile (iOS et Android) avec Capacitor, la recherche est refaite avec Meilisearch
2024 Grand chantier : l'API est isolée dans son propre dépôt, l'authentification devient un service à part (SSO), les abonnements passent par Stripe, le système de traduction est reconstruit
2025 et 2026 Stabilisation, performances, montées de version

Chaque montée de version d'Angular (14, 15, 16, 17, 18) a été l'occasion de reprendre une partie du code plutôt que de bricoler des rustines. C'est ce cycle qui m'a appris à écrire du code qui anticipe le prochain changement, parce qu'il y en a toujours un.

L'exemple dont je suis le plus content : au démarrage, l'application enchaînait ses vérifications l'une après l'autre (le jeton d'authentification, puis la langue, puis la connexion temps réel...) et l'écran restait figé trois à cinq secondes. En lançant ces opérations en parallèle et en ne bloquant que sur celle qui compte vraiment (l'authentification), l'attente a fondu. Aucune ligne de la logique métier n'a bougé. Juste l'ordre dans lequel on fait les choses.

Ce que la durée a imposé

Chercher malgré les fautes de frappe

« Fibromialgie », « curcumin », « ashwaganda » : les utilisateurs tapent comme ils entendent. J'ai d'abord essayé Algolia, un service américain facturé à l'usage. En 2023, je l'ai remplacée par Meilisearch, un moteur open source français qu'on héberge soi-même. Même tolérance aux fautes, coût maîtrisé, et les données de santé ne partent pas chez un tiers.

Détail qui compte : il y a un index de recherche par langue. Un utilisateur anglophone ne voit jamais remonter une fiche française à moitié traduite. Et les problèmes de santé remontent toujours avant le reste, parce que c'est par là qu'on entre dans l'application.

Deux langues, sans doublons

Chaque contenu existe en français et en anglais. Plutôt que de dupliquer les fiches, chaque table de données a sa table de traductions jumelle : la fiche « Migraine » existe une fois, ses textes existent deux fois. L'application détecte la langue de l'utilisateur et sert la bonne version sans que le reste du code ait à s'en préoccuper. Sur les 77 migrations de base de données du projet, à peu près la moitié servent à ça.

Un compte pour tout

Kalya Santé ne fait pas tourner qu'une application publique. Il y a aussi un back-office de contenu, des outils de modération, des interfaces d'administration. Dès 2024, j'ai sorti l'authentification dans un service dédié : un éditeur se connecte une fois et accède à tous les outils. Le même service gère la connexion via Google, Apple ou Microsoft, et l'accès de partenaires B2B.

Isoler l'authentification, c'est aussi réduire la surface d'attaque : un bug dans l'application ne met pas les identifiants en danger.

Le téléphone et le web, un seul code

L'application tourne sur le web, sur iOS et sur Android à partir du même code Angular, grâce à Capacitor. Ce qui change d'une plateforme à l'autre (l'écran de démarrage, le partage natif, les achats intégrés, le retour dans l'app après une connexion Google) est isolé dans une poignée de branchements.

Le piège classique, c'est le numéro de version : il faut le mettre à jour dans le package.json, dans la configuration Android et dans celle d'iOS, à la main, et un décalage entre les trois fait échouer la publication. J'ai écrit un script qui synchronise les trois à chaque build. Une source d'erreur en moins.

Payer sans friction

Les abonnements premium passent par Stripe sur le web et par les achats intégrés sur mobile. Le serveur reçoit les événements de paiement (abonnement créé, paiement échoué, abonnement résilié) et met à jour les droits de l'utilisateur en temps réel. La vérification se fait à trois endroits : le serveur refuse la requête, l'interface cache le contenu, et une page d'upsell prend le relais. Le premier niveau est le seul qui compte pour la sécurité ; les deux autres sont là pour l'expérience.

Sous le capot (vulgarisé)

Pour les curieux, la structure du projet tient en trois briques qui vivent chacune dans leur propre dépôt :

flowchart LR
A["📱 Application\nAngular + Capacitor"]
B["⚙️ API métier\nLaravel"]
C["🔐 Authentification\nLaravel + OAuth 2.0"]
D["🔍 Meilisearch"]
E["💳 Stripe"]
F["🛡️ Sentry · 📊 Matomo"]

A <--> B
A <--> C
B <--> C
B --> D
B --> E
A -.-> F
B -.-> F

style A fill:#009DBE,color:#fff
style B fill:#54B195,color:#fff
style C fill:#096C8C,color:#fff
style D fill:#232C33,color:#EAEEF2
style E fill:#232C33,color:#EAEEF2
style F fill:#232C33,color:#EAEEF2

Illustration architecture

Cette séparation, mise en place en 2023 et 2024, a été la meilleure décision d'architecture du projet. Chaque brique évolue à son rythme (l'authentification en est à sa version 1.1, l'API à sa version 4.3), une panne sur l'une n'entraîne pas les autres, et le service d'authentification est réutilisé par les outils internes de l'entreprise.

Deux niveaux de cache

Les données de Kalya Pro changent rarement (une fiche est mise à jour quand une nouvelle étude sort) mais sont lues en permanence. Les listes stables, comme les catégories, sont mises en cache une fois pour toutes. Les résultats filtrés (« les interventions pour la migraine, triées par score, filtrées sur la phytothérapie ») sont mis en cache par combinaison de filtres : la première personne qui pose la question attend la base de données, les suivantes ont la réponse instantanément.

Savoir ce qui se passe en production

Quatre outils, chacun son rôle : Sentry remonte les erreurs (côté application et côté serveur), Matomo mesure l'audience sans cookie tiers et dans le respect du RGPD, et chaque requête envoyée à l'API embarque discrètement d'où elle vient (quelle page, quelle fiche, quelle plateforme). De quoi comprendre comment les utilisateurs naviguent réellement, sans traqueur publicitaire.

Stack technique

Couche Technologie Pourquoi ce choix
Frontend Angular 18 + TailwindCSS Typage fort, structure qui tient dans la durée, mode sombre natif
Mobile Capacitor 6 Un seul code pour le web, iOS et Android
API Laravel 10 (PHP 8.1) Framework complet, ORM solide, traductions et paiements bien outillés
Authentification Laravel Passport (OAuth 2.0) Serveur d'identité mutualisé entre l'app publique et les outils internes
Recherche Meilisearch Open source, français, tolérant aux fautes, auto-hébergé
Paiement Stripe + achats intégrés iOS/Android Abonnements web et mobile, événements traités côté serveur
Temps réel Laravel Echo + Pusher Notifications sans recharger la page
Observabilité Sentry, Matomo Erreurs et audience, conformes RGPD

En chiffres

Durée 4 ans (2022 à 2026)
Plateformes Web, iOS, Android
Langues Français, anglais
Dépôts 3 (application, API, authentification)
Modèles de données 78
Version finale livrée 4.4.3