---
{
  "title": "Termbox : un serveur de Terminology FHIR (Introduction)",
  "description": "Termbox est un serveur de Terminology FHIR haute performance : SNOMED, LOINC, RxNorm, ICD-10 et conformité FHIR R4/R5 — essayez-le gratuitement.",
  "date": "2026-04-20",
  "author": "Orlando Osorio",
  "tags": [
    "Terminology",
    "Termbox",
    "Announcement"
  ]
}
---
Nous sommes ravis d'annoncer Termbox : un serveur de [Terminology FHIR](/articles/two-phase-fhir-terminology). Conçu de zéro en mettant la performance au premier plan. Pensé pour s'adapter à n'importe quelle terminologie, quelle qu'en soit la complexité.

## Pourquoi nous avons créé Termbox

Après plus de 20 ans dans le domaine de la santé et plus de 10 ans à travailler avec FHIR, nous avons observé un schéma récurrent : les organisations construisent une solution qui comprend souvent des interfaces utilisateur, des couches de stockage, des pipelines d'intégration, de la validation, etc. Elles adoptent FHIR à plusieurs niveaux pour que les différents composants puissent interagir facilement. À un moment donné, elles doivent récupérer des données provenant de sources externes : informations sur les médicaments, connaissances cliniques, analyses de laboratoire, classifications des maladies. Elles doivent valider des données, alimenter un champ de recherche, traduire des codes locaux en codes normalisés. Tous ces besoins sont des problèmes de terminologie.

Pour les cas les plus simples, notre recommandation a été d'utiliser le [module de Terminology d'Aidbox](/docs/aidbox/terminology-module/aidbox-terminology-module) — une approche légère qui couvre les cas courants et permet aux équipes de démarrer rapidement (une approche répandue dans l'industrie, une implémentation allégée des fonctions essentielles). Mais à mesure que les exigences augmentent, les limites apparaissent. Filtrage complexe, hiérarchies, localisation, ensembles de valeurs complexes, terminologies à syntaxe propre. Et il y a aussi le contenu lui-même : trouver les sources, gérer les différents formats, les calendriers de publication variés, les licences, maintenir tout à jour. La recommandation devient alors d'utiliser un serveur de terminologie.

Les implémenteurs voient facilement l'intérêt de séparer la terminologie en tant que serveur ou composant distinct. Compte tenu de la nature des données — immuables, avec leur propre origine et cycle de vie, indépendantes du locataire — cela a du sens sur le plan architectural. Mais des préoccupations subsistent : un serveur de terminologie peut devenir un goulot d'étranglement. Les requêtes orientées utilisateur doivent répondre en millisecondes en parcourant des centaines de milliers de termes ; la validation lors de l'ingestion des données peut ralentir l'ensemble du système. Il y a aussi le volet opérationnel, une source d'inquiétude fréquente : faire tourner un service supplémentaire, mettre en place les pipelines pour maintenir les données à jour. Nous avons créé Termbox pour répondre à toutes ces préoccupations.

## Performance

Termbox est rapide, vraiment rapide.

Nous savions que la performance était une exigence essentielle, alors nous avons entrepris de bâtir un serveur capable de gérer n'importe quelle terminologie, aussi complexe soit-elle, tout en retournant les résultats en moins de 40 ms pour les opérations les plus complexes.

Plus tôt ce mois-ci, nous avons publié le [FHIR TX Benchmark](fhir-tx-benchmark) : un test comparatif ouvert comparant les principaux serveurs de terminologie sur le marché. Termbox s'est classé premier, et ce n'était pas serré : plusieurs fois plus rapide que ses concurrents, jusqu'à 30 fois plus rapide sur les opérations les plus complexes.

<div class="table-wrapper narrow" style="background:#181b2e;border-radius:10px;overflow:hidden;font-family:system-ui,-apple-system,sans-serif;margin:2rem 0;border:1px solid #252840;">
  <table style="width:100%;border-collapse:collapse;font-size:14px;white-space:nowrap;">
    <thead>
      <tr style="border-bottom:1px solid #252840;">
        <th style="text-align:left;padding:8px 16px;color:#6b7280;font-size:11px;text-transform:uppercase;letter-spacing:0.06em;background:transparent;border-bottom:1px solid #252840;width:40px;">#</th>
        <th style="text-align:left;padding:8px 16px;color:#6b7280;font-size:11px;text-transform:uppercase;letter-spacing:0.06em;background:transparent;border-bottom:1px solid #252840;width:130px;">Server</th>
        <th style="text-align:left;padding:8px 16px;color:#6b7280;font-size:11px;text-transform:uppercase;letter-spacing:0.06em;background:transparent;border-bottom:1px solid #252840;width:100%;">Score</th>
      </tr>
    </thead>
    <tbody>
      <tr style="border-bottom:1px solid #252840;">
        <td style="padding:9px 16px;color:#6b7280;font-size:12px;vertical-align:middle;border-bottom:1px solid #252840;">1</td>
        <td style="padding:9px 16px;font-weight:500;color:#e4e4e4;vertical-align:middle;border-bottom:1px solid #252840;">termbox</td>
        <td style="padding:9px 16px;min-width:220px;width:100%;vertical-align:middle;border-bottom:1px solid #252840;">
          <div style="display:flex;align-items:center;gap:10px;">
            <div style="flex:1;height:22px;border-radius:4px;background:#1e2236;overflow:hidden;">
              <div style="--s:100;width:calc(var(--s) * 1%);height:100%;border-radius:4px;background:linear-gradient(90deg,#f2495c,#fade2a,#73bf69);background-size:calc(100% * 100 / var(--s)) 100%;"></div>
            </div>
            <span style="font-weight:600;color:#e4e4e4;min-width:38px;text-align:right;">100%</span>
          </div>
        </td>
      </tr>
      <tr style="border-bottom:1px solid #252840;">
        <td style="padding:9px 16px;color:#6b7280;font-size:12px;vertical-align:middle;border-bottom:1px solid #252840;">2</td>
        <td style="padding:9px 16px;font-weight:500;color:#e4e4e4;vertical-align:middle;border-bottom:1px solid #252840;">fhirsmith</td>
        <td style="padding:9px 16px;min-width:220px;width:100%;vertical-align:middle;border-bottom:1px solid #252840;">
          <div style="display:flex;align-items:center;gap:10px;">
            <div style="flex:1;height:22px;border-radius:4px;background:#1e2236;overflow:hidden;">
              <div style="--s:38;width:calc(var(--s) * 1%);height:100%;border-radius:4px;background:linear-gradient(90deg,#f2495c,#fade2a,#73bf69);background-size:calc(100% * 100 / var(--s)) 100%;"></div>
            </div>
            <span style="font-weight:600;color:#e4e4e4;min-width:38px;text-align:right;">38%</span>
          </div>
        </td>
      </tr>
      <tr style="border-bottom:1px solid #252840;">
        <td style="padding:9px 16px;color:#6b7280;font-size:12px;vertical-align:middle;border-bottom:1px solid #252840;">3</td>
        <td style="padding:9px 16px;font-weight:500;color:#e4e4e4;vertical-align:middle;border-bottom:1px solid #252840;">ontoserver</td>
        <td style="padding:9px 16px;min-width:220px;width:100%;vertical-align:middle;border-bottom:1px solid #252840;">
          <div style="display:flex;align-items:center;gap:10px;">
            <div style="flex:1;height:22px;border-radius:4px;background:#1e2236;overflow:hidden;">
              <div style="--s:21;width:calc(var(--s) * 1%);height:100%;border-radius:4px;background:linear-gradient(90deg,#f2495c,#fade2a,#73bf69);background-size:calc(100% * 100 / var(--s)) 100%;"></div>
            </div>
            <span style="font-weight:600;color:#e4e4e4;min-width:38px;text-align:right;">21%</span>
          </div>
        </td>
      </tr>
      <tr style="border-bottom:1px solid #252840;">
        <td style="padding:9px 16px;color:#6b7280;font-size:12px;vertical-align:middle;border-bottom:1px solid #252840;">4</td>
        <td style="padding:9px 16px;font-weight:500;color:#e4e4e4;vertical-align:middle;border-bottom:1px solid #252840;">snowstorm</td>
        <td style="padding:9px 16px;min-width:220px;width:100%;vertical-align:middle;border-bottom:1px solid #252840;">
          <div style="display:flex;align-items:center;gap:10px;">
            <div style="flex:1;height:22px;border-radius:4px;background:#1e2236;overflow:hidden;">
              <div style="--s:7;width:calc(var(--s) * 1%);height:100%;border-radius:4px;background:linear-gradient(90deg,#f2495c,#fade2a,#73bf69);background-size:calc(100% * 100 / var(--s)) 100%;"></div>
            </div>
            <span style="font-weight:600;color:#e4e4e4;min-width:38px;text-align:right;">7%</span>
          </div>
        </td>
      </tr>
      <tr>
        <td style="padding:9px 16px;color:#6b7280;font-size:12px;vertical-align:middle;">5</td>
        <td style="padding:9px 16px;font-weight:500;color:#e4e4e4;vertical-align:middle;">hades</td>
        <td style="padding:9px 16px;min-width:220px;width:100%;vertical-align:middle;">
          <div style="display:flex;align-items:center;gap:10px;">
            <div style="flex:1;height:22px;border-radius:4px;background:#1e2236;overflow:hidden;">
              <div style="--s:6;width:calc(var(--s) * 1%);height:100%;border-radius:4px;background:linear-gradient(90deg,#f2495c,#fade2a,#73bf69);background-size:calc(100% * 100 / var(--s)) 100%;"></div>
            </div>
            <span style="font-weight:600;color:#e4e4e4;min-width:38px;text-align:right;">6%</span>
          </div>
        </td>
      </tr>
    </tbody>
  </table>
</div>

Nous publierons prochainement un article dédié à la performance : comment nous l'avons bâtie, quelques-uns des défis rencontrés, et ce que les chiffres signifient concrètement.

## Contenu

L'un des coûts cachés de l'exploitation d'un serveur de terminologie est la préparation du contenu. Trouver les sources, comprendre et négocier les conditions de licence, convertir les différents formats en FHIR, charger et indexer, mettre en place des pipelines pour maintenir le contenu à jour. Cela peut prendre des semaines avant que tout soit en place.

Termbox prend en charge plusieurs façons de charger les données : ressources FHIR, paquets regroupés, paquets, binaires pré-indexés, flux Atom. Le chargement est rapide : passer de zéro à un SNOMED entièrement indexé prend environ 1 minute.

Nous travaillons également sur la Galerie Termbox : un répertoire organisé de terminologies FHIR construit sur des années de travail réalisé avec nos clients : scripts de conversion, pipelines de données, ententes de licence, incluant des droits de distribution pour certaines terminologies afin que vous puissiez obtenir le contenu directement auprès de nous. Nous en parlerons davantage dans un prochain article.

## Conformité

Termbox couvre les opérations de Terminology FHIR les plus couramment utilisées : `$lookup`, `$validate-code`, `$expand`, `$subsumes`, (`$translate` à venir). Les opérations dont la plupart des systèmes sont susceptibles de dépendre.

Nous travaillons activement à la conformité complète avec la suite de tests du [FHIR TX Ecosystem IG](https://build.fhir.org/ig/HL7/fhir-tx-ecosystem-ig/) et nous progressons bien. La plupart des tests en échec aujourd'hui concernent des détails de surface comme le formatage des messages d'erreur et les paramètres de métadonnées, plutôt que des lacunes dans les fonctionnalités de base. Nous prévoyons d'atteindre la conformité complète dans les prochains mois. Un article dédié à la conformité est en préparation.

## Essayez-le

Vous pouvez démarrer avec Termbox en quelques minutes : un `docker compose up` et vous êtes opérationnel. La licence de développement est gratuite pour le développement, l'évaluation et les usages hors production.

<div style="text-align:center;margin:2rem 0;">
  <a href="/docs/termbox/getting-started" style="display:inline-block;background:#ea4a35;color:#fff;font-weight:600;padding:12px 28px;border-radius:8px;text-decoration:none;font-size:15px;">Commencer</a>
</div>

## La suite

Il s'agit du premier d'une série d'articles sur Termbox. Nous approfondirons les sujets de la performance, de la gestion du contenu et de la conformité. D'autres articles arrivent bientôt.

Nous travaillons également sur une option SaaS hébergée pour les équipes qui ne souhaitent pas gérer leur propre instance. Nous collaborerons aussi avec la communauté pour ouvrir en source libre les scripts de conversion que nous utilisons pour construire la distribution FHIR des terminologies.

Dans le cadre de notre travail de consultation, nous travaillons aussi avec des clients d'entreprise sur des fonctionnalités qui ne sont pas encore normalisées : prise en charge de bases de connaissances, intégration et capacités d'IA, recherche sémantique. Nous aurons plus à partager à ce sujet prochainement.

Nous ne faisons que commencer. Une feuille de route de fonctionnalités nous réjouit d'avance et nous publierons davantage à mesure que les choses prennent forme.

Si vous avez des questions, souhaitez partager des commentaires, ou simplement envie de parler terminologie — contactez-nous. Vous pouvez nous trouver sur la [communauté Zulip de Health Samurai](https://connect.health-samurai.io/) ou via notre [page de contact](/contacts).

---

*Modification (mai 2026) : Certains détails sur les licences dans cet article ont été mis à jour pour refléter l'information actuelle.*