e-Santé Bénin — Document technique

Plateforme collaborative et inclusive de suivi des patients Challenge e-Santé Bénin · Version 1.0 · septembre 2026

Plateforme en ligne https://sante.cafti-group.com
Code source https://github.com/ssid32-kg/sante-mtdi
Comptes de démonstration page /connexion (connexion en un clic) · mot de passe commun Demo2026!
Données 100 % fictives (personnes, NPI, IFU, numéros d'Ordre, AMM)

1. Résumé

e-Santé Bénin relie autour d'un dossier patient unique, identifié par le NPI, tous les acteurs du parcours de soins : patients et aidants, soignants, établissements, pharmacies, Ministère et agences. La plateforme a été conçue à partir de trois contraintes du terrain :

  1. Une part importante des patients ne lit pas, ou mal, le français, et certains vivent avec un handicap visuel ou auditif. Tout se lit à voix haute, les ordonnances sont dessinées en pictogrammes, les patients peuvent envoyer des messages vocaux, et aucune information ne passe uniquement par le son.
  2. La connectivité est faible et beaucoup de téléphones ne sont pas des smartphones. Les pages sont rendues côté serveur (environ 4 Ko compressés par page), la PWA fonctionne hors ligne, et l'essentiel reste accessible par SMS et USSD *789#.
  3. La confiance conditionne l'adoption. Le patient accorde et retire les accès, et voit qui a consulté son dossier. Les accès d'urgence sont justifiés, limités à 24 h et notifiés. Administrateurs et autorités n'accèdent jamais à un dossier individuel.

La plateforme est connectée (en simulation) à l'ANIP (NPI), à la DGI (IFU), aux Ordres professionnels, à l'ABMed, à l'ANPS (ARCH), au Mobile Money, à une passerelle SMS et à DHIS2 (SNIGS), via des connecteurs isolés et journalisés.


2. Analyse des usages

2.1 Problèmes du terrain et réponses apportées

Problème constaté Conséquence Réponse de la plateforme
Carnets papier perdus, dossiers propres à chaque structure Examens refaits, allergies ignorées, erreurs de prescription Dossier unique indexé par le NPI (identifiant pivot national), identité pré-remplie par l'ANIP, contrôle automatique des allergies à la prescription
Référence / contre-référence rarement bouclée Le patient arrive sans courrier au CHU, le centre d'origine n'a jamais de retour Module Références : urgence, résumé clinique, accès transmis au spécialiste (30 j), statuts, contre-référence obligatoire pour clôturer, délai d'acceptation mesuré
Perdus de vue (CPN, vaccination, hypertension, diabète, drépanocytose) Complications évitables Rappel SMS la veille, rendez-vous manqué détecté automatiquement avec relance du patient et du soignant, liste « À relancer », rappels de prise, alerte de vaccin en retard
Analphabétisme, langues nationales Mauvaise observance Posologie en pictogrammes (matin, midi, soir, coucher, avec un point par comprimé), lecture vocale partout, messages vocaux, mode images, compte aidant
Handicap visuel Exclusion numérique HTML sémantique, texte jusqu'à 150 %, contraste élevé, bouton « Écouter », commandes vocales
Handicap auditif Consultations et appels téléphoniques inaccessibles Tout est écrit, messagerie écrite avec le soignant, alertes visuelles, handicap signalé au soignant (« écrire, face à face »)
Réseau faible, téléphones basiques Service inutilisable Pages SSR très légères, PWA hors ligne, file d'envoi des messages, mode économie, USSD *789#, SMS
Faux médicaments (marchés informels) Intoxications, résistances Vérification AMM + lot auprès de l'ABMed (web et USSD), signalement de pharmacovigilance, délivrance tracée par code d'ordonnance
Ruptures de médicaments essentiels Traitements interrompus Stocks des officines, seuils d'alerte, carte des ruptures pour le Ministère
Paiement direct, couverture ARCH mal connue au guichet Renoncement aux soins Taux de prise en charge lu auprès de l'ANPS, tiers payant calculé en pharmacie, paiement Mobile Money du reste à charge
Remontée statistique lente (rapports papier) Décisions tardives, épidémies détectées trop tard Observatoire temps réel anonymisé et export DHIS2 (SNIGS)
Stigmatisation, confidentialité Refus de partager ses données Consentement granulaire, journal des accès visible par le patient, bris de glace tracé, secret statistique

2.2 Personas

Persona Contexte Ce que la plateforme change pour elle / lui
Afiavi, 35 ans, Abomey-Calavi Enceinte (29 SA), tension limite ; maman d'Ifè (19 mois, vaccin en retard) Un seul compte pour la famille, alertes, CPN rappelées, messagerie avec la sage-femme
Koffi, 69 ans, Porto-Novo Diabétique et hypertendu, malvoyant, lit peu, couvert ARCH 100 % Ordonnance lue à voix haute, rappels SMS de prise, rien à avancer en pharmacie
Bio, 28 ans, Parakou Drépanocytaire, sourd Échanges écrits avec le médecin, aucune information uniquement sonore
Mariam, 39 ans, Djougou Ne lit pas, téléphone basique, a manqué un rendez-vous Suivie par SMS et USSD, relancée automatiquement, ordonnance dessinée
Dr Hounkpatin, CS de Godomey Centre de santé périurbain saturé Historique immédiat, prescription rapide et sûre, références suivies
Clarisse, Ministère de la Santé Planification Indicateurs à jour, ruptures, perdus de vue, export DHIS2

2.3 Parcours clés

  1. Inscription vérifiée : NPI → identité lue auprès de l'ANIP → code SMS envoyé au numéro connu de l'ANIP → préférences (canal, lecture, handicap) → carnet créé, couverture ARCH lue auprès de l'ANPS. Si un centre de santé avait déjà créé le dossier, il est rattaché au compte.
  2. Enrôlement en consultation (patient sans smartphone) : le soignant saisit le NPI, le patient reçoit un code SMS et le lui dicte, ce qui prouve son accord.
  3. Consentement : demande à distance (le patient accepte ou refuse dans l'application), accord en présence (code SMS), accès d'urgence (justification, 24 h, SMS au patient).
  4. Prescription → pharmacie : ordonnance avec code dictable ORD-XXXXXX et QR, contrôle des allergies, SMS au patient. Le pharmacien ne voit que l'ordonnance, décrémente son stock et le tiers payant ARCH est calculé.
  5. Référence : envoi (établissement et spécialiste), accès transmis au spécialiste, acceptation, prise en charge, contre-référence renvoyée au centre d'origine et au patient.
  6. Surveillance : chaque consultation codée CIM-10 alimente l'observatoire ; l'export DHIS2 transmet des agrégats par département.

3. Fonctionnalités par espace

Espace Fonctionnalités
Public Accueil en tuiles, annuaire (établissements vérifiés par IFU, lits libres, urgences, maternités ; pharmacies de garde), conseils et alertes écoutables, vérification de médicament (ABMed) et signalement anonyme, simulateur USSD, pages Accessibilité / Projet / Documentation
Patient / aidant Tableau de bord vocal (« Écouter mon résumé »), médicaments du jour en pictogrammes, carnet (consultations, examens, vaccins, orientations), ordonnances avec QR, rendez-vous (demande, annulation, rappel), messagerie écrite et vocale, « Qui voit mon dossier » (accès, demandes, journal), paiements Mobile Money avec part ARCH déduite, carte d'urgence hors ligne imprimable avec QR, vue famille (personnes à charge)
Soignant Tableau de bord (rendez-vous du jour, références, perdus de vue, demandes de rendez-vous), recherche par NPI, trois modes d'accès (distance, code SMS, urgence), enrôlement ANIP, dossier complet ou résumé selon le consentement, consultation (constantes, CIM-10), e-ordonnance avec contrôle d'allergies, examens, vaccins, rendez-vous, références / contre-références, agenda, messagerie ; profil d'accessibilité du patient affiché
Pharmacie Délivrance par code ou QR (minimisation), délivrance partielle, stock (ruptures, seuils), tiers payant ARCH, garde (visible dans l'annuaire et sur *789#), pharmacovigilance
Établissement Lits disponibles, équipe (ajout après vérification ANIP + Ordre, refus si inscription suspendue), vérification de l'IFU auprès de la DGI, indicateurs (rendez-vous manqués, taux de contre-référence), circuit des références avec délais
Autorité sanitaire Observatoire (paludisme hebdomadaire, diagnostics, activité et perdus de vue par département, ruptures, circuit de référence), filtre par département, export DHIS2, transmission des signalements à l'ABMed, publication d'alertes avec diffusion SMS ciblée par département
Administration Comptes, supervision de l'interopérabilité (sondes, latences, erreurs, journal), journal SMS, réinitialisation de la démo
Canaux hors ligne USSD *789# (rendez-vous, médicaments du jour, pharmacies de garde, vérification de médicament, urgences) et SMS (OTP, rappels, relances, ordonnances, alertes)

4. Inclusion et accessibilité

Référentiel visé : WCAG 2.1 AA.

  • Visuel : structure sémantique (titres, régions, listes, tableaux avec en-têtes), lien d'évitement, focus orange très visible, texte à 4 niveaux (jusqu'à 150 %) sans perte de contenu, contraste élevé, icônes décoratives masquées (aria-hidden), pictogrammes de posologie accompagnés d'une description vocale (role="img" + aria-label), bouton Écouter (Web Speech API, voix française du téléphone, souvent disponible hors ligne), commandes vocales (« rendez-vous », « médicaments », « messages », « urgence »), région aria-live pour les annonces.
  • Auditif : aucune information uniquement sonore ; les messages vocaux sont une option en plus de l'écrit. Messagerie écrite avec le soignant, badges et bandeaux visuels, rendez-vous et consignes toujours écrits, profil « sourd : écrire » affiché dans l'agenda et le dossier.
  • Lecture : mode images (tuiles agrandies, textes secondaires masqués), posologie dessinée, lecture vocale, messages vocaux, compte aidant. L'inscription règle automatiquement l'affichage (texte agrandi pour « je vois mal », mode images pour « je ne lis pas »).
  • Moteur : cibles tactiles de 44 à 56 px, navigation complète au clavier.
  • Langues nationales : la synthèse vocale en fon, yoruba, bariba ou dendi n'est pas fiable aujourd'hui. Les messages vocaux permettent déjà l'échange oral dans n'importe quelle langue. La suite du projet prévoit des fiches audio enregistrées par des relais communautaires (voir § 12).
  • Sans JavaScript : tous les parcours fonctionnent avec des formulaires classiques ; le JavaScript ne fait qu'enrichir l'expérience (amélioration progressive).

5. Architecture technique

5.1 Vue d'ensemble

          Navigateur / PWA (HTML rendu serveur + ~5 Ko de JS optionnel)
          Téléphone basique ──► Agrégateur USSD ──► POST /api/ussd
                                     │
                     HTTPS (Let's Encrypt)  nginx du VPS
                                     │  127.0.0.1:3300
 ┌───────────────────────────────────▼───────────────────────────────────┐
 │  Conteneur « app » — Node.js 22 / Express                              │
 │                                                                        │
 │  routes/        public · auth · patient · soignant · pharmacie ·       │
 │                 etablissement · observatoire · contenus · admin · api  │
 │  middleware/    sessions · CSRF · rôles · helpers de vues              │
 │  services/      access (consentement) · audit · notify (SMS) · otp ·   │
 │                 records · messaging · posology · ussd · scheduler      │
 │  connectors/    anip · dgi · ordres · abmed · anps · momo · sms · dhis2│
 │        │ HTTP + clé API, délai max, nouvelle tentative, journalisation │
 │  sandbox/       API partenaires SIMULÉES (même contrat que la cible)   │
 └───────────────┬────────────────────────────────────────────────────────┘
                 │ pg (pool)
 ┌───────────────▼──────────────┐     ┌──────────────────────────┐
 │ Conteneur « db » PostgreSQL 16│     │ Volume « uploads »        │
 │ volume db-data                │     │ messages vocaux           │
 └───────────────────────────────┘     └──────────────────────────┘

5.2 Choix techniques et justification

Choix Pourquoi
Rendu serveur (Express + EJS), pas de SPA Première page utile en un aller-retour sur un réseau 2G/3G ; pas de bundle de framework à télécharger ; accessibilité native ; fonctionne sans JS
JavaScript vanilla (~5 Ko compressés) Amélioration progressive uniquement : voix, micro, file hors ligne, USSD
Polices système, icônes SVG en sprite unique 0 police téléchargée ; un seul fichier d'icônes mis en cache 30 jours
PostgreSQL Intégrité référentielle, transactions (délivrance, enrôlement), tableaux et JSONB, agrégats pour l'observatoire
SQL paramétré sans ORM Requêtes lisibles et optimisables, aucune injection possible ($1, $2…)
Connecteurs derrière un client HTTP commun Le reste du code ignore URL et formats ; passer en production revient à changer SANDBOX_URL et adapter l'adaptateur concerné
Bac à sable intégré Démonstration réaliste des échanges (latence, erreurs 404, clé API) sans dépendre de partenaires
Docker Compose Déploiement reproductible, isolé des autres services du VPS

5.3 Arborescence

src/
  app.js, server.js, config.js
  db/            pool.js · migrate.js · migrations/001_schema.sql · seed.js
  middleware/    auth.js · security.js (CSRF, flash, limites) · locals.js
  connectors/    http.js (client commun) · index.js (8 partenaires + catalogue)
  sandbox/       registry.js (référentiels fictifs) · router.js (API simulées)
  services/      access · audit · catalog · codes · messaging · notify · otp ·
                 posology · records · scheduler · ussd · validators
  routes/        un fichier par espace
  views/         layout + une vue par écran (EJS)
public/          css/app.css · js/app.js · js/sw.js · icons.svg · manifest
tests/           domain.test.js · ussd.test.js (node:test)
deploy/          nginx-sante.conf · deploy.sh

5.4 Tâches de fond (services/scheduler.js, toutes les 5 min)

  • Rappel SMS et notification 24 h avant chaque rendez-vous.
  • Rendez-vous non honoré depuis 6 h → statut manqué, relance SMS du patient, notification du soignant.
  • Rappels de prise à 7 h, 12 h, 19 h et 21 h (heure du Bénin) pour les patients qui les ont activés, sans doublon grâce à reminder_log.

6. Modèle de données

Table Rôle
users Comptes (6 rôles), NPI, Ordre, rattachement établissement ou pharmacie
patients Dossier, indépendant d'un compte (un patient sans smartphone a un dossier) ; ARCH, handicaps, niveau de lecture, canal préféré, aidant
consents Qui peut voir quel dossier : portée complet / resume / urgence, statut, motif, expiration
encounters Consultations, constantes (JSONB), diagnostic CIM-10
prescriptions, prescription_items E-ordonnance, code court, posologie par moment, quantités délivrées
medications, pharmacy_stock, dispensations Référentiel AMM, stocks, délivrances avec part ARCH
appointments Rendez-vous (demandé, prévu, honoré, manqué, annulé), rappel envoyé
lab_results, vaccinations Examens (anormal), vaccins (prochaine dose)
referrals Référence, urgence, statut, contre-référence, horodatages
threads, messages Messagerie texte ou vocale, accusé de lecture
notifications, sms_outbox, otp_codes, reminder_log Notifications, SMS, OTP hachés, anti-doublon des rappels
payments Mobile Money, part couverte
articles Gestion de contenu (catégorie, pictogramme, département ciblé)
product_reports Pharmacovigilance
audit_log Traçabilité des accès et actions, affichée au patient
interop_log Journal des appels aux partenaires

Migrations SQL versionnées (schema_migrations), appliquées au démarrage dans une transaction.


7. Interopérabilité

Chaque partenaire a un adaptateur dans src/connectors/index.js. Tous passent par src/connectors/http.js :

  • clé API dans l'en-tête X-Api-Key ;
  • délai maximal de 6 s (AbortSignal.timeout) et une nouvelle tentative sur erreur réseau ;
  • journalisation de chaque appel (partenaire, opération, statut HTTP, latence) dans interop_log, visible dans Administration → Interopérabilité avec des sondes de santé ;
  • erreurs typées ConnectorError, avec un message clair pour l'usager. Un partenaire en panne n'empêche jamais un parcours non dépendant : l'ARCH est relue plus tard, un SMS en échec est journalisé.
Partenaire (simulé) Contrat du bac à sable Utilisé pour
ANIP GET /anip/v1/personnes/{npi} Inscription, enrôlement, ajout de soignant (identité + téléphone) ; cache mémoire de 10 min
DGI GET /dgi/v1/ifu/{ifu} Authentification des établissements et pharmacies
Ordres (ONMB, sages-femmes, infirmiers, ONPB) GET /ordres/v1/professionnels/{numero} Création des comptes soignants (refus si suspendu ou si le NPI ne correspond pas)
ABMed GET /abmed/v1/produits?q=&lot= · POST /abmed/v1/signalements Vérification AMM/lot, transmission de la pharmacovigilance
ANPS — ARCH GET /anps/v1/arch/assures/{npi} Taux de prise en charge, tiers payant
Mobile Money POST /momo/v1/requesttopay · GET …/{ref} Paiement du reste à charge (confirmation asynchrone)
Passerelle SMS POST /sms/v1/messages OTP, rappels, relances, alertes
DHIS2 (SNIGS) POST /dhis2/api/dataValueSets Export d'agrégats CONSULT_<CIM10> × département × mois
Agrégateur USSD (entrant) POST /api/ussd (sessionId, phoneNumber, text → CON … / END …) Menu *789#

Passage en production : remplacer SANDBOX_URL par l'URL du partenaire (ou une URL par partenaire), signer les conventions d'échange, et adapter les formats dans l'adaptateur concerné. Aucun autre fichier n'est touché.


8. Sécurité et protection des données

8.1 Contrôle d'accès (src/services/access.js)

Une fonction pure et testée, decide(user, patient, consents), prend toutes les décisions :

  • patient : son dossier (titulaire) et ceux dont il est aidant ;
  • soignant : uniquement avec un consentement actif non expiré ; la portée resume n'autorise ni la lecture des notes ni l'écriture ;
  • accès d'urgence : motif obligatoire, 24 h, tracé en rouge, SMS immédiat au patient ;
  • pharmacien : jamais le dossier, seulement l'ordonnance présentée (code) et les allergies ;
  • administrateur, autorité, établissement : aucun dossier individuel.

8.2 Traçabilité

Chaque consultation de dossier (une trace par heure au plus), création, délivrance, accès d'urgence et décision de consentement est écrite dans audit_log et affichée au patient (« Journal des accès »).

8.3 Mesures techniques

Menace Mesure
Injection SQL Requêtes 100 % paramétrées
XSS Échappement EJS par défaut, Markdown des contenus sans HTML brut, CSP stricte (script-src 'self', aucun script inline)
CSRF Jeton de synchronisation en session (champ caché ou en-tête X-CSRF-Token), comparaison à temps constant
Vol de session Cookie HttpOnly, Secure, SameSite=Lax, régénération à la connexion, expiration 8 h glissante, sessions en base
Force brute Limitation (30 tentatives / 15 min) sur connexion, OTP et inscription ; OTP bloqué après 5 essais
OTP 6 chiffres aléatoires cryptographiques, stocké haché (HMAC-SHA256), 5 min, usage unique, jamais archivé en clair hors démo
Mots de passe (facultatifs) bcrypt
Fichiers audio Taille limitée (2 Mo), type contrôlé, noms aléatoires, servis uniquement aux membres de la conversation
En-têtes Helmet (HSTS, nosniff, frame-ancestors 'none', Referrer-Policy), Permissions-Policy (micro seulement)
Redirections Seulement vers des chemins internes
Ré-identification statistique Secret statistique : effectifs < 5 affichés « <5 » ; export DHIS2 sans donnée nominative
Données en cache sur le téléphone Le service worker efface les pages en cache à la déconnexion

8.4 Cadre légal

Le traitement est conçu pour respecter le Code du numérique (loi n° 2017-20) : finalité déterminée, minimisation (pharmacie), consentement explicite, droit d'accès (journal), sécurité. La mise en production supposera une autorisation de l'APDP pour les données de santé et un hébergement national agréé.


9. Performance et connectivité limitée

Mesures sur la plateforme en ligne (octets transférés, compression gzip) :

Ressource Poids
Page d'accueil (HTML) ~4,0 Ko
Feuille de style (unique, cache 30 j) ~6,5 Ko
JavaScript (optionnel, cache 30 j) ~5,2 Ko
Sprite d'icônes (cache 30 j) ~2,9 Ko
Première visite complète ≈ 19 Ko
Pages suivantes ≈ 3 à 5 Ko
  • PWA : service worker « réseau d'abord, copie en cache » pour les pages (carnet, ordonnances, carte d'urgence consultables hors ligne) et « cache d'abord » pour les ressources statiques versionnées.
  • File d'envoi hors ligne : un message écrit sans réseau est conservé et envoyé au retour de la connexion.
  • Mode Économie : désactive toute requête automatique (rafraîchissement de la messagerie).
  • Messages vocaux en Opus 24 kbit/s : environ 180 Ko par minute.
  • USSD et SMS : aucune donnée mobile requise pour l'essentiel.

10. Qualité du code

  • Tests (npm test, node:test) : 15 tests sur le cœur métier (validation NPI, IFU, téléphone, dates ; posologie et phrases vocales ; règles de consentement ; codes ; détection d'allergies ; menu USSD complet). Ils sont exécutés pendant le build Docker : un test en échec bloque le déploiement.
  • Intégration continue : GitHub Actions (.github/workflows/ci.yml).
  • Logique métier en fonctions pures (accès, posologie, USSD) avec dépendances injectées, donc testable sans base.
  • Validation systématique des entrées (services/validators.js), transactions pour les opérations multi-tables, gestion d'erreurs centralisée.
  • Code et commentaires en français, alignés sur le vocabulaire métier (CPN, ARCH, contre-référence…).

11. Déploiement

git clone https://github.com/ssid32-kg/sante-mtdi.git && cd sante-mtdi
cp .env.example .env          # ou laisser deploy.sh générer des secrets aléatoires
sh deploy/deploy.sh           # build + tests + démarrage + vhost nginx + certificat TLS
Variable Rôle
POSTGRES_PASSWORD Mot de passe de la base
SESSION_SECRET Secret des sessions et de l'OTP (32 caractères min. en production)
SANDBOX_API_KEY / SANDBOX_URL Clé et URL des partenaires
PUBLIC_URL URL publique (QR codes)
DEMO_MODE true : comptes en un clic, téléphone simulé, SMS lisibles
APP_PORT Port local exposé à nginx (3300)

Au démarrage, l'application attend PostgreSQL, applique les migrations et charge les données de démonstration si la base est vide. Supervision : GET /healthz, HEALTHCHECK Docker, journal des connecteurs. Sur le VPS, l'application tourne derrière le nginx existant (terminaison TLS Let's Encrypt) et n'écoute que sur 127.0.0.1.

Développement local : docker compose up --build, puis http://localhost:3300.


12. Démonstration

Compte (NPI) Profil
1000000001 Afiavi ADJOVI Patiente enceinte, maman d'Ifè (aidante) — demande d'accès en attente
1000000002 Koffi DOSSOU Malvoyant, diabétique, ARCH 100 %
1000000003 Bio SANNI Sourd, drépanocytaire, ARCH 70 %
2000000001 Dr HOUNKPATIN Médecin, CS de Godomey — agenda du jour, perdus de vue
2000000002 Estelle GBAGUIDI Sage-femme, HZ Abomey-Calavi
2000000003 Dr CHABI Cardiologue, CNHU — référence urgente reçue
3000000001 Dr TOSSOU Pharmacienne, Godomey
4000000001 J.-B. AKPOVI Directeur, HZ Abomey-Calavi
5000000001 Clarisse ZINSOU Ministère de la Santé
9000000001 Administrateur Contenus, interopérabilité, réinitialisation

Données utiles pour tester : ordonnances ORD-K7F3QA, ORD-B9SX4M, ORD-M3PX7C ; NPI non inscrits 1098765432, 1098765433 ; lots sous alerte LOT-FK2291, LOT-PX0457, LOT-AM7781 ; soignant suspendu 2000009999 / ONMB-2009-0999 ; numéro Mobile Money finissant par 0000 pour simuler un échec ; USSD avec le numéro 01 97 00 00 05 (Mariam).


13. Limites et feuille de route

Limites assumées : partenaires simulés ; synthèse vocale dépendante des voix installées ; pas encore de téléconsultation vidéo ; notifications push non implémentées (SMS et notifications internes à la place).

Feuille de route :

  1. Conventions d'échange et raccordement réel : ANIP, ANPS, ABMed, agrégateur SMS/USSD, DHIS2 national.
  2. Fiches audio en langues nationales (fon, yoruba, bariba, dendi, goun…) enregistrées par des relais communautaires, et vidéos en langue des signes pour les conseils clés.
  3. Serveur vocal interactif (appel gratuit) pour les personnes qui ne lisent pas.
  4. Interopérabilité clinique HL7 FHIR (Patient, Encounter, MedicationRequest) pour les logiciels hospitaliers.
  5. Synchronisation hors ligne complète pour les agents de santé communautaires en zone blanche.
  6. Hébergement souverain, autorisation APDP, audit de sécurité indépendant.