Contact
← Invariance / Portfolio
Client projectDolomiti Sportclinic · Healthcare · 2026

Describe the diagnosis. The ICD-10 code comes back.

Dolomiti Sportclinic codes its diagnoses in ICD-9 and is preparing for ICD-10. We built a catalogue of every ICD-10-CM code that answers plain questions in Italian, German or English, turns the clinic's old ICD-9 codes into their new counterparts, and works inside the clinic's records system as a browser extension.

The catalogue answering a question about a torn medial meniscus, next to the browser extension answering a search for knee arthrosis

The catalogue answering a question about a torn medial meniscus, next to the browser extension answering a search for knee arthrosis

The catalogue and its extension. The website opens every form of a condition; the popup searches the same codes from anywhere in the browser.

Role
Data pipeline · Search · Website · Browser extension · Print
Languages
Italian · German · English
Status
In clinical review

Introduction

74,879 codes are too many to look up by hand.

ICD-10-CM records what ICD-9 never did: the side, the encounter, whether an injury is new or old. That precision is what makes the right code hard to find. The clinic's doctors think in their own words and in the ICD-9 codes of a 2015 pocket book on orthopaedics and trauma. The catalogue starts there: a question in plain words, or an old code, returns the new one.

74,879

diagnosis codes, each with its title in Italian, German and English

129/129

reference questions answered with the expected code

14,143

ICD-9 codes that lead straight to their ICD-10 counterparts

Demonstration

Ask it the way you would ask a colleague.

Write the diagnosis as you would say it, in any of the three languages. The answer names the code with its side and encounter, and opens every related form of the condition. Choose a question below.

Try

Diagnoses

ICD-10-CM
  1. S83.241AOther tear of medial meniscus, current injury, right knee, initial encountercurrenttraumaticright
EncounterA initial encounterD subsequent encounterS sequela
  • S83.241ACurrent · right: Other tear of medial meniscus, current injury, right knee, initial encounter
  • S83.242ACurrent · left: Other tear of medial meniscus, current injury, left knee, initial encounter
  • S83.249ACurrent · unspecified side: Other tear of medial meniscus, current injury, unspecified knee, initial encounter
  • M23.203Old · right: Derangement of unspecified medial meniscus due to old tear or injury, right knee
  • M23.303Degenerative · right: Other meniscus derangements, unspecified medial meniscus, right knee

All variants (38)

Answers recorded from the live catalogue on 25 September 2026. The real one takes a few seconds; this replay is shorter.

The website

One field for every code.

The page is one question field over the 22 chapters of ICD-10-CM. Each title shows in the reader's language with the official English beneath it, and the interface switches between Italian, German and English.

An answer about a torn medial meniscus, opened to show the recent, old and degenerative forms

An answer about a torn medial meniscus, opened to show the recent, old and degenerative forms

Clicking a code opens the condition's other forms: the recent tear on either side, the old one and the degenerative one. The encounter is chosen once, above them.

The question “artrosi 715.16 destra” answered with M17.11 and labelled as the approximate match of ICD-9 code 715.16

The question “artrosi 715.16 destra” answered with M17.11 and labelled as the approximate match of ICD-9 code 715.16

An old ICD-9 code inside a question is answered from the official correspondence tables, labelled exact or approximate, on the side the question names.

The German interface answering a question about a torn anterior cruciate ligament of the right knee

The German interface answering a question about a torn anterior cruciate ligament of the right knee

The same page in German. The official English title always stays beneath.

The catalogue's start page: the question field above the ICD-10-CM chapters in Italian with English beneath

The catalogue's start page: the question field above the ICD-10-CM chapters in Italian with English beneath

Without a question the page lists the chapters. Each opens its sections and codes.

The catalogue on a phone answering a question about a fracture of the distal radius

The catalogue on a phone answering a question about a fracture of the distal radius

On a phone it is the same single field.

In the records system

The code goes where the doctor already writes.

The clinic documents in a web-based clinical system that cannot be changed. The extension adds an ICD-10 field to its diagnosis form and to the case report, and one click places the code and its title in the report's diagnosis text. Saving stays with the doctor.

The case report with the ICD-10 field answering “rottura cuffia dei rotatori” with rotator cuff codes for each side

The case report with the ICD-10 field answering “rottura cuffia dei rotatori” with rotator cuff codes for each side

In the case report the field takes a phrase and answers with the codes for each side.

The extension's popup answering a search for knee arthrosis

The extension's popup answering a search for knee arthrosis

The popup searches the same diagnoses and procedures from anywhere in the browser.

The diagnosis form with the extension's ICD-10 field offering the match for ICD-9 code 715.16 and further suggestions

The diagnosis form with the extension's ICD-10 field offering the match for ICD-9 code 715.16 and further suggestions

On the diagnosis form the field reads the ICD-9 code already chosen and offers its ICD-10 match first, then further suggestions.

The case report after the click: the date, the code and its title added to the diagnosis text

The case report after the click: the date, the code and its title added to the diagnosis text

One click adds the date, the code and its title to the report's diagnosis text.

Shown on a stand-in for the clinical system with sample text. No patient data.

On paper

The same data, printed.

Two PDFs come out of the same build as the website: the complete catalogue in 3,159 pages with every coding instruction, and a short edition in 1,052 pages with codes and titles in two columns. Print and screen always agree, because neither has its own copy of the data.

The cover of the complete PDF

The cover of the complete PDF

The complete edition: every code, every coding instruction, the pocket book and the indexes.

A page of the complete PDF listing the meniscus tear codes

A page of the complete PDF listing the meniscus tear codes

Injury codes appear once, without the 7th character; the character table heads each category.

A page of the short PDF with codes and titles in two columns

A page of the short PDF with codes and titles in two columns

The short edition: codes and titles only, in two columns.

Technology

A small stack for a large catalogue.

One pipeline turns the official files into a static website, a small answer server, a browser extension and two PDFs.

Static website

Next.js

The React framework we build product surfaces on: routing, server rendering and the production build come from one toolchain. Pages are rendered on the server, so the first paint is real content rather than an empty shell.

Pipeline, site and server

TypeScript

JavaScript with a type system on top. It catches mismatched data at build time — the class of bug that otherwise reaches a user as a blank screen — and it makes a large codebase safe to change years later.

Interface

React

The interface library the whole front end is written in. State drives what is on screen, so complex flows stay predictable instead of becoming a pile of manual DOM updates.

Answer server

Node.js

The JavaScript runtime the server side runs on. One language across client and server means shared validation and types instead of two implementations of the same rule.

Pick and judge models

OpenAI

The language and speech models doing the actual work: transcription, correction and translation. They are reached over an API under a contract, so nothing depends on a model running on clinic hardware.

Manifest V3 extension

Google Chrome

The browser the clinic works in, and the extension platform the plugins are built for. Manifest V3 keeps them to narrowly scoped permissions on exactly the pages they are needed on.

Reproducible build

Docker

The application and everything it needs are packaged into one image, so the version tested is bit-for-bit the version that runs in production. Deployment stops depending on what happens to be installed on a server.

Architecture

From the official files to an answer.

Nothing in the catalogue is typed in by hand. Every code comes from the official files, and every answer is checked against them.

  1. 01

    Import

    The published ICD-10-CM files are read as they are: 98,722 rows, none dropped, each keeping the file and row it came from.

  2. 02

    Translate

    Every official title gets an Italian and a German version. They stay marked as machine translations until a clinician has reviewed them.

  3. 03

    Pick, then judge

    A language model reads the full index of categories and names the likely ones. A second pass checks their codes against the official titles and keeps at most five, and any code that contradicts the question's side, timing or cause is dropped.

  4. 04

    Bridge the old codes

    ICD-9 codes are answered from the official correspondence tables of the U.S. health authorities, carried forward to the current release.

  5. 05

    Build once

    The website, the extension and both PDFs come from one build, so a code reads the same on screen, in the records system and on paper.

Legal

No patient data, by design.

A code catalogue has no reason to know who the patient is, so it never asks.

No accounts, no database

The catalogue runs without logins, analytics or a database. There is nothing to breach and nothing to delete.

Questions stay out of logs

A question goes to the model with storage turned off. The server keeps no log; it only remembers recent answers in memory, so a repeated question is answered at once.

Public-domain codes

ICD-10-CM is published by the U.S. government and is in the public domain. The translations are ours.

The doctor decides

The catalogue suggests and the doctor chooses. The extension only fills in what the doctor clicks, and saving stays with the doctor.

Result

Every diagnosis code in the clinic's three languages, one question away.

The catalogue is live for the clinic's review, the extension works inside its records system, and both PDFs print from the same data. A clinician's sign-off on the translations and the old-code links is the last step before daily use.

Book a call