The FHIR terminology server for SNOMED CT, LOINC, ICD and every other code system, in one binary.
Health records are full of codes. A diagnosis is a SNOMED CT or ICD code, a lab result a LOINC code, a medicine a code from a national drug database. These code systems (the shared lists of medical terms) are what let two systems agree that they mean the same thing. Every application that records or exchanges clinical data needs to look codes up, check them and search them.
FerroTERM answers those questions for every application at once. It loads the code systems you are licensed for and serves them over FHIR, the standard interface health software uses for terminology: look up a code, check that a code belongs to a list, find every narrower term, translate a code from one system to another. It runs as one program, with no database or search engine to operate beside it.
- Hospitals and national eHealth programmes that need one terminology service for all their applications.
- Software vendors and integrators that need SNOMED CT, LOINC or ICD in their products without running a heavy terminology stack.
- Terminology teams that edit and publish value sets (curated lists of codes) in the console.
Every release is signed and comes with a software bill of materials (the list of every component inside) and SLSA build provenance, so you can check that what you install is what was built here. The source is public, and every feature is in this repository: there is no paid edition with extra functions. The conformance badges come from the HL7 terminology test suite, run against every change, with a committed pass list per FHIR version, so you can check a result against the standard yourself.
FerroTERM is one of five FerroHEALTH servers. Each does one job and reaches the others only over published standards: FerroEHR stores the record, FerroBRIDGE translates it to FHIR and the OMOP research model, FerroFED connects records across organisations and borders, FerroPIX matches patient identities, and FerroTERM serves the code systems. Any FHIR client can use FerroTERM, not only the FerroHEALTH products. Sign-in, the audit trail and the web consoles come from three shared libraries: FerroAUTH, FerroAUDIT and FerroUI.
The image serves UCUM, BCP 47, BCP 13 and ISO 3166-1 with no configuration, so the first call needs nothing beyond Docker:
docker run --rm -p 8080:8080 ghcr.io/ferrohealth/ferroterm:0.4.1In a second terminal, look up a unit of measure:
curl 'http://localhost:8080/r4b/CodeSystem/$lookup?system=http://unitsofmeasure.org&code=mg/dL'A clinical code system such as SNOMED CT is a release you hold a licence
for. ferroterm-build, in the same image, turns it into an index once, and
the server reads that index at startup.
Install and run and
loading code systems
continue from here.
SNOMED CT, LOINC, UCUM, BCP 47, BCP 13, ISO 3166-1, ICD-10 (WHO), ICD-10-NL,
ICD-10-CM, ICD-11 MMS, ICD-11 ICF, ICD-11 Foundation, ATC/DDD, ICPC-2, RxNorm,
the DHD Diagnosethesaurus and Verrichtingenthesaurus, the G-Standaard, the
Nederlandse Labcodeset, the NHG ICPC-1 to SNOMED CT map, and any FHIR
CodeSystem, ValueSet, and ConceptMap resources (HL7 Terminology's 900+
systems load this way).
The code systems page lists, per system, the versions handled, the build command and the licence position. You bring the release you are licensed for; UCUM and the registries are built in.
- The FHIR terminology API:
$lookup,$validate-code,$subsumes,$expand,$translateand$closure - FHIR R4, R4B, R5 and the R6 ballot, each in its own version's shapes, in JSON and XML
- Value sets, implicit value sets and ECL, the SNOMED CT expression language
- Stored value sets, code systems and concept maps with history, when you name a database
- The console: browse, look up, expand and translate, and compose value sets
- Syncing from a national terminology service, one way into a running server
- Health, metrics and request identifiers, and hardware sizing
- Verifiable releases: images for amd64 and arm64 and release binaries, signed, with a software bill of materials
- The SNOMED CT, LOINC, ICD, RxNorm and Dutch release readers and the terminology engine, published as Rust crates (listed below)
Speed and footprint, measured per code system
| Code system | Release | Concepts | Build | Peak build memory | Index on disk | Resident | $lookup |
$validate-code |
$subsumes |
$expand (small) |
$expand (large) |
Search | Snowstorm |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ICD-10-CM | 2026 | 98,827 | 1.51 s | 359 MB | 44 MB | 91 MB | 105 µs | 60 µs | 58 µs | n/a | n/a | n/a | not run |
| ICD-10-NL | 2021 | 42,769 | 880.52 ms | 221 MB | 21 MB | 66 MB | 96 µs | 60 µs | 64 µs | n/a | n/a | n/a | not run |
| ICD-11 MMS | 2026-01 | 37,211 | n/a | n/a | 44 MB | 99 MB | 138 µs | 59 µs | n/a | 129 µs | 116 µs | 139 µs | not run |
| LOINC | 2.83 | 257,266 | 8.15 s | 2.54 GB | 310 MB | 440 MB | 136 µs | 56 µs | n/a | 126 µs | 7.23 ms | 283 µs | not run |
| RxNorm (prescribable subset) | 09082026 | 81,468 | 4.58 s | 667 MB | 77 MB | 133 MB | 388 µs | 114 µs | n/a | n/a | n/a | n/a | not run |
| SNOMED CT (International edition) | 20260901 | 535,502 | 14.12 s | 3.06 GB | 559 MB | 943 MB | 217 µs | 66 µs | 59 µs | 215 µs | 1.7 ms | 353 µs | not run |
| SNOMED CT (Netherlands edition) | 20260630 | 548,949 | 17.66 s | 3.88 GB | 864 MB | 1.14 GB | 222 µs | 66 µs | 59 µs | 285 µs | 2.28 ms | 817 µs | not run |
Warm p50 over 200 HTTP round trips on one machine (Apple M2, 17.18 GB, macos/aarch64), FerroTERM 0.1.4 serving FHIR R4B, taken 2026-09-22. The records are under bench/records/; the benchmarks page has the method, the cold and tail latencies, and how to reproduce a record.
Published crates (14)
| Crate | What it does | Version | Docs | Downloads |
|---|---|---|---|---|
rf2 |
The SNOMED CT RF2 release loader and typed component model (Apache-2.0) | |||
concept-graph |
The SNOMED CT ontology as CSR adjacency and roaring transitive-closure bitmaps | |||
concept-store |
The disk-backed columnar concept and description store | |||
designation-index |
The fst and roaring description search index | |||
sct-ecl |
The SNOMED CT Expression Constraint Language lexer, parser and evaluator | |||
sct-scg |
The SNOMED CT Compositional Grammar lexer, parser and printer | |||
loinc |
The LOINC release loader and typed row model | |||
classification |
The ClaML and ICD-10-CM tabular readers into one classification model | |||
dhd-thesaurus |
The DHD Diagnosethesaurus and Verrichtingenthesaurus reader | |||
gstandaard |
The G-Standaard (Z-Index) product ladder reader | |||
labcodeset |
The Nederlandse Labcodeset publication reader | |||
icd11 |
ICD-11 entities from the WHO ICD-API local deployment, cached and read | |||
rxnorm-rrf |
The RxNorm Rich Release Format reader and typed row model | |||
fhir-terminology |
The FHIR terminology operations over the code system provider seam |
- Documentation and the FerroHEALTH book
- What FerroTERM is, architecture at a glance and how it compares
- Conformance and benchmarks
- Changelog and milestones
- Security policy
- Contributing, code of conduct, support, governance, maintainers and the AI statement
Business Source License 1.1 (LICENSE), with Apache License 2.0 as
the Change License four years after each version; the rf2 crate is
Apache-2.0 today. The code systems keep their own licences, and the
licensing page says
when you need a commercial licence from Cadasto B.V.
