One SMS. Complete health history. No internet required.
In rural sub-Saharan Africa, patients visit multiple clinics with no shared EMR. Paper records get lost. There's no internet for cloud sync. But nearly every patient has a basic phone that can receive SMS.
How a spoken consultation becomes a portable health record
Clinician speaks naturally during the consultation
"Patient complains of persistent headache for three days. Blood pressure is one forty-eight over ninety-four. Continue amlodipine at ten milligrams once daily and add hydrochlorothiazide twelve point five. She is allergic to penicillin, NSAIDs, and sulfa drugs..."
On-device AI identifies clinical entities from the transcript
Combine current visit with all prior health history
Compress entire health record into 92 bytes of binary
AES-256-GCM encryption using patient's phone number as key
Base64 encode and send as a single standard SMS
The encrypted SMS lives on the patient's phone. When they visit a new clinic, there are several ways to transfer it:
| 1. | Forward SMS — Patient forwards the encrypted SMS to the clinic's phone number. ChartLite auto-detects it from the inbox |
| 2. | Same device — If the clinic phone is also running ChartLite, the SMS is already in the inbox — just select it in the "Recover SMS" screen |
The encryption key is the patient's phone number — something they always know, no memorization required.
phoneNumber:PIN — even family members who know the number can't decrypt without the PIN.
Female, 52 · Phone: 072 123 4567 · Patient ID: KFMT-4WRN
Known penicillin allergy · Lives in rural Limpopo, visits multiple clinics
Step through each visit to see the SMS health record build up
No data yet. Step through visits to build the health record.
Amara Okafor walks into Polokwane District Hospital — a clinic she has never visited before. She has no paper records. But she has one SMS on her phone from her last visit at a rural clinic 3 weeks ago.
The clinician copies the encrypted SMS into ChartLite and asks Amara for her phone number. Try it:
Demo phone number pre-filled: 0721234567 · Try a wrong number to see decryption fail
Each colored cell = one byte. Hover to see the field. This is what travels inside the encrypted SMS.
| Bytes | Field | Encoding |
|---|---|---|
| 0 | Version | 0x04 (V4) |
| 1-2 | Date | Days since 2024-01-01 (uint16) |
| 3-5 | Provider + Facility | 12-bit hash each |
| 6-13 | Patient ID | 8 ASCII bytes, zero-padded |
| 14 | Flags | numDx(2) | numMeds(2) | urgency(2) | followUpType(2) |
| 15-18 | Diagnoses | 3 × 9-bit ICD-10 hash, bit-packed (4 bytes) |
| 19-24 | Medications | 3 × 16-bit (drug+dose+freq) |
| 25-31 | Vitals (expanded) | systolic, diastolic, temp, weight, pulse, height, SpO2|RR packed |
| 32 | Allergy flags | 8-bit bitmap |
| 33 | Follow-up value | Days / weeks / months |
| Bytes | Field | Encoding |
|---|---|---|
| 34 | History flags | numChronicDx(3) | numAbnormalVitals(3) | hasGrowth(1) | hasImmunizations(1) |
| 35 | Cumulative allergies | Union of ALL visits |
| 36 | Total visits | 0–255 |
| 37-46 | Chronic conditions | 5 × 2 bytes: icd10Hash(9b) | occurrenceCount(7b) |
| 47-58 | Abnormal vitals | 3 × 4 bytes: date(2) + vitalType(1) + rawValue(1) |
| 59-62 | Growth summary | weight(1) + height(1) + weightZ×10(int8) + heightZ×10(int8) |
| 63 | Immunization header | numVaccines(3b) | reserved(5b) |
| 64-69 | Immunizations | 3 × 2 bytes: vaccineIndex(8b) + doseNumber(4b)|reserved(4b) |
| 70 | Clinical status 1 | HIV, TB, pregnancy, syphilis, HepB, malaria |
| 71 | Clinical status 2 | anemia, blood group, glucose, proteinuria, sickle cell, malnutrition |
| Bytes | Field | Encoding |
|---|---|---|
| 72-90 | Free-text note | 19 ASCII bytes, zero-padded |
| 91 | CRC-8 | CRC-8/MAXIM polynomial 0x31 |