Mama Salama placed first at Pitch II

Where this stands
Six judges scored ten teams on the same six criteria out of 100, and the totals were averaged into one result per team. Mama Salama finished first with 77.67, top of the five teams going through to the Grand Finale.
The finale is Thursday 12 November 2026, 11:00 to 12:30 EAT, at the 6th Tanzania Digital Health and Innovation Forum, Session 2, Track 2A, MUHAS.
What it is
Mama Salama, "Safe Mother", is a Swahili phone app for the first three to four weeks after delivery. The user is the mother herself, at home.
It is not a diagnosis tool. It returns one of three actions and nothing else:
- Go to a facility now
- Go today
- Watch at home

Why it exists
| Figure | Tanzania, TDHS 2022 |
|---|---|
| 104 | maternal deaths per 100,000 live births |
| 24 | neonatal deaths per 1,000 |
| 53% | of rural mothers get no postnatal check in the first 48 hours |
| 91% | leave the facility within two days of a vaginal birth |
| 2 in 3 | were never told what dangerous bleeding looks like |
| 1 in 3 | live an hour or more from the nearest facility, most without transport |
The dangerous window is the window where nobody is watching.
How it works
The architecture is two tiers.
Tier 1 is deterministic. A knowledge graph, authored in Neo4j, holds the entire decision. A phrase means a symptom, a symptom triggers an action, and the action with the highest priority wins. One traversal. No model runs anywhere in that path. The phone carries a flattened export of that graph, two flat tables, so there is no graph database and no server on the device.
Tier 2 is the language model, with two jobs, both at the edges. It maps Swahili free
text to a symptom code that already exists in the graph, and it renders the stored message
in more natural words. If it returns anything the graph does not recognise, the result is
UNKNOWN, which deterministically routes to "go today". It cannot return nothing, and it
cannot return a decision.

The rules underneath the split:
- The model never produces a value that can cause harm. Numbers and decisions live on graph nodes.
- Safety-critical input goes through structured UI, not free text extraction.
- Confirmation screens are rendered from code, never from the model.
- Uncertainty is inferred deterministically, from input that is missing, out of range or unmapped. The model's own confidence is never trusted.
- Refuse and refer is the fallback. There is no path that returns no action.
- Valid JSON shape is not valid content. An early test with schema-constrained output returned perfectly valid JSON that had dropped a required field and invented a weight of 1000 kg.
What it runs on
Sartify's Swahili-tuned MiniLM, converted to TensorFlow Lite and quantised to int8.
| Measured on the test handset | |
|---|---|
| 22.7M | parameters |
| 190 ms | per clause |
| 473 ms | to load the model |
| 21.8 MB | model |
| 2.9 MB | app |
| 0 | Android permissions, and no internet permission declared |
There are two build flavours. The fallback flavour compiles no model runtime at all.
What broke
A 1B model crashed on the phone. Gemma 3 1B int4 loaded in 25 seconds, reported a successful load, then died with a native abort the moment inference was requested. The cause was address space in a 32-bit process, not free RAM, so more memory would not necessarily have fixed it. The abort is native, so no defensive code catches it.
The documented replacement shipped 64-bit only. Google's localagents-rag archive, the documented route to EmbeddingGemma on Android, contains arm64 binaries and nothing else. We found that by unpacking it and listing the native libraries.
Splitting Swahili on "and" broke single complaints. "Na" means "and" but it also means "with", and it sits inside ordinary complaints. "Mwili wangu unaungua na joto" is one way of saying fever, and split it produced two fragments that both fell below the match floor. But "nina homa kali na damu inatoka sana" is two emergencies in one sentence. We now judge the whole utterance and each clause, and union the results.
A matcher that can only name a danger sign will name one. A mother typing "nipo salama", I am safe, was told she was having convulsions. Six of nine ways of saying "I am fine" fired a danger sign. A higher similarity threshold does not fix it, because "mtoto yuko salama", the baby is fine, scored higher against fast breathing than a genuine typo scored against its real match. We added an explicit not a sign class for the matcher to land on.
Nothing in it understood "not". Similarity matching treats a denied symptom exactly like a reported one. Negation cues now turn a denied sign into a question rather than an action. And when the matcher clears its floor but cannot pick a winner, it shows the mother the two or three signs it was torn between, in the wording a clinician approved, and asks her. Choosing one adds that code and the graph decides. Choosing none changes nothing.
| Probe | Before | After |
|---|---|---|
| Held-out sentences | 11 false alarms, 7 of them "go now" | 0, with no new misses |
| 66 negated danger signs | all 66 fired | 0 fired, 66 questions |
The team
Mhina Seuta Lukurunge, Julias Rafael Temu, Michael Amerty Kashahu and Diana Seraphine Lyimo from NM-AIST, MSc Data Science and AI, on engineering. Zainabu Hussein Jumanne and Modester Cosmas Kitula from MUHAS, BPharm, on clinical authoring and sign-off.
No engineer approves a clinical edge. That rule has been in the project contract since the first week.
Mentored by Adrian Johansson. Run by the Tanzania Ministry of Health with MUHAS, LM International, Capgemini, eGA, the Embassy of Switzerland in Tanzania and Mälardalens universitet, with Google and Neo4j as technology champions.
Comments
No comments yet — be the first.