Our Approach Technology Portable Record Connectivity Privacy AI Pipeline Get Started

SMS as Portable Health Record

One SMS. Complete health history. No internet required.

The Problem

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.

The solution: After every visit, the patient receives an encrypted SMS containing their complete significant health history — chronic conditions, all abnormal results, allergies, and the latest visit. Store only the latest SMS. That's the entire portable health record.

End-to-End Flow

How a spoken consultation becomes a portable health record

1

Record

Clinician speaks naturally during the consultation

Raw Audio Transcript

"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..."

2

Extract

On-device AI identifies clinical entities from the transcript

Structured Clinical Data
DxI10 — Essential Hypertension
Dx 2E11.9 — Type 2 Diabetes
BP148/94 mmHg
Temp36.9°C
Rx 1Amlodipine 10mg OD
Rx 2Metformin 850mg BD
Rx 3HCTZ 12.5mg OD
AllergyPenicillin, NSAID, Sulfa
3

Aggregate

Combine current visit with all prior health history

Accumulated Health Summary
Visits7 total across 4 clinics
ChronicHypertension (5/7 visits), T2DM (3/7 visits)
AbnormalBP 148/94 (today), Temp 38.7°C (Dec 2025)
AllergiesPenicillin + NSAID + Sulfa (cumulative)
Every new SMS replaces the old one — always contains the complete picture.
4

Encode

Compress entire health record into 92 bytes of binary

92-Byte Binary Payload
Current visit (27B) Chronic conditions Abnormal vitals Notes + CRC
33:1 compression ratio vs. equivalent JSON
5

Encrypt

AES-256-GCM encryption using patient's phone number as key

Encryption Pipeline
92 bytes PBKDF2 (100K iter) AES-256-GCM 120 bytes
KeyPatient phone number (+ optional PIN)
Nonce12-byte random IV
Auth16-byte GCM authentication tag
6

Deliver

Base64 encode and send as a single standard SMS

From: ChartLite
Loading...
160 chars · 1 SMS
One SMS. Complete health record.
The patient keeps only the latest SMS. Any clinician, at any clinic, can decrypt it with just the patient's phone number — no internet, no server, no paper.

What's Inside Each SMS

1
Latest visit (full detail)
5
Chronic conditions max
5
Abnormal vitals max
255
Total visits tracked

Current Visit

  • Date, provider, facility
  • Up to 3 diagnoses (ICD-10)
  • Up to 3 medications with dose + frequency
  • Vitals: BP, temperature, pulse, weight
  • Current allergy flags
  • Follow-up instructions

Accumulated Health History

  • Chronic conditions — diagnoses seen in 2+ visits
  • All abnormal vitals — most recent per type, with dates
  • Cumulative allergies — union across every visit
  • Total visit count — full care history length

Recovery: Any Clinic, Any Time

Patient shows SMS
on their phone
Clinician enters
patient phone number
PBKDF2 derives key
100K iterations
AES-256-GCM decrypt
Complete health record
No internet. No server. No paper. The patient's phone IS the health record. The phone number is the key. Any clinician, at any clinic, can recover the full picture in seconds.

How Does the SMS Reach the Provider?

The encrypted SMS lives on the patient's phone. When they visit a new clinic, there are several ways to transfer it:

Transfer Methods

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

What About Same-Facility Visits?

SMS decryption is not needed within the same facility. All patient data is already in the local encrypted database (SQLCipher). The SMS is only needed at new clinics that have never seen this patient before.

SIM Swap / Lost Number?

  • The original clinic keeps a full copy in the local encrypted database — the SMS is only for portability
  • If a patient gets a new number, they revisit their clinic to get a fresh SMS encrypted with the new number
  • The patient's phone number on file is updated at registration

Encryption: Practical Security

The encryption key is the patient's phone number — something they always know, no memorization required.

Default: Phone Number

  • The SMS is encrypted using the patient's phone number as the key
  • The clinician asks "what is your phone number?" — a natural question at any clinic
  • No PIN to remember, no National ID required
  • Works in every country, with every patient
  • Already a massive upgrade over paper records (which have zero encryption)
Think of it like paper records. Paper records are completely unprotected — anyone can read them. Phone-number-encrypted SMS is protected against casual access while remaining practical for clinic use.

Shared Phones? Optional PIN

For patients who share a phone with family, ChartLite supports an optional 4-digit PIN chosen by the patient. The encryption key becomes phoneNumber:PIN — even family members who know the number can't decrypt without the PIN.
  • No PIN (default) — phone number alone. Zero friction, protects against strangers
  • With PIN — patient chooses a 4-digit PIN at registration. Protects privacy between family members
  • PIN is optional and patient-initiated, never forced
  • Clinician asks: "What's your phone number?" then "Did you set a PIN?"

Enhanced: National ID + PIN

For countries requiring stronger consent (e.g., South Africa with National IDs), a third mode uses National ID + PIN. Configurable per country deployment.
AO

Amara Okafor

Female, 52 · Phone: 072 123 4567 · Patient ID: KFMT-4WRN

Known penicillin allergy · Lives in rural Limpopo, visits multiple clinics

Visit Timeline

Step through each visit to see the SMS health record build up

SMS on Amara's Phone

From: ChartLite Clinic
No visits yet. Click "Next Visit" to begin Amara's story.

What a Clinician Sees After Decrypting

No data yet. Step through visits to build the health record.

Live Recovery Demo

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

Encrypted SMS (on Amara's phone)

From: Tzaneen PHC · 18 Feb 2026
18/02/2026 14:32 · 160 chars · 1 SMS · Encrypted

Binary Wire Format (92 bytes — fits in 1 SMS)

Each colored cell = one byte. Hover to see the field. This is what travels inside the encrypted SMS.

Version (0x02 = V2, 0x03 = V3 with patient ID)
Current Encounter (27 bytes)
History Header (3 bytes)
Chronic Conditions (up to 10 bytes)
Abnormal Vitals (up to 20 bytes)
Free Text Note
CRC-8
Hover over a byte to see its purpose.

Encounter Section (Bytes 1–27)

BytesFieldEncoding
1-2DateDays since 2024-01-01
3-5Provider + Facility12-bit hash each
6-9 (v1-v2) / 6-13 (v3)Patient IDPatient ID — 8 ASCII bytes (v3) / SHA-256 hash (v1-v2)
10FlagsnumDx(2) | numMeds(2) | urgency(2) | followUp(2)
11-14Diagnoses3 × 9-bit ICD-10 hash
15-20Medications3 × 16-bit (drug+dose+freq)
21-25VitalsOffset-encoded BP/temp/weight/pulse
26Allergy flags8-bit bitmap
27Follow-upDays / weeks / months

Health History Section (Bytes 28+)

BytesFieldEncoding
28History flagsnumChronic(3) | numAbnormal(3) | reserved(2)
29Cumulative allergiesUnion of ALL visits
30Total visits0–255
31+Chronic conditions2 bytes: ICD hash(9) + count(7)
NextAbnormal vitals4 bytes: date(2) + type(1) + value(1)
RestFree-text noteASCII, zero-padded
LastCRC-8MAXIM 0x31

Encryption Pipeline

92 bytes binary
PBKDF2
Phone number
100K iterations
AES-256-GCM
12-byte nonce
16-byte auth tag
Base64
~160 chars
1 SMS
92
Bytes (binary payload)
120
Bytes (after encryption)
160
Chars (Base64) — 1 SMS
33:1
Compression vs JSON